1.概念:
a.簡介:MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
b.支持數據庫:mysql 、mariadb、oracle、db2、h2、hsql、sqlite、postgresql、sqlserver
2.使用:
a.導入Maven依賴
<properties> ...... <!-- spring --> <spring.version>5.1.1.RELEASE</spring.version> <!-- jackson-json --> <jackson.version>2.9.4</jackson.version> <!-- log4j --> <slf4j.version>1.7.18</slf4j.version> <log4j.version>1.2.17</log4j.version> </properties> <dependencies> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- Jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- AOP --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.6</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.6</version> </dependency> <!-- 日志相關 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> </dependency> <!-- 連接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency> <!-- mp 依賴 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>3.2.0</version> </dependency> </dependencies>
b.書寫 spring.xml 和 jdbc.properties 配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <!-- 引入外部properties --> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- 掃描包 --> <context:component-scan base-package="com.wode" /> <!-- 開啟AOP代理 --> <aop:aspectj-autoproxy proxy-target-class="true" /> <!-- 開啟注解處理器 --> <context:annotation-config /> <!-- 開啟注解聲明式事務 --> <tx:annotation-driven/> <!-- 數據源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- mybatits-plus 整合 Spring --> <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"> <!-- 加載數據源 --> <property name="dataSource" ref="dataSource" /> <!-- 指定 pojo 目錄 --> <property name="typeAliasesPackage" value="com.wode.entity"/> <!-- mybatis-plus 插件 --> <property name="plugins"> <array> <!-- 分頁插件 --> <bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"></bean> </array> </property> <!-- 加載 mybatis-plus 全局屬性 --> <property name="globalConfig" ref="globalConfig" /> </bean> <!-- 配置和 mybatis-plus 全局屬性 --> <bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig"> <property name="dbConfig" ref="dbConfig"/> </bean> <bean id="dbConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig"> <!-- AUTO -> 數據庫ID自增 INPUT -> 用戶輸入ID ID_WORKER -> 全局唯一ID UUID -> 全局唯一ID --> <property name="idType" value="UUID"/> <!-- 全局的表前綴策略配置 --> <property name="tablePrefix" value="tb_" /> </bean> <!-- mybatis 的動態代理 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.wode.dao" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <!-- 事務代理管理器 --> <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> </beans>
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC jdbc.username=root jdbc.password=123456
c.在數據庫創建`tb_user`用戶表
-- 用戶表 CREATE TABLE `tb_user` ( `id` varchar(255) NOT NULL, `user_name` varchar(255) NOT NULL, `user_code` int(11) NOT NULL, PRIMARY KEY (`id`) );
d.創建User用戶實體類
@TableName("tb_user") public class User { @TableId private String id; private String userName; private int userCode; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getUserCode() { return userCode; } public void setUserCode(int userCode) { this.userCode = userCode; } @Override public String toString() { return "User(id[" + id + "], userName[" + userName + "], userCode[" + userCode + "])"; } }
e.創建 UserMapper 接口繼承 BaseMapper
public interface UserMapper extends BaseMapper<User> { }
f.使用
-------------------------------------------------------------新增-------------------------------------------------------------
1)新增
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); UserMapper userMapper = (UserMapper) context.getBean("userMapper"); User user = new User(); user.setUserCode(509); user.setUserName("趙九"); userMapper.insert(user);
-------------------------------------------------------------修改-------------------------------------------------------------
2)修改(根據ID)
User user = new User(); user.setId("000a03f373eb563789e8311225eeee87"); user.setUserCode(502); userMapper.updateById(user);
3)修改(根據Wrapper)
User user = new User(); user.setUserCode(504); UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.ge("user_code", 503); wrapper.eq("user_name", "李四"); userMapper.update(user, wrapper);
-------------------------------------------------------------刪除-------------------------------------------------------------
4)刪除(根據ID)
userMapper.deleteById("5f9f4315153a422c33af8a671c999812");
5)刪除(根據ID集合)
List<String> ids = new ArrayList<>(); ids.add("24cc20d8453e61dad42c1be0df356807"); ids.add("7edb2acaa7b8cacb08b7e25a947979eb"); ids.add("e4faed134b055ef80fb1d5e8382b9373"); userMapper.deleteBatchIds(ids);
6)刪除(根據Map)
Map<String, Object> filter = new HashMap<>(); filter.put("user_name", "趙七"); userMapper.deleteByMap(filter);
7)刪除(根據Wrapper)
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("user_name", "趙八"); userMapper.delete(wrapper);
-------------------------------------------------------------查詢一條-------------------------------------------------------------
8)查詢一條(根據ID)
User user = userMapper.selectById("000a03f373eb563789e8311225eeee87"); System.out.println(user);
9)查詢一條(根據Wrapper)
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("user_name", "張三"); User user = userMapper.selectOne(wrapper); System.out.println(user);
-------------------------------------------------------------查詢多條-------------------------------------------------------------
10)查詢(根據ID集合)
List<String> ids = new ArrayList<>(); ids.add("9175a689f2a28b9b6ca1a72d153fc7ec"); ids.add("460a3f6192c2e27595fd1a2fa0defa16"); List<User> userList = userMapper.selectBatchIds(ids); System.out.println(userList);
11)查詢(根據Wrapper)
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.like("user_name", "趙%"); wrapper.gt("user_code", 507); List<User> userList = userMapper.selectList(wrapper); System.out.println(userList);
12)查詢(根據Map)
Map<String, Object> filter = new HashMap<>(); filter.put("user_name", "張三"); List<User> userList = userMapper.selectByMap(filter); System.out.println(userList);
-------------------------------------------------------------分頁查詢-------------------------------------------------------------
13)分頁查詢(根據Wrapper)
Page<User> page = new Page<>(1, 3); QueryWrapper<User> queryWrapper = new QueryWrapper<>(); IPage<User> userIPage = userMapper.selectPage(page, queryWrapper); System.out.println("總條數:" + userIPage.getTotal()); System.out.println("每頁條數:" + userIPage.getSize()); System.out.println("當前頁數:" + userIPage.getCurrent()); System.out.println("總頁數:" + userIPage.getPages()); System.out.println("查詢結果:" + userIPage.getRecords());
-------------------------------------------------------------條數查詢-------------------------------------------------------------
14)查詢條數(根據Wrapper)
QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.like("user_name", "趙%"); int count = userMapper.selectCount(queryWrapper); System.out.println(count);
3.其他
a.條件查詢or
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.ge("user_code", 502); //不寫則默認為and拼接 wrapper.le("user_code", 503); //or嵌套 wrapper.or(wrapper1 -> wrapper1.like("user_name", "趙%").ne("id", "f463c76d52056ca51bc76e348fd0572e")); //or拼接 wrapper.or().eq("id", "460a3f6192c2e27595fd1a2fa0defa16"); List<User> userList = userMapper.selectList(wrapper); System.out.println(userList);
b.排序
QueryWrapper<User> wrapper = new QueryWrapper<>(); //正序 wrapper.orderByAsc("user_name"); //倒序 wrapper.orderByDesc("user_code"); List<User> userList = userMapper.selectList(wrapper); System.out.println(userList);
c.返回指定字段
QueryWrapper<User> wrapper = new QueryWrapper<>(); //只返回指定字段 wrapper.select("user_name", "user_code"); List<User> userList = userMapper.selectList(wrapper); System.out.println(userList);
4.多表分頁查詢
a.創建 tb_info 用戶信息表,並添加數據
-- 用戶信息表 CREATE TABLE `tb_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` varchar(255) NOT NULL, `nick_name` varchar(255) NOT NULL, `gender` int(11) NOT NULL, PRIMARY KEY (`id`) );
b.在 UserMapper 中添加多表聯查自定義方法
public interface UserMapper extends BaseMapper<User> { //普通連表查詢 @Select("SELECT u.id,u.user_name,u.user_code,i.nick_name,i.gender FROM tb_user u,tb_info i WHERE u.id=i.user_id and u.user_code>=#{userCode} order by u.user_code desc") List<UserInfoVo> getQuestionStudentList(@Param("userCode") int userCode); //分頁連表查詢 @Select("SELECT u.id,u.user_name,u.user_code,i.nick_name,i.gender FROM tb_user u,tb_info i WHERE u.id=i.user_id and u.user_code>=#{userCode} order by u.user_code desc") IPage<UserInfoVo> getQuestionStudentPage(Page<UserInfoVo> page, @Param("userCode") int userCode); }
c.測試使用
1)普通連表查詢測試
List<UserInfoVo> userList = userMapper.getQuestionStudentList(503); for(UserInfoVo userInfo : userList){ System.out.println(userInfo); }
2)分頁連表查詢測試
Page<UserInfoVo> page = new Page<>(1, 3); IPage<UserInfoVo> userIPage = userMapper.getQuestionStudent(page, 503); System.out.println("總條數:" + userIPage.getTotal()); System.out.println("每頁條數:" + userIPage.getSize()); System.out.println("當前頁數:" + userIPage.getCurrent()); System.out.println("總頁數:" + userIPage.getPages()); System.out.println("查詢結果:"); for(UserInfoVo userInfo : userIPage.getRecords()){ System.out.println(userInfo); }
5.官方文檔:
https://mp.baomidou.com/guide/