MyBatis

MyBatis

  1. MyBatis是一个优秀的基于java的持久层框架,内部封装了JDBC

  2. 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()"**)

  1. MyBatis的动态代理开发

四个相同:

  1. namespace应该与接口的类路径相同

  2. Mapper接口中的输入参数应该与parameterType相同

  3. Mapper接口的方法名与xml文件的id相同

  4. Mapper接口的输出参数与xml文件的resultType相同

  1. properties属性:

(1) 可引用外部文件

<properties resource=” ...”>

(2) 可在内部自行定义

<properties>

<property name=””  value=””>

</properties>
  1. typeAliases:

(1) <typeAlias alias=”别名” type=”全类名”>

(2) <package name=”该类的父包名”>

  1. mapper映射器

(1) 通过resource加载单个映射文件

(2) 以下两种加载模式只适合动态代理开发

① 通过mapper的接口类路径来加载单个文件,利用class

  1. 前提是mapper接口的名称与mapper映射文件的名称相同,且类路径应该相同,就是目录相同

②批量的加载映射文件

  1. 此方法要求mapper接口名称与mapper映射文件名称相同,且在 同一个目录下

2)<package name=”类全路径名称,指的是父包”>

此种方式在实际开发中用的是比较多的

  1. MyBatis的链接池技术

MyBatis 内部分别定义了实现了 java.sql.DataSource 接口的 UnpooledDataSource,PooledDataSource 类来表示UNPOOLED、POOLED 类型的数据源。

(1) 数据源分为3类

① Unpooled :不是用连接池的数据源,底层用的是connection链接

② Pooled:使用连接池的数据源

③ JNDI:使用JNDI实现的数据源

(2) 我们一般采用的是pooled数据源

(3) MyBatis是通过工厂模式来创建数据源DataSource对象的

  1. 获取连接是很珍贵的,在MyBatis中connection对象的建立一直延迟到执行SQL

语句的时候;可翻出源码然后打断点进行测试

  1. 事务

(1) 在MyBatis中调用事务的提交方式实质上是调用的JDBC的setAutoCommit()方法

(2) 在MyBatis中默认的是手动提交事务,但并不全是,其中只有在进行cud操作的时候需要进行提交事务

(3) 也可设置成自动提交事务

① 在opensession中设置为true就变为自动提交事务

  1. 动态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. 一对一查询

(1) 使用<association property=”pojo的属性名” javaType=”代表的是加载对象的java类型”>

  1. 一对多进行查询,一对多查询时,使用做外链接较为合适

(1)<collection property=”pojo对象中的属性名” ofType=”list中的对象类型”>

(2) 在进行sql语句的填写时,使用外连接查询,这样做的目的是为了让那些没必要的数据消失;

  1. 左外连接查询,以左边的表为基准,左边表中没有的右边的表中显示为null,主表有的,从表一定有,主表没有的从表一定没有

  2. 延迟加载策略

(1) 意义

① 需要什么数据时才会去加载,不要的数据就不加载

② 好处:大大的提高了数据库的性能,因为单表查询的速度要比多表查询的速度要快

③ 坏处:因为当需要数据时才进行数据库的查询,但是在进行大批量的数据查询的时候查询工作是需要消耗时间的,这可可能造成等待时间的加长,导致用户体验的下降;

  1. 使用延迟加载的步骤:

延迟加载就是加载完一个方法,如果需要才加载另一个方法

(1) 利用association做延迟加载:一对一时

<association property=”pojo中的属性” javaType=”所返回的参数类型” select=”所对应的执行下一个方法接口的全类名加上方法名” column=”执行下次查询所需要要传递的参数,指的是本pojo类中所得到的属性信息”>

② 在核心配置文件中添加setting信息,lazyLoadingEnable,value=true意思为开启延迟加载

(2) Collection是为一对多进行修改的

  1. MyBatis缓存

(1) 一级缓存

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

② 当执行上述的提交,删除,增加,修改等操作的时候会清空一级缓存,这样做的目的是为了让缓存中存储最新的信息,避免发生脏读

③ 当执行sqlSession.close()后,就会进行重新查询数据库

(2) 二级缓存

① 是mapper映射级别的缓存,多个sqlSession去操作同一个mapper映射的sql语句,多个sqlSession是可以共用二级缓存的,二级缓存是跨sqlSession的.

② 二级缓存执行步骤:

  1. <setting> 中设置cacheEnable,value=true

  2. <mapper>在设置<cache/>

  3. <select>中设置userCache=true

③ 针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁 用二级缓存。

④ 在使用二级缓存时必须先关闭sqlSession然后在进行重新的获取

⑤ 使用二级缓存pojo类必须实现序列化接口

  1. MyBatis的注解开发

(1) 一对一进行开发

@results({@result是为了在其中修改那些数据库字段名与pojo类的属性名不一样的})

② Column是数据库的字段名,property是指的是pojo对应的属性名

③ javaType=加载的属性的数据类型,在多对多中默认的是arrayList,可以不进行设置

④ One=@one(select=”执行下一个方法的接口全路径名+方法名” fechType=”fechType.lazy”)执行言辞加载策略

(2) @many一对多进行开发

① 聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType(一般为 ArrayList)但是注解中可以不定义;

  1. 注释中的注意事项

在@result中字段名与属性名一致的不需要进行标注,但是当一些属性需要重复使用的时候,那么就需要进行result进行注解,否则,提取出为null值

  1. 注释中的动态sql

(1) @selectProvider(type=”class文件” method=”重新定义的新类中的方法的名称”)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值