Mybatis 补充(动态的sql语句+分页模式)

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);
MyBatis-Plus 支持使用自定义 SQL 语句进行分页查询,下面是一个示例代码: ```java // 设置分页参数 Page<User> page = new Page<>(1, 10); // 查询第 1 页,每页 10 条记录 // 执行分页查询 List<User> userList = userMapper.selectUserList(page, 1); // 执行自定义 SQL 查询 // 输出查询结果 long total = page.getTotal(); // 获取查询总数 ``` 上面的代码中,我们首先通过 `new Page<>(1, 10)` 创建一个分页参数对象,表示查询第 1 页,每页 10 条记录。然后,我们使用自定义的 SQL 语句进行分页查询,通过 `userMapper.selectUserList(page, 1)` 执行查询,将查询结果保存到 `userList` 对象中。最后,我们通过 `page.getTotal()` 获取查询总数。 在自定义 SQL 语句中,我们需要使用 MyBatis-Plus 提供的分页参数。例如,在 MySQL 中,我们可以使用 `limit #{page.offset}, #{page.size}` 来限制查询结果的数量,并使用 `count(1)` 函数统计查询总数。下面是一个示例 SQL 语句: ```xml <select id="selectUserList" resultType="com.example.User"> select * from user where status = #{status} limit #{page.offset}, #{page.size} </select> ``` 在上面的 SQL 语句中,我们使用 `#{page.offset}` 表示查询结果的偏移量,使用 `#{page.size}` 表示查询结果的数量,其中 `page` 是 MyBatis-Plus 提供的分页参数对象。我们还使用 `count(1)` 函数统计查询总数,并将查询总数保存到 `page` 对象中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值