Mybatis 补充(动态的sql语句+分页模式)
例:
需求:根据id、 用户名、密码共同查询用户
SQL语句:select * from user where id=? and username = ?and password = ?
如果用户名为null 就不要根据用户名查询了
select * from user where id=?and password=?
但不确定那个会为null 所以SQL 语句不能写死
所以可以动态的去拼接这个SQL语句
如:
select*from user where 1=1
if(id!=null){
and id=?
}
if(username!=null){
and username = ?
}
if(password!=null){
and password= ?
}
<select id="findByCondition" parameteType="user" resultType="user">
select * from mybatis
<where>
<if test="id!=0">
and id=#{id}
</if>
<if test="username!=null">
and username=#{username}
</if>
<if test="password!=null">
and password=#{password}
</if>
</where>
</select>
注:
- test中的表达式,如果有实体类中的属性可以直接写 不要加#{}或者${}而且要注意大小写必须和实体类中的属性名称一致
- where标签可以自动帮我们处理and如果有条件满足 会自动删除第一个and如果不满足where条件就不会出现
<select id="findByIds" parameteType="list" resultType="user">
select * from mybatis
<where>
<foreach collection="list" open="id in("close=")" item="id" separator=",">
#{id}
</foreach>
<where>
</select>
注:
foreach:标签是用来遍历的
collection:属性是指定要遍历的类型
open:是做SQL语句拼接的开始
close:是做SQL语句拼接的结束
item:是遍历的每一个元素
separator:是连接多个元素的分隔符
#{item的名称}:可以取值
(可以根据自己的需求拼接SQL语句,如果是不变的我们可以使用open和close,如果是变化的我们就可以使用item取值)
<update id="xxx" parameterType="user">
update user
<set>
<if test="username!=null">
userName=#{username},
</if>
<if test="password!=null">
password=#{password},
</if>
</set>//如果有满足的条件set标签可以去除最后的一个逗号
where id = #{id}
</update>
==typeHandlers==标签
这个标签是用来配置类型转换器的,什么时候需要使用类型转换器 Java中的类型和数据库中的类型不匹配时就要进行类型转换
比如:Java实体中有和属性是String和这个属性对应的数据库表中的字段类型是个Date这个时候就要类型转换
Mybatis已经给我们提供了很多的类型转换器
有的时候我们需要比较特殊 Mybatis没有相应的转换器 我们就要手动去实现这个转换器
分页的方式:
物理模式:
利用数据库的分页方式,每次要多少条记录就取多少条记录
好处:每次取的数据较少 不会占太多的内存
缺点:频繁的和数据库服务器交互
逻辑模式:
一次性查询所有数据,然后利用集合的角标去做分页
好处:可以减少和数据库服务器的交互次数
缺点:数据量大的时候比较耗费内存空间
例如:要做分页
1、前后台的数据传送
2、在MySql中做分页 使用limit关键字
3、limit关键字需要两个参数,limit a、b a是从第几条开始查询 b是要查询多少条
4、所以前台必须要给我们传递两个参数 分别是a和b
5、不过前台没有条数的概念,他们只有页码的概念,所以前台会给我们后台传递:当前页码 要查询的条数(每页显示的记录数)我们需要做的是:把当前页码转成a也就是根据页码计算出来从第几条开始查询(当前页码-1)*每页显示的条数
当前页码: 已知的(传递给你的)
每页显示的条数: 已知的(传递给你的)
总的记录数: 查询数据库
总的页码: 计算:总的记录数/每页显示的条数
数据: 查询数据库
(怎么将5个数据返回给前端 可以使用一个对象给封装起来 PageBean对象)
Mybatis的分页插件
<dependency> //pom.xml中导入坐标
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>3.7.5</versio>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>0.9.1</versio>
</dependency>
//配置分页助手插件
<plugins> //配置核心
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"></property>
</plugin> //指定方言 limit 10,10
</plugins>
//设置分页参数
//1是当前页 3是每页显示的条数 第一个参数是开始的页码 第二个参数是要查询的记录数
pageHelper.stsrtPage(1,3);//这个设置必须要在查询之前
List<User> userList=mapper.findAll();
for(User user:userList){
sout(user);
}
//获取于分页相关的参数 PageInfo必须要写在查询所有的后面
PageInfo<User> pageInfo = new PageInfo<~>(userList);//~ 通配符前面参数是什么它就是什么
Ststem.out.println("当前页"+pageInfo.getPageNum);
Ststem.out.println("每页显示条数"+pageInfo.getPageSize);
Ststem.out.println("总条数"+pageInfo.getTotal());
Ststem.out.println("总页数"+pageInfo.getPages());
Ststem.out.println("上一页"+pageInfo.getPrePage());
Ststem.out.println("下一页"+pageInfo.getNextPage());
Ststem.out.println("是否是第一页"+pageInfo.isIsFirstPage);
Ststem.out.println("是否是最后一页"+pageInfo.isIsLastPage);