MyBatis-Plus官网 https://mybatis-plus.com
MyBatis-Plus(简称 MP)是一个 在
MyBatis的增强工具
,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。- - -引自官网
框架结构
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
bir timestamp NULL DEFAULT NULL COMMENT '出生日期',
PRIMARY KEY (id)
);
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<scope>runtimescope>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.2.0version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.0.9version>
dependency>
dependencies>
在 application.yml
配置文件中添加如下配置:
#数据源相关配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis-plus?characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
#日志等级配置
logging:
level:
root: info
com.uos.dao: debug
注意:
1. 此时无需添加mybatis的相关配置;
2. 如果mysql是5.x以上版本,请将driver-class-name
设置为com.mysql.cj.jdbc.Driver
,否则后续测试时会报错!
在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:
@SpringBootApplication
@MapperScan("com.uos.dao")
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
编写实体类 User.java(此处使用了 Lombok简化代码)
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
public class User {
private String id;
private String name;
private Integer age;
private Date bir;
}
编写DAO类 UserDAO.java
public interface UserDAO extends BaseMapper<User> {
}
添加测试类,进行功能测试:
@SpringBootTest
public class TestUserDao {
@Autowired
private UserDAO userDAO;
/*查询所有*/
@Test
public void testFindAll(){
List<User> users = userDAO.selectList(null);
users.forEach(user -> System.out.println("user=" + user));
}
}
@TableName(value = "t_user")
注意:该注解是写在实体类名的上方,默认将类名作为表名。
@TableId(value = "id", type = IdType.AUTO) //主键注解
private String id;
@TableField(value = "username") //和数据库字段进行映射
private String name;
private Integer age;
private Date bir;
@TableField(exist = false) //该字段不和数据库进行映射
private String email;
/*查询所有*/
@Test
public void testFindAll(){
List<User> users = userDAO.selectList(null);
users.forEach(user -> System.out.println("user=" + user));
}
/*查询一个*/
@Test
public void testFindById(){
User user = userDAO.selectById("2");
System.out.println(user);
}
/*条件查询*/
@Test
public void testFind(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//queryWrapper.eq("age", 22); //设置等值查询
//queryWrapper.lt("age", 29); //设置小于查询
//queryWrapper.le("age", 29); //设置小于等于查询
//queryWrapper.gt("age", 22); //设置大于查询
queryWrapper.ge("age", 22); //设置大于等于查询
List<User> users = userDAO.selectList(queryWrapper);
users.forEach(user -> System.out.println("user=" + user));
}
/*模糊查询*/
@Test
public void testFindLike(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//like:只要包含val中的值即可
//queryWrapper.like("username","三");
//likeLeft:查询尾部包含val值的数据
//queryWrapper.likeLeft("username","三");
//likeRight: 查询开头包含val值的数据
queryWrapper.likeRight("username","张");
List<User> users = userDAO.selectList(queryWrapper);
users.forEach(user -> System.out.println("user=" + user));
}
/*分页查询*/
@Test
public void testFindByPage(){
IPage<User> page = new Page(1,2);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 22);
IPage<User> userIPage = userDAO.selectPage(page, queryWrapper);
long total = userIPage.getSize();
System.out.println("记录数:" + total);
userIPage.getRecords().forEach(user -> System.out.println(user));
}
注意:分页查询插件需要添加如下配置方可生效!
创建config
包,在该包中创建MybatisPlusConfig
类
@EnableTransactionManagement
@Configuration
@MapperScan("com.uos.dao")
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
return paginationInterceptor;
}
}
/*添加方法*/
@Test
public void testSave(){
User user = new User();
user.setName("王五").setAge(26).setBir(new Date());
userDAO.insert(user);
}
/*基于id进行修改*/
@Test
public void testUpdateById(){
User user = userDAO.selectById("2");
user.setName("二麻");
userDAO.updateById(user);
}
/*批量修改*/
@Test
public void testUpdate(){
User user = new User();
user.setName("殿下");
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 22);
userDAO.update(user, queryWrapper);
}
/*根据Id进行删除*/
@Test
public void testDeleteById(){
userDAO.deleteById("2");
}
/*批量删除*/
@Test
public void testDelete(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.ge("age", 26);
userDAO.delete(wrapper);
}
<dependency>
<groupId>com.baomidougroupId>
<artifactId>dynamic-datasource-spring-boot-starterartifactId>
<version>3.0.0version>
dependency>
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://localhost:3306/mybatis-plus?characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
slave_1:
url: jdbc:mysql://localhost:3306/mybatis-plus1?characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
slave_2:
url: jdbc:mysql://localhost:3306/mybatis-plus2?characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
public interface UserService {
/*查询所有用户*/
List<User> findAllUser();
/*保存用户*/
void saveUser(User user);
}
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
@Override
@DS("slave_1")
public List<User> findAllUser() {
return userDAO.selectList(null);
}
@Override
public void saveUser(User user) {
userDAO.insert(user);
}
}
@SpringBootTest
public class TestUserService {
@Autowired
private UserService userService;
/*查询所有*/
@Test
public void testFindAll(){
List<User> users = userService.findAllUser();
users.forEach(user -> System.out.println("user=" + user));
}
/*保存*/
@Test
public void testSave(){
User user = new User();
user.setName("哈哈").setAge(55).setBir(new Date());
userService.saveUser(user);
}
}