MyBatis
-
MyBatis是一个优秀的基于java的持久层框架,内部封装了JDBC
-
MyBatis自增主键的返回
(1) 利用xml配置的形式:
在标签中添加
<selectkey keyProperty=”id” order=”after” resultType=””>
Select last_insert_Id()
</selectkey>
(2) 利用注解的形式进行设置:@selectkey(keyColumn = **"u_id"**,keyProperty = **"id"**,before = **false**,resultType = Integer.**class**,statement = **"select last_insert_id()"**)
- MyBatis的动态代理开发
四个相同:
-
namespace应该与接口的类路径相同
-
Mapper接口中的输入参数应该与parameterType相同
-
Mapper接口的方法名与xml文件的id相同
-
Mapper接口的输出参数与xml文件的resultType相同
- properties属性:
(1) 可引用外部文件
①<properties resource=” ...”>
(2) 可在内部自行定义
①
<properties>
<property name=”” value=””>
</properties>
- typeAliases:
(1) <typeAlias alias=”别名” type=”全类名”>
(2) <package name=”该类的父包名”>
- mapper映射器
(1) 通过resource加载单个映射文件
(2) 以下两种加载模式只适合动态代理开发
① 通过mapper的接口类路径来加载单个文件,利用class
- 前提是mapper接口的名称与mapper映射文件的名称相同,且类路径应该相同,就是目录相同
②批量的加载映射文件
- 此方法要求mapper接口名称与mapper映射文件名称相同,且在 同一个目录下
2)<package name=”类全路径名称,指的是父包”>
此种方式在实际开发中用的是比较多的
- MyBatis的链接池技术
MyBatis 内部分别定义了实现了 java.sql.DataSource 接口的 UnpooledDataSource,PooledDataSource 类来表示UNPOOLED、POOLED 类型的数据源。
(1) 数据源分为3类
① Unpooled :不是用连接池的数据源,底层用的是connection链接
② Pooled:使用连接池的数据源
③ JNDI:使用JNDI实现的数据源
(2) 我们一般采用的是pooled数据源
(3) MyBatis是通过工厂模式来创建数据源DataSource对象的
- 获取连接是很珍贵的,在MyBatis中connection对象的建立一直延迟到执行SQL
语句的时候;可翻出源码然后打断点进行测试
- 事务
(1) 在MyBatis中调用事务的提交方式实质上是调用的JDBC的setAutoCommit()方法
(2) 在MyBatis中默认的是手动提交事务,但并不全是,其中只有在进行cud操作的时候需要进行提交事务
(3) 也可设置成自动提交事务
① 在opensession中设置为true就变为自动提交事务
- 动态sql
(1) <if>
标签
① If标签中的test属性中写的是对象的属性名,如果使用的是包装类,那么就需要使用OGNL表达式的写法
(2)<where>
标签
① Where标签可以自动处理第一个and,但是只是在语句的开头,末尾的第一个and并不能进行自动处理
(3)<foreach>
标签
① 当我们进行范围查询时,也就是传入点的是一个数组或者集合的数据此时就需要用到此标签
② <foreach collection=”pojo对象中需要遍历的属性” open=”语句的开始部分” close=”语句的结束部分” item=”随便起的一个别名,表示当前集合中的每一个元素” separator=”分隔符”>
(4)<sql>
sql片段
① 在mapper中编写重复的sql语句<sql id=”定义唯一标识”>
② 在<select>
中使用<include refid=”上面定义的id”>
- 一对一查询
(1) 使用<association property=”pojo的属性名” javaType=”代表的是加载对象的java类型”>
- 一对多进行查询,一对多查询时,使用做外链接较为合适
(1)<collection property=”pojo对象中的属性名” ofType=”list中的对象类型”>
(2) 在进行sql语句的填写时,使用外连接查询,这样做的目的是为了让那些没必要的数据消失;
-
左外连接查询,以左边的表为基准,左边表中没有的右边的表中显示为null,主表有的,从表一定有,主表没有的从表一定没有
-
延迟加载策略
(1) 意义
① 需要什么数据时才会去加载,不要的数据就不加载
② 好处:大大的提高了数据库的性能,因为单表查询的速度要比多表查询的速度要快
③ 坏处:因为当需要数据时才进行数据库的查询,但是在进行大批量的数据查询的时候查询工作是需要消耗时间的,这可可能造成等待时间的加长,导致用户体验的下降;
- 使用延迟加载的步骤:
延迟加载就是加载完一个方法,如果需要才加载另一个方法
(1) 利用association做延迟加载:一对一时
① <association property=”pojo中的属性” javaType=”所返回的参数类型” select=”所对应的执行下一个方法接口的全类名加上方法名” column=”执行下次查询所需要要传递的参数,指的是本pojo类中所得到的属性信息”>
② 在核心配置文件中添加setting信息,lazyLoadingEnable,value=true意思为开启延迟加载
(2) Collection是为一对多进行修改的
- MyBatis缓存
(1) 一级缓存
① 一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。
② 当执行上述的提交,删除,增加,修改等操作的时候会清空一级缓存,这样做的目的是为了让缓存中存储最新的信息,避免发生脏读
③ 当执行sqlSession.close()后,就会进行重新查询数据库
(2) 二级缓存
① 是mapper映射级别的缓存,多个sqlSession去操作同一个mapper映射的sql语句,多个sqlSession是可以共用二级缓存的,二级缓存是跨sqlSession的.
② 二级缓存执行步骤:
-
<setting> 中设置cacheEnable,value=true
-
在
<mapper>
在设置<cache/>
-
在
<select>
中设置userCache=true
③ 针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁 用二级缓存。
④ 在使用二级缓存时必须先关闭sqlSession然后在进行重新的获取
⑤ 使用二级缓存pojo类必须实现序列化接口
- MyBatis的注解开发
(1) 一对一进行开发
① @results({@result是为了在其中修改那些数据库字段名与pojo类的属性名不一样的})
② Column是数据库的字段名,property是指的是pojo对应的属性名
③ javaType=加载的属性的数据类型,在多对多中默认的是arrayList,可以不进行设置
④ One=@one(select=”执行下一个方法的接口全路径名+方法名” fechType=”fechType.lazy”)执行言辞加载策略
(2) @many一对多进行开发
① 聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType(一般为 ArrayList)但是注解中可以不定义;
- 注释中的注意事项
在@result中字段名与属性名一致的不需要进行标注,但是当一些属性需要重复使用的时候,那么就需要进行result进行注解,否则,提取出为null值
- 注释中的动态sql
(1) @selectProvider(type=”class文件” method=”重新定义的新类中的方法的名称”)