6 MybatisPlus快速上手
6.1 ORM介绍
6.2 MyBatis-Plus介绍
第一步:pom.xml中添加依赖
第二步:全局配置
配置数据库相关信息
添加@MapperScan注解
6.3 MyBatis CURD注解
第一步:新建SpringBoot项目(详细过程见上篇)
pom.xml中添加依赖
<!--MyBatisPlus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<!--mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!--数据连接池druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
第二步:新建mydb数据库,在库中新建user表(将user表中的id设置为主键、自增)
第三步:新建mapper包(所有跟数据库相关的操作都放在该包下)
第四步:在启动类中加注解“@MapperScan(mapper全限定包名)”,可以使mapper包中的类都生效
第五步:在mapper包下新建UserMapper(mapper文件名称一般是“表名+mapper”,接口类型)
第六步:创建User类,类中变量的数据类型和名称要和数据库中保持一致,alt+insert快捷键生成getter、setter、toString方法
第七步:写查询方法,@Select后面的语句会自动查询连接的数据库中的表,查询结果会自动封装成user对象,然后放到List中;类上写“@Mapper”指定该类是mapper方法,MapperScanner会自动扫描到该类,进行解析
@Mapper
public interface UserMapper {
//查询所有用户
@Select("select * from user")
public List<User> find();
}
第八步:UserController类
@RestController
public class UserController {
@Autowired//注入userMapper,从而可以在类中正常使用userMapper的方法
private UserMapper userMapper;
@GetMapping("/user")
public String query(){
List<User> list = userMapper.find();
System.out.println(list);
return "查询用户";
}
}
启动项目,报错:
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
由于使用的是MySQL 8.0,所以数据库连接配置需要修改为:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&useSSL=false&serverTimezone=UTC
再次启动,可正常访问
控制台:
第九步:修改返回类型及返回值,返回的对象会被自动转为json
@GetMapping("/user")
public List query(){
List<User> list = userMapper.find();
System.out.println(list);
return list;
}
插入方法同理:UserMapper中
@Insert("insert into user values (#{id},#{username},#{password},#{birthday})")
public int insert(User user);
Controller中:
@PostMapping("/user")
public String save(User user){
int i = userMapper.insert(user);
if(i>0){
return "插入成功";
}else{
return "插入失败";
}
}
请求:
测试结果:
6.3.1 接下来使用MybatisPlus
1.mapper类继承BaseMapper
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
2.controller修改query方法,insert方法不用变
@GetMapping("/user")
public List query(){
List<User> list = userMapper.selectList(null);
System.out.println(list);
return list;
}
3.测试
两个方法均可正常使用。
如果表名和实体类不一致,类上方可以加“@TableName("表名")”映射到实体类,变量名不一致用“@TableField”。
@TableId可以将变量设置为主键,IdType.AUTO意思是自增,再次测试,插入数据时,user传入数据时会带上id,尽管请求时并没有设置id。
测试:
如果用了MybatisPlus,默认表名和实体类名对应,字段名和变量名对应,具体细节可以查看官方文档。
7 MybatisPlus多表查询及分页查询
实现复杂关系映射,可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置。(MyBatis Plus仅对单表查询进行了增强,没有修改多表查询)
目标:实现查询用户时,查到该用户名下所有订单
第一步:新建订单表u_order(id设置为主键、自增)
注意表名不能设为order,不然访问时,sql语法会出错(“select *from order where uid = #{uid}”),无法执行sql语句。因为sql语句中不能出现sql关键词,否则会报错,sql关键词有order、form、dec等等。
第二步:新建Order类,以及get、set、constructor、toString方法
@TableName("u_order")
public class Order {
@TableId(type = IdType.AUTO)
private Integer id;
private String orderTime;
private double total;
@TableField(exist = false)
private User user;//uid字段对应的属性
第三步:新建OrderMapper、OrderController
@Mapper
public interface OrderMapper extends BaseMapper<Order> {
@Select("select * from u_order where uid = #{uid}")
List<Order> selectByUid(int uid);
//查询所有的订单,同时查询订单的用户
@Select("select * from u_order")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "order_time",property = "orderTime"),
@Result(column = "total",property = "total"),
@Result(column = "uid",property = "user",javaType = User.class,
one=@One(select = "com.example.mybatisplusdemo.mapper.UserMapper.selectById")
)
})
List<Order> selectAllOrderAndUser();
}
@RestController
public class OrderController {
@Autowired
private OrderMapper orderMapper;
@GetMapping("/order/findAll")
public List findAll(){
List orders = orderMapper.selectAllOrderAndUser();
return orders;
}
}
第四步:
UserMapper添加查询用户、查询所有订单的方法selectAllUserAndOrders()
//查询用户,根据用户id查询信息
@Select("select * from user where id = #{id}")
User selectById(int id);
//查询用户及其所有订单
@Select("select * from user")
@Results(
{
@Result(column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(column = "birthday",property = "birthday"),
@Result(column = "id",property = "orders",javaType = List.class,
many =@Many(select = "com.example.mybatisplusdemo.mapper.OrderMapper.selectByUid")
)
}
)
List<User> selectAllUserAndOrders();
第五步:UserController中添加对应方法
@GetMapping("/user/findAll")
public List<User> find(){
return userMapper.selectAllUserAndOrders();
}
@Results是结果集,@Result作用是每一个字段赋值
测试(查询用户及其所有订单):
测试(查询所有的订单,同时查询订单的用户):
7.1 MyBatis Plus的条件查询和分页查询
QueryWrapper是MyBatis Plus中实现查询的对象封装操作类,可以封装sql对象,包括where条件,order by排序,select哪些字段等等。
7.1.1条件查询
方法:
//条件查询
@GetMapping("/user/find")
public List<User> findByCond(){
QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.eq("username","zhangsan");
return userMapper.selectList(queryWrapper);
}
结果:
7.1.2分页查询
第一步:创建MyBatis Plus拦截器,新建配置类MyBatisPlusConfig
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor paginationInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
interceptor.addInnerInterceptor(paginationInterceptor);
return interceptor;
}
}
第二步:Controller方法
//分页查询
@GetMapping("/user/findByPage")
public IPage findByPage(){
//设置起始值及每页条数
Page<User> page = new Page<>(0,2);
IPage iPage = userMapper.selectPage(page,null);
return iPage;
}
Page对象是用来描述从哪查,查几条数据;iPage是描述结果集的对象。
结果:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。