SpringBoot整合MyBatis
与创建spring web
项目类型,添加上相应依赖
实体类
public class Account {private int id;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}private String name;private double money;
}
接口
@Mapper
public interface AccountDao {@Select("select * from account where id = #{id}")public Account getAccount(int id);
}
@Mapper
注解主要用于标记数据访问层(DAO
层或称为 Mapper
层)的接口。这个注解是 MyBatis
框架的一部分,用于与 Spring
框架集成时自动创建这些接口的实现类,并将其作为 Bean 注入到其他需要的地方。
数据库配置
resources/application.yml
# 数据源配置
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/testusername: rootpassword: 123abc!@#
测试类中运行
@SpringBootTest
class BootMpApplicationTests {@Autowiredprivate AccountDao accountDao;@Testvoid contextLoads() {Account account = accountDao.getAccount(1);System.out.println(account.getName());}
}
MyBatisPlus
简介
MyBatisPlus
是基于Mybatis
框架基础上开发的增强型工具,用于简化开发、提高效率。
项目搭建
在上面项目的基础上添加对应的依赖,在dependencies
中添加
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version>
</dependency>
AccountDao2.class
// 需要使用mybatis-plus提供的的BaseMapper
@Mapper
public interface AccountDao2 extends BaseMapper<Account> {
}
测试类中运行
@SpringBootTest
class BootMpApplicationTests {@Autowiredprivate AccountDao accountDao;@Autowiredprivate AccountDao2 accountDao2;@Testvoid contextLoads() {Account account = accountDao.getAccount(1);System.out.println(account.getName());// 使用mybatis-plus提供的方法Account account1 = accountDao2.selectById(1);System.out.println("使用mybatis-plus获取:" + account1.getName());}}
补充
使用lombok
简化实体类,在pom.xml
中添加
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version>
</dependency>
简化前:
public class Account {private int id;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}private String name;private double money;
}
简化后
@Getter
@Setter
@ToString
public class Account {private int id;private String name;private double money;
}
或者
@Data
public class Account {private int id;private String name;private double money;
}
@Data
为当前实体类在编译期设置对应的get/set
方法,无惨/有惨 构造方法,toString
方法等
分页功能
配置
config/MpConfig .class
@Configuration
public class MpConfig {// 设置mybatis-plus的分页功能@Beanpublic MybatisPlusInterceptor paginationInterceptor() {// 1、创建拦截器MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 2、添加分页拦截器interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
使用
// 设置当前页码和每页显示的条数IPage page = new Page(1, 2);accountDao2.selectPage(page, null);System.out.println("总页:" + page.getPages());System.out.println("总条数:" + page.getTotal());
在控制台开始执行日志
application.yml
# 开启日志输出(输出到控制台)
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
条件查询
mybatis-plus
将书写复杂的sql
查询条件进行了封装,使用编程的形式完成查询条件的组合
QueryWrapper
QueryWrapper qw = new QueryWrapper();
// 查询金钱大于1000的
qw.gt("money", 1000);
List<Account> list = accountDao2.selectList(qw);System.out.println("总条数是:" + list.size());
lambda表达式方式
QueryWrapper<Account> qw = new QueryWrapper();
// 查询金钱大于1000的
qw.lambda().gt(Account::getMoney, 1000);
List<Account> list = accountDao2.selectList(qw);System.out.println("总条数是:" + list.size());
或者
LambdaQueryWrapper<Account> qw = new LambdaQueryWrapper<>();
qw.gt(Account::getMoney, 1000);
List<Account> list = accountDao2.selectList(qw);System.out.println("总条数是:" + list.size());
LambdaQueryWrapper<Account> qw = new LambdaQueryWrapper<>();
// 多条件查询,查询金额大于1000并且姓名为张三
qw.gt(Account::getMoney, 1000).eq(Account::getName, "张三");
List<Account> list = accountDao2.selectList(qw);System.out.println("总条数是:" + list.size());
查询投影
用于指定查询时返回哪些字段
LambdaQueryWrapper<Account> qw = new LambdaQueryWrapper<>();
// 查询投影,只查询name和money
qw.select(Account::getName, Account::getMoney);
List<Account> list = accountDao2.selectList(qw);System.out.println("总条数是:" + list.size());
或者
QueryWrapper<Account> qw = new QueryWrapper<>();// 查询投影,只查询name和moneyqw.select("id", "money");List<Account> list = accountDao2.selectList(qw);System.out.println("总条数是:" + list.size());
映射匹配兼容
表字段与编码属性设计不同步
正常情况下实体类中的属性名与数据库中的字段名称时一致的。但也会出现不一致的情况,这时候可以使用TableField
去进行关联
public class User{@TableField(value = "username")private String name;private int age;
}
编码中添加了数据库中未定义的属性
数据库中不需要改字段,但是实体类中需要该属性
public class User{@TableField(value = "username")private String name;private int age;// 该字段,表中不存在@TableField(exist = false)private int isOnline;
}
设置属性是否参与查询
// 查询数据时不返回密码
@TableField(select = false)
private String password;
数据库表名与实体类类名不一致
@TableName("t_user")
public class User{}
id生成策略
public class Account {// 使用雪花算法生成id@TableId(type = IdType.ASSIGN_ID)private int id;
}
- AUTO:使用数据库
id
自增控制id
的生成 - NONE:不设置
id
生成策略 - INPUT:用户手工输入
- ASSIGN_ID:雪花算法生成
id
- ASSIGN_UUID:以
UUID
生成算法作为id
生成策略