1. MybatisPlus
1.1 MP的介绍
说明:MyBatis-Plus(open new window)(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。MP主要完成单表的CURD操作,从而简化开发。
2 MP的入门案例
2.1 实现步骤
- 导入jar包文件。
- 思想:使用对象的方式操作数据库。
- 编辑POJO实现对象与数据库表的映射关系。
- 继承公共的接口,获取常用的CURD操作。
- 实现数据的操作。
2.2 引入jar包
<!--spring整合mybatis-plus,同时,如果MP中包含了mybatis原来的包则需要删除它 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
2.3 编辑POJO实体类
说明:
- POJO应该与数据库中的表完成映射。
- POJO中的属性与表中的字段要一一映射。
注解: - @TableName(“demo_user”) 实现对象与表名的映射
- @TableId(type = IdType.AUTO) 设定主键自增
- @TableField(“name”) 实现属性与字段的映射
规则:如果属性与字段的名称一致,则注解可以省略
@Data //自动为实体类生成常用的方法,set,get,构造方法等
@Accessors(chain = true) //开启链式加载
@TableName(value = "demo_user") //实现对象与表名的映射
public class User {
@TableId(type = IdType.AUTO) //设置主键自增
private Integer id;
@TableField("name") //实现属性与字段的映射,如果字段名与属性名相同,则该注解可以省略。
private String name;
private Integer age;
private String sex;
@TableField(exist=false)
private String address;//不存在的字段可忽略
}
2.4 继承公共的接口
说明:继承接口之后,必须添加泛型对象,否则程序无法执行。
父级中的接口:MP将常用的CURD的方法进行了抽取,子类如果需要调用,可直接使用。
2.5 创建application.yml配置文件
server:
port: 8090
#spring整合数据源 最快的数据源
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
#如果密码以数字0开头,则使用""号包裹 "0123456"
password: root
#SpringBoot整合MybatisPlus配置
mybatis-plus:
#设置别名包
type-aliases-package: com.jt.pojo
#加载映射文件
mapper-locations: classpath:/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
# 打印Sql语句
logging:
level:
#指定包路径,日志输出
com.jt.mapper: debug
2.6 创建UserMybatis.xml映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--语法:namespace="接口的路径" -->
<mapper namespace="com.jt.mapper.UserMapper">
<select id="foundAll" resultType="User">
select * from demo_user
</select>
</mapper>
2.7 测试
@SpringBootTest
public class TestMybatis {
@Autowired
private UserMapper userMapper;
@Test
public void testfind(){
System.out.println(userMapper.foundAll());
}
@Test
//以对象的方式操作数据库,单表几乎不写sql
public void testInsert(){
User user = new User();
user.setName("战神刑天").setAge(20).setSex("男");
userMapper.insert(user);
System.out.println("新增完成!!");
}
}
3 MP的工作原理
- 思想:以对象的方式操作数据库。
- 配置:
- 编辑POJO与数据库中表的映射。
- 编辑POJO属性与表字段的映射。
- 封装了大量常用的CURD API,简化了用户调用。
- 根据对象动态的生成sql语句。
- 执行过程:
- 程序业务开始调用,userMapper.insert(user);
- 根据Mapper接口动态获取操作的泛型对象,获取对象之后,获取表的相关数据。public interface UserMapper extends BaseMapper.
- 只要获取对象,就得到了表名称,字段名,数据的值。
- 将对象转化为特定的sql之后,交给Mybatis执行,userMapper.insert(user对象);
3.1 MP常用操作
3.1.1 基于ID查询数据
等价于Sql语句:SELECT id,name,age,sex FROM demo_user WHERE id=?
selectById(Serializable id)
User user = userMapper.selectById(3);
3.1.2 基于条件selectList查询数据一
等价于Sql语句: select * from demo_user where name=“xx” and sex=“xx”
- 查询name=小乔,sex=男 的用户
selectList(Wrapper<User> queryWrapper)
User user = new User();
user.setName("小乔").setSex("男");
//条件构造器,会为where封装条件。相当于自动的把小乔和男作为where的条件进行查询。
QueryWrapper queryWrapper = new QueryWrapper(user);
List<User> list = userMapper.selectList(queryWrapper);
3.1.3 基于条件selectList查询数据二
等价于Sql语句: SELECT id,name,age,sex FROM demo_user WHERE name=? AND sex=?
- 查询name=小乔,sex=男 的用户
//条件构造器,会为where封装条件。
QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.eq("name", "小乔").eq("sex", "男");//如果有多个条件,可给构造器添加泛型。
List<User> list = userMapper.selectList(queryWrapper);
3.1.4 基于条件selectList查询数据三
等价于Sql语句:SELECT * demo_user WHERE age > 18 and sex=“女”
- 查询 age> 18 sex="女"的用户
- 逻辑运算符:
> gt
,< lt
,= eq
,>= ge
,<= le
,!= ne
QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.gt("age", 18).eq("sex", "女");
List<User> list = userMapper.selectList(queryWrapper);
3.1.5 like 关键字模糊selectList查询数据
likeLeft
、 like
、 likeright
QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.likeLeft("name", "乔");
List<User> list = userMapper.selectList(queryWrapper);
3.1.6 in 关键字selectList查询数据
可变参数的语法:(Integer … id),且参数必须位于最后一位。
//条件构造器,会为where封装条件。
QueryWrapper<User> queryWrapper = new QueryWrapper();
Integer[] ids = {1,3,5,7};
queryWrapper.in("id", ids);
List<User> list = userMapper.selectList(queryWrapper);
3.1.7 order by 排序selectList查询数据
默认规则:升序 asc(默认)、降序 desc。
需求:查询性别为男的用户,且按照年龄降序排序排序
sql:select * from demo_user where sex=“男” order by desc
//条件构造器,会为where封装条件。
QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.eq("sex", "男").orderByDesc("age" );
List<User> list = userMapper.selectList(queryWrapper);
3.1.8 动态sql
根据用户的条件,动态的拼接where条件。
select * from demo_user where age > 18 and sex="女"
API说明:
queryWrapper.gt(判断条件,字段名称,字段值)
判断条件:
true 则动态的拼接where条件
false 不会拼接where条件
Integer age = 18;
String sex = "女";
//条件构造器,会为where封装条件。
QueryWrapper<User> queryWrapper = new QueryWrapper();
Boolean ageBoo = (age !=null);
Boolean sexBoo = StringUtils.hasLength(sex);
queryWrapper.gt(ageBoo, "age",age)
.eq(sexBoo,"sex","女");
List<User> list = userMapper.selectList(queryWrapper);
3.1.9 删除操作
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("name","xxx");
userMapper.delete(queryWrapper);
3.1.10 更新操作-任意字段
- API说明:
userMapper.update(对象,修改条件构造器)
对象: 修改后的数据使用对象封装
修改条件构造器: 负责修改的where条件
User user = new User();
user.setName("宵夜吃什么").setAge(20).setSex("女");
UpdateWrapper updateWrapper = new UpdateWrapper();
updateWrapper.eq("name","MP");//条件:name=MP
userMapper.update(user,updateWrapper);