目录
1 MybatisPlus介绍
是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发,提高效率.
1.1 工作原理
核心思想: 以对象的方式操作数据库
配置:
- 编辑POJO与数据表的映射
- 标记POJO属性与表字段映射
- 封装了大量的常用CURD API 简化代码
- 根据对象动态的生成Sql语句
执行过程:
- 程序业务开始调用
- 根据Mapper接口动态获取操作的泛型对象, 获取对象之后获取表的相关数据
- 获取对象, 并获取表名称, 字段名, 数据值
- 将对象转化为特定的SQL, 之后交给Mybatis执行
SQL: insert into demo_user(id,name,age,gender) values(null,xx,xx,xx)
2 依赖
<!--spring整合mybatis-plus MP中包含了mybatis依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
3 注解
3.1 POJO类
3.1.1 @TableName
实现POJO对象与数据库的表名一一映射
如:@TableName("demo_user")
3.1.2 @TableId
设定主键自增
如:@TableId(type = IdType.AUTO)
3.1.3 @TableField
实现POJO属性与表中的字段名一一映射(若属性名与字段名一致,则注解可以省略)
如:TableField("name")
注:字段名user_name与userName属性名映射
4 配置
4.1 Mapper
Mapper接口需要extends MybatisPlus的BaseMapper<T>接口,且必须添加泛型,泛型对象为POJO类,否则程序无法执行
如:
@Mapper
public interface UserMapper extends BaseMapper<User> {
List<User> RetrieveAll();
}
4.2 YML
#SpringBoot整合MybatisPlus
mybatis-plus:
#设置别名包
type-aliases-package: com.jt.pojo
#加载映射文件
mapper-locations: classpath:/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
5 API
5.1 常见CURD API
package com.jt.test;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.StringUtils;
import java.util.List;
@SpringBootTest
public class TestMybatis {
@Autowired
private UserMapper userMapper;
@Test
public void findAll() {
System.out.println(userMapper.findAll());
}
//思想:以对象的方式操作数据库 单表几乎不写SQL
//简化CURD操作
@Test
public void testInsert() {
User user = new User();
user.setName("MP").setSex("其他").setAge(18);
userMapper.insert(user);
}
//1.根据id主键 查询id=1的数据
//SELECT id,name,age,sex FROM demo_user WHERE id=?
@Test
public void testSelect1() {
User user = userMapper.selectById(1);
System.out.println(user);
}
//2.查询name="小乔" sex="男"的用户
//Sql: select * from demo_user where name="xx" and sex="xx"
@Test
public void testSelect2() {
//创建条件构造器,封装where条件的
User user = new User();
user.setName("小乔").setSex("男");
//实现时会动态的根据对象中不为null的属性,拼接where条件
//默认的关系连接符 and
QueryWrapper queryWrapper = new QueryWrapper(user);
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
//3.查询name="小乔" sex="男"的用户
//Sql:SELECT id,name,age,sex FROM demo_user WHERE name=? AND sex=?
@Test
public void testSelect3() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "小乔").eq("sex", "男");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
//4.查询age>18 sex="女"的用户
//Sql:SELECT * demo_user WHERE age > 18 and sex="女"
//逻辑运算符 > gt, < lt ,= eq,>= ge,<= le,!= ne
@Test
public void testSelect4() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 18).eq("sex", "女");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
//5. like关键字
//5.1 查询name包含"乔" where name like '%乔%'
//5.2 查询name以乔结尾的 where name like '%乔'
@Test
public void testSelect5() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// queryWrapper.like("name", "乔");
queryWrapper.likeLeft("name", "乔");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/*
* 6.in关键字
* 需求:查询ID为1,3,5,6的
* Sql: select * from demo_user where id in (1,3,5,6)
* java基础:参数中使用...表示可变参数类型 多个参数','分隔
* 一般定义可变参数类型时,参数一般位于方法的最后一位
* 可变参数类型的实质,就是数组,写法不同
*/
@Test
public void testSelect6() {
//一般的数组采用包装类型,使用对象身上的方法,基本类型没有方法
Integer[] ids = {1, 3, 5, 6};
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// queryWrapper.in("id", 1, 3, 5, 6);
queryWrapper.in("id", ids);
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/*
* 关键字:order by 排序
* 默认规则: 升序 asc / 降序 desc
* 需求:查询性别为男的用户,并且按照年龄降序排列
* SQL: select * from demo_user where sex = "男" order by age desc
*/
@Test
public void testSelect7() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("sex", "男").orderByDesc("age");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/*
* 动态SQL:根据用户的条件,动态的拼接where条件 (如果某些数据不为null,则需要拼接为where条件)
* 案例:根据sex,age查询数据
* 1.select * from demo_user where age >18 and sex = "女"
* API说明:
* queryWrapper.gt(判断条件,字段名称,字段值)
* 判断条件:true 动态的拼接where条件
* false 不会拼接where条件
* 判断语句:
* Sql: select * from demo_user where id in (1,3,5,6)
*/
@Test
public void testSelect8() {
Integer age = 18;
String sex = "";
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
boolean ageBoo = (age != null);
boolean sexBoo = StringUtils.hasLength(sex);
queryWrapper.gt(ageBoo, "age", age)
.eq(sexBoo, "sex", "女");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
/*
* 9.只获取主键ID的值
* SQL: select id from demo_user where ......
*/
@Test
public void testSelect9() {
List idList = userMapper.selectObjs(null);
System.out.println(idList);
}
/*
* 练习10: 删除name="xxx"的数据
*/
@Test
public void testDelete() {
//删除ID为100的数据
userMapper.deleteById(100);
//userMapper.deleteBatchIds(null);
//删除操作的条件构造器
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("name", "xxx");
userMapper.delete(queryWrapper);
}
/*
* 练习11:数据修改
* 案例1:要求修改id=233 name改为="晚上吃什么"
* API说明:userMapper.updateById(对象信息)
*/
@Test
public void testUpdate() {
//修改除ID之外的所有不为null的数据,id当做where的唯一条件
User user = new User();
user.setId(233).setName("晚上吃什么");
userMapper.updateById(user);
}
/*
* 练习12:数据修改
* 案例2: 将name=mp的用户改为name="宵夜吃什么" age = 20 sex = "女"
* API说明:
* userMapper.update(对象,修改条件构造器)
* 对象:修改后的数据使用对象封装
* 修改条件构造器: 负责修改的where条件
*/
@Test
public void testUpdate2() {
User user = new User();
user.setName("宵夜吃什么").setAge(20).setSex("女");
UpdateWrapper updateWrapper = new UpdateWrapper();
updateWrapper.eq("name", "MP");
userMapper.update(user, updateWrapper);
}
}
5.2 分页实现-MP
@Override
public PageResult getUserList(PageResult pageResult) {//原始3个参数
//1.定义MP的分页对象
IPage iPage = new Page(pageResult.getPageNum(), pageResult.getPageSize());
//2.构建查询条件构造器
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//判断用户数据是否有效 有效 true 无效 false
boolean flag = StringUtils.hasLength(pageResult.getQuery());
queryWrapper.like(flag, "username", pageResult.getQuery());
//经过MP分页查询将所有的分页(total/结果/页面/条数/xxx)数据封装到iPage对象
iPage = userMapper.selectPage(iPage, queryWrapper);
//从分页对象中获取总记录数
long total = iPage.getTotal();
//从分页对象中获取分页后的结果
List<User> rows = iPage.getRecords();
return pageResult.setTotal(total).setRows(rows);
}
5.3 分页实现-xml
<!--方案1
实现user分页查询
List<User> getUserList(int startIndex, int pageSize);
-->
<select id="getUserList" resultType="User">
select * from user limit #{startIndex},#{pageSize}
</select>
<!--方案2
在mybatis内部做算术计算
$符可以进行算数计算
#号默认为字符串,不会进行计算
-->
<select id="getUserList2" resultType="User">
select * from user
/*动态Sql*/
<where>
<if test="query != null and query != ''">username like "%"#{query}"%"</if>
</where>
limit ${(pageNum-1)*pageSize},#{pageSize}
</select>
版权声明:本文为CSDN博主「闪耀太阳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_16804847/article/details/118209272