Mybatis学习(四)

# Mybatis学习(四)

Mybatis中的延迟加载

什么是延迟加载:

    在真正使用数据的时候才发起查询,不用的时候不查询,按需查询

什么是立即加载:

    不管用不用只要一调用方法,马上发起查询

一对一表中实现延迟查询

修改AccountDao.xml映射文件
<!-- 定义封装account和user的resultMap -->
    <resultMap id="accountUserMap" type="account">
        <id property="id" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--select属性指定的内容:查询用户的唯一标准-->
        <association property="user" column="uid" javaType="user" select="com.itcast.dao.UserDao.findById"></association>
    </resultMap>

    <!-- 查询所有 -->
    <select id="findAll" resultMap="accountUserMap">
        select * from account
    </select>
修改SqlMapConfig.xml映射文件
<!--设置采用延迟加载-->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>

一对多表中实现延迟查询

修改UserDao.xml映射文件
   <resultMap id="UserAccountMap" type="user">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
        <collection property="accounts" ofType="account" select="com.itcast.dao.AccountDao.finAccountByUid" column="id"></collection>
    </resultMap>
    <!--查询用户-->
    <select id="findAll" resultMap="UserAccountMap">
        select * from user
    </select>

    <!--根据id查询用户信息-->
    <select id="findById" parameterType="Integer" resultType="com.itcast.domain.User">
        select * from user where id = #{uid};
    </select>
在AccountDao中添加finAccountByUid方法
    /**
     * 根据用户id查询账户信息
     * @param uid
     * @return
     */
    List<Account> finAccountByUid(Integer uid);
在AccountDao.xml映射文件中添加finAccountByUid方法
    <select id="finAccountByUid" resultType="account">
        select * from account where uid = #{uid}
    </select>

Mybatis中的缓存

什么是缓存

    存在于内存中的临时数据

为什么使用缓存

    减少和数据库的交互次数,提高执行效率

什么样的数据能使用缓存:

    适用于缓存:
      经常查询并且不经常改变的
      数据的正确与否对最终的结果影响不大
    不适用于缓存:
      经常改变的数据
      数据正确与否对最终结果影响很大

一级缓存:

    一级缓存是存在于SqlSession范围内的缓存
    当调用SqlSession的修改,添加,删除,commit,close等方法时就会清空一级缓存

验证一级缓存的存在
关闭SqlSession
    @Test
    public void testFindById(){
        User user = userDao.findById(41);

        sqlSession.close();
        sqlSession = factory.openSession();

        userDao = sqlSession.getMapper(UserDao.class);
        User user2 = userDao.findById(41);

        System.out.println(user==user2);
    }
com.itcast.domain.User@462d5aee
2020-05-19 15:20:52,887 431    [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:20:52,887 431    [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:20:52,887 431    [           main] DEBUG source.pooled.PooledDataSource  - Returned connection 1121453612 to pool.
2020-05-19 15:20:52,887 431    [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Opening JDBC Connection
2020-05-19 15:20:52,887 431    [           main] DEBUG source.pooled.PooledDataSource  - Checked out connection 1121453612 from pool.
2020-05-19 15:20:52,887 431    [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:20:52,890 434    [           main] DEBUG om.itcast.dao.UserDao.findById  - ==>  Preparing: select * from user where id = ?; 
2020-05-19 15:20:52,891 435    [           main] DEBUG om.itcast.dao.UserDao.findById  - ==> Parameters: 41(Integer)
2020-05-19 15:20:52,892 436    [           main] DEBUG om.itcast.dao.UserDao.findById  - <==      Total: 1
com.itcast.domain.User@757942a1
false
2020-05-19 15:20:52,892 436    [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:20:52,893 437    [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:20:52,893 437    [           main] DEBUG source.pooled.PooledDataSource  - Returned connection 1121453612 to pool.

不关闭SqlSession
    @Test
    public void testFindById(){
        User user = userDao.findById(41);

        User user2 = userDao.findById(41);

        System.out.println(user==user2);
    }

2020-05-19 15:33:29,508 221    [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Opening JDBC Connection
2020-05-19 15:33:29,681 394    [           main] DEBUG source.pooled.PooledDataSource  - Created connection 1121453612.
2020-05-19 15:33:29,681 394    [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:33:29,682 395    [           main] DEBUG om.itcast.dao.UserDao.findById  - ==>  Preparing: select * from user where id = ?; 
2020-05-19 15:33:29,699 412    [           main] DEBUG om.itcast.dao.UserDao.findById  - ==> Parameters: 41(Integer)
2020-05-19 15:33:29,717 430    [           main] DEBUG om.itcast.dao.UserDao.findById  - <==      Total: 1
true
2020-05-19 15:33:29,718 431    [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:33:29,718 431    [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:33:29,718 431    [           main] DEBUG source.pooled.PooledDataSource  - Returned connection 1121453612 to pool.

清理缓存
        sqlSession.clearCache();

二级缓存

    它指的是Mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享其缓存

二级缓存使用步骤

    第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml配置):默认是支持的

    第二步:让当前的映射文件支持二级缓存(在UserDao.xml配置)

<!--开启user支持二级缓存-->
    <cache/>

    第三步:让当前操作支持二级缓存(在select标签中配置)

<!--根据id查询用户信息-->
    <select id="findById" parameterType="Integer" resultType="com.itcast.domain.User" useCache="true">
        select * from user where id = #{uid};
    </select>

Mybatis中的注解开发

注解CRUD开发

    /**
     * 查询所有用户
     * @return
     */
    @Select("select * from user")
    List<User> findAll();

    /**
     * 保存用户
     * @param user
     */
    @Insert("insert into user(username,address,sex,birthday) values(#{username},#{address},#{sex},#{birthday})")
    void saveUser(User user);

    /**
     * 更新用户
     * @param user
     */
    @Update("update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id = #{id}")
    void updateUser(User user);

    /**
     * 删除用户
     * @param userId
     */
    @Delete("delete from user where id = #{id}")
    void deleteUser(Integer userId);

    /**
     * 根据id查询用户
     * @param userId
     * @return
     */
    @Select("select * from user where id =#{id}")
    User findById(Integer userId);

    /**
     * 根据用户名模糊查询
     * @param username
     * @return
     */
    @Select("select * from user where username like '%${value}%'")
    List<User> findByName(String username);

    /**
     * 查询用户总数
     * @return
     */
    @Select("select count(*) from user")
    int findTotalUser();

注解开发结果集封装

    /**
     * 查询所有用户
     * @return
     */
    @Select("select * from user")
    @Results(id = "userMap",value = {
            @Result(id=true,column = "id",property = "userId"),
            @Result(column = "username",property = "userName"),
            @Result(column = "address",property = "userAddress"),
            @Result(column = "sex",property = "userSex"),
            @Result(column = "birthday",property = "userBirthday"),
          
    })
    List<User> findAll();

注解一对多开发

/**
     * 查询所有用户
     * @return
     */
    @Select("select * from user")
    @Results(id = "userMap",value = {
            @Result(id=true,column = "id",property = "userId"),
            @Result(column = "username",property = "userName"),
            @Result(column = "address",property = "userAddress"),
            @Result(column = "sex",property = "userSex"),
            @Result(column = "birthday",property = "userBirthday"),
            @Result(property = "accounts",column = "id",
                    many = @Many(select = "com.mybatis.dao.AccountDao.findAccountByUid",fetchType = FetchType.LAZY))
    })
    List<User> findAll();

注解开发开启二级缓存

//开启二级缓存
@CacheNamespace(blocking = true)
posted @ 2020-05-20 09:41  Dankon  阅读(140)  评论(0)    收藏  举报