Mybatis学习笔记(一)

MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。 MyBatis 摒除了大部分的 JDBC
代码、手工设置参数和结果集重获。 MyBatis 只使用简单的 XML 和注解来配置和映射基本数据类型、Map 接口和 POJO 到数据库记录。

SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 用于创建 SqlSessionFacoty, SqlSessionFacoty 一旦创建完成就不需要
SqlSessionFactoryBuilder 了 , 因 为 SqlSession 是 通 过 SqlSessionFactory 生 产 , 所 以 可 以 将
SqlSessionFactoryBuilder 当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量


SqlSessionFactory
SqlSessionFactory 是一个接口,接口中定义了 openSession 的不同重载方法, SqlSessionFactory 的
最 佳 使用 范围 是整 个应 用运 行期 间, 一旦 创建 后可 以重 复使 用, 通常 以单 例模 式管 理
SqlSessionFactory。
 

SqlSession 的使用分析
SqlSession 中封装了对数据库的操作,如:查询、插入、更新、删除等。
通过 SqlSessionFactory 创建 SqlSession,而 SqlSessionFactory 是通过 SqlSessionFactoryBuilder 进行创建
每个线程都应该有它自己的 SqlSession 实例。 SqlSession 的实例不能共享使用,它也是线程不安
全的。因此最佳的范围是请求或方法范围。绝对不能将 SqlSession 实例的引用放在一个类的静态字
段或实例字段中。打开一个 SqlSession;使用完毕就要关闭它。
 

Mybatis实现 DAO的传统开发方式(不常用不关注)
举例:

1、根据用户 id 查询一个用户信息
2、根据用户名称模糊查询用户信息列表
3、添加用户信息

配置userMapper.xml

<mapper namespace="UserDao"> 

<insert id="saveUser" useGeneratedKeys="true" keyProperty="id" parameterType="cn.itcast.entity.User">
<!--         <selectKey order="AFTER" resultType="java.lang.Integer" keyProperty="id">
            select last_insert_id();
        </selectKey> -->
        insert into user (username,sex,birthday,address) values ( #{username} ,#{sex},#{birthday},#{address} )
    </insert>

编写userDao的接口和实现类

public int save(User user) {
        //1.创建SqlSession对象
        SqlSession session = sessionFactory.openSession();
        //2.通过session保存用户
        /**
         * 第一个参数:mapperid
         * 第二个参数:用户对象
         */
        int result = session.insert("UserMapper.saveUser", user);
        
        //在保存用户之后,立即使用保存的用户的主键(id)
        System.out.println("保存的用户主键:"+user.getId());
        
        
        session.commit();
        //释放资源
        session.close();
        return result;
    }

在编写实现类中方法时,要注意所调用的 selectOne()的参数是由 namespace+id 一起来构成,但 namespace 和 id
的取值是我们自己去起名,不要求像我们前面通过 Mapper 代理方式一样,必须与包名和方法相同。

Mybatis 实现 DAO 代理开发方式


Mapper 接口开发需要遵循以下规范:
1、 Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同。
2、 Mapper 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同
3、 Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同
4、 Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同

原理实现

发现在调用 SqlSession 接口的 getMapper()方法时,它的底层进一步调用了 JDK 动态代理方式来生成代理子类对象的
 

Mybatis 的连接池技术

SqlMapConfig.xml 配置文件中, 通过 <dataSource type=”pooled”>来实现 Mybatis 中连接池的配置

UNPOOLED 不使用连接池的数据源
 POOLED 使用连接池的数据源
 JNDI 使用 JNDI 实现的数据源

Mybatis 中连接的获取
真正连接打开的时间点,只是在我们执行 SQL 语句时,才会进行
 Mybatis 的事务控制

Mybatis 框架因为是对 JDBC 的封装,所以 Mybatis 框架的事务控制方式,本身也是用 JDBC的 setAutoCommit()方法来设置事务提交方式的,在连接池中取出的连接,都会将调用 connection.setAutoCommit(false)方法
 


Mybatis 自动提交事务的设置

sqlSessionFactory.openSession(true)

Mybatis 的参数
传递 pojo 对象
Mybatis 使用 ognl 表达式解析对象字段的值, #{}或者${}括号中的值为 pojo 属性名称
Mybatis 的输出结果封装
resultType 可以指定 pojo 将查询结果映射为 pojo,但需要 pojo 的属性名和 sql 查询的列名一致
resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo


和 list 实现一对一查询和一对多查询。
动态 SQL 之<if>标签
<if>标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法
<where />可以自动处理第一个 and
<foreach>标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}

//注意事项
      //当传入的时一个List集合时,只能写collection:list(小写)
       //当传入的是一个对象是,要写集合在对象中的属性名称collection:ids
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符
<include refid="namespace.sql 片段”/>


Mybatis 延迟加载策略
要在 Mybatis 的配置文件 SqlMapConfig.xml 文件中添加延迟加载的配置
        或者直接在下面的属性中开启
            <settings>
                <setting name="LazyloadingEnabled" value="true"/>
            </settings> 
            <resuletMap id="" type="">
                <id  column=""  property=""/>
                <result column="" property="">
                
                <association property="" javaType="" select="调用的映射的id" column="填写要传递给 select 映射的字段 " fetchType="lazy">
                </association>
                <collection property="" oftype="" select="调用的映射的id" column="填写要传递给 select 映射的字段 " fetchType="lazy">
                </collection>
            </resuletMap>    

Mybatis 缓存
Mybatis 中缓存分为一级缓存,二级缓存
一级缓存是 SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就存在
当调用 SqlSession 的修改,添加,删除, commit(), close()等方法时,就会清空一级缓存
二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个 SqlSession
可以共用二级缓存,二级缓存是跨 SqlSession 的。

注意事项
         1.实体类对象需要实现序列化接口
            2.需要在核心配置文件中开启二级缓存
            <settings>
                <setting name="cacheEnabled" value="true"/>
            </settings>
            3.需要在mapper配置文件中开启使用二级缓存
                <cache />标签表示当前这个 mapper 映射将使用二级缓存,区分的标准就看 mapper 的 namespace 值
            4.需要在缓存的sql语句配置中配置使用二级缓存
                <select>标签中设置 useCache=”true
            5.操作的过程中需要提交之后才会存入到缓存中

Mybatis 注解开发
@Results:可以与@Result 一起使用,封装多个结果集 
            value={
                @Result(column=" ",property="",one=@One(select=""))
            }
        
         @Result 中 属性介绍: column 数据库的列名 Property 封装对象的属性名 javatype 封装对象.class
                                one  需要使用的@One 注解 many  需要使用的@Many 注解
                                @One:实现一对一结果集封装 
                                    属性select  指定用来多表查询的 sqlmapper
                                        fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。
                                @Many:实现一对多结果集封装 
                                        属性select  指定用来多表查询的 sqlmapper
                                        fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。
            注意:一对多时需要指定映射的 Java 实体类的属性,属性的 javaType(一般 为 ArrayList)但是注解中可以不定义

@SelectProvider: 实现动态 SQL映射 
                属性:type 查询语句的类字节码
                    method:对应的方法名称
                        注意事项:方法参数要一致


 

猜你喜欢

转载自blog.csdn.net/minecodelife/article/details/81102796