Mybatis Spring
1、动态sql
trim:替代where set标签等
<select id="findEmpByTrim" parameterType="Emp" resultType="Emp">
<include refid="empSql"></include>
from emp
<trim prefix="where" prefixOverrides="and|or">
<if test="eName!=null">
and ename=#{eName}
</if>
<if test="addr!=null">
and addr=#{addr}
</if>
</trim>
</select>
<update id="updateEmpByTrim" parameterType="Emp">
update emp
<trim prefix="set" suffixOverrides=",">
<if test="eName!=null">
ename=#{eName},
</if>
<if test="job!=null">
job=#{job},
</if>
<if test="addr!=null">
addr=#{addr},
</if>
</trim>
where empno=#{empNo}
</update>
foreach迭代标签
如果参数是一个数组,使用foreach遍历数组
//批量删除
public int deleteEmpByBatch(String[] ary);
<!--批量删除-->
<delete id="deleteEmpByBatch">
delete from emp
where empno in
<foreach collection="array" open="(" separator="," close=")" item="ary">
#{ary}
</foreach>
</delete>
collection:参数的所属容器的类型:如果参数是数组array List集合—list Map集合—map
item:参数的名字
index: 索引
2、重点:mybatis缓存机制
目的:把查询存放起来,下次查询时,直接从存放的位置获取即可,提升查询效率
问题:数据容易过期
mybatis的缓存机制有两种:
一级缓存机制:默认的,session级别的缓存
原理:使用一个sqlsession查询时,把查到的结果用session缓存
如果session没有关闭,下次还执行同样sql查询,则直接返回session中缓存的数据
一级缓存失效的场景:提交事务,清空session缓存
关闭session,清空数据
flush(),清空缓存数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bWcSjgtU-1634362215716)(C:\Users\ASUS\Desktop\笔记\老师笔记\三阶段\day5\pic\image-20211015094739813.png)]
二级缓存:对查询结果进行序列化,跨session
要求:实体类支持可序列化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DFNbIgWa-1634362215720)(C:\Users\ASUS\Desktop\笔记\老师笔记\三阶段\day5\pic\image-20211015133456503.png)]
二级缓存的设置:
1、在mybatis-config.xml开启二级缓存,mybatis的所有查询可以使用了
<!--引入外部配置文件-->
<properties resource="db.properties"></properties>
<!--设置-->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<!--配置别名-->
<typeAliases>
<!--每一个类都需要一个如下的配置,麻烦-->
<!-- <typeAlias type="com.qf.mybatis2103.pojo.Emp" alias="Emp"></typeAlias>-->
<!--扫描指定的包,mapper文件中使用的类都在此包下-->
<package name="com.qf.mybatis2103.pojo"/>
</typeAliases>
2、在对应mapper文件中开启
<cache/>
【说明】此mapper中的所有查询都进行二级缓存
如果某个查询不使用二级缓存,直接查数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i3Y73kOZ-1634362215722)(C:\Users\ASUS\Desktop\笔记\老师笔记\三阶段\day5\pic\image-20211015134215934.png)]
测试代码
public class TestCache2 {
public static void main(String[] args) {
EmpDao empDao= MybatisUtil.getMapper(EmpDao.class);
//查询一次
List<Emp> list=empDao.findEmp();
for (Emp e: list
) {
System.out.println(e);
}
//提交事务为了关闭sqlSession
MybatisUtil.commitSession();
System.out.println("----------------------------------------------");
EmpDao empDao1= MybatisUtil.getMapper(EmpDao.class);
List<Emp> list1=empDao1.findEmp();
for (Emp e: list1
) {
System.out.println(e);
}
}
}
清空二级缓存:
package com.qf.mybatis2103.test.day5;
import com.qf.mybatis2103.dao.EmpDao;
import com.qf.mybatis2103.pojo.Emp;
import com.qf.mybatis2103.util.MybatisUtil;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestCache2 {
public static void main(String[] args) {
EmpDao empDao= MybatisUtil.getMapper(EmpDao.class);
//查询一次
List<Emp> list=empDao.findEmp();
for (Emp e: list
) {
System.out.println(e);
}
//关闭sqlSession,查询结果才被进行二级缓存
MybatisUtil.commitSession();
//数据变化
//数据删除后,提交事务
//只要数据有变化,且提交事务,二级缓存就删除
EmpDao empDao2=MybatisUtil.getMapper(EmpDao.class);
int result=empDao2.deleteEmpById("1003");
System.out.println("删除结果:"+(result==1));
MybatisUtil.commitSession();
System.out.println("----------------------------------------------");
EmpDao empDao1= MybatisUtil.getMapper(EmpDao.class);
List<Emp> list1=empDao1.findEmp();
for (Emp e: list1
) {
System.out.println(e);
}
}
}
3、Druid连接池配置
1、添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
2、新建类,继承PooledDataSourceFactory
package com.qf.mybatis2103.util;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.pooled.PooledDataSourceFactory;
public class MyDataSource extends PooledDataSourceFactory {
public MyDataSource(){
//替换
this.dataSource=new DruidDataSource();
}
}
3、配置Druid连接池
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7wClEDXs-1634362215725)(C:\Users\ASUS\Desktop\笔记\老师笔记\三阶段\day5\pic\image-20211015143700019.png)]
3、分页
分页方式:
1、后台分页:从数据库查询时,只查询当前页的数据
2、前端分页:查询所有数据返回给前端
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ORfC8nL-1634362215727)(C:\Users\ASUS\Desktop\笔记\老师笔记\三阶段\day5\pic\image-20211015144930171.png)]
分页实现:
1、添加分页插件的依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
2、在mybatis-config.xml中配置分页插件
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
3、分页代码
public static void main(String[] args) {
//【注意】在获取所有数据之前设置查询的页码的信息
//设置查询的页数及数据条数
PageHelper.startPage(3,2);
//获取所有数据
List<Emp> empList= MybatisUtil.getMapper(EmpDao.class).findEmp();
//设置PageInfo
PageInfo<Emp> pageInfo=new PageInfo<Emp>(empList);
System.out.println(pageInfo);
List<Emp> pageEmp=pageInfo.getList();
for (Emp emp: pageEmp
) {
System.out.println(emp);
}
}
til.getMapper(EmpDao.class).findEmp();
//设置PageInfo
PageInfo<Emp> pageInfo=new PageInfo<Emp>(empList);
System.out.println(pageInfo);
List<Emp> pageEmp=pageInfo.getList();
for (Emp emp: pageEmp
) {
System.out.println(emp);
}
}