一、MybatisPlus簡化數據庫交互
我們使用Mybatis發現需要在mapper.xml中寫很多重復的簡單CRUD(增刪改查),使用MybatisPlus可以大大簡化這部分代碼,官方文檔http://mp.baomidou.com/
二、引入MybatisPlus
先看一下我的項目結構,我們一步一步來編寫這個Demo,我的Model對象是一個獨立模塊,所以請自行修改自己的實體對象
1、創建一個Maven項目引入spring boot,打開pom.xml增加以下引入,其中包括alibaba連接池druid、mysql數據庫連接插件、mybatis-plus插件,切記不要引入mybatis及mybatis spring可能會有沖突
<dependencyManagement> <dependencies> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--import druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!--import mysql connector--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency> <!--import mybatis plus 它會自動引入mybatis及mybatis spring切勿重復引用以免沖突--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>2.3</version> </dependency> </dependencies>
2、建立resources文件夾並創建application.yml配置文件,增加以下配置,主要數據庫連接、mapper.xml、model實體的位置需要自己調整
#設置提供的服務名 spring: application: name: javademo-tyh-service-base #配置數據庫 datasource: driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://10.11.12.237:3306/tyh_test?useUnicode=true&characterEncoding=utf8 username: root password: root #設置自己啟動的端口 server: port: 12000 #mybatis plus mybatis-plus: #指明mapper.xml掃描位置(classpath* 代表編譯后類文件根目錄) mapper-locations: classpath*:/mapper/**Mapper.xml #指明實體掃描(多個package用逗號或者分號分隔) typeAliasesPackage: javademo.tyh.model.base;javademo.tyh.model.hotel; global-config: #主鍵類型 0:數據庫ID自增, 1:用戶輸入ID,2:全局唯一ID (數字類型唯一ID), 3:全局唯一ID UUID id-type: 0 #字段策略(拼接sql時用於判斷屬性值是否拼接) 0:忽略判斷,1:非NULL判斷,2:非空判斷 field-strategy: 2 #駝峰下划線轉換含查詢column及返回column(column下划線命名create_time,返回java實體是駝峰命名createTime,開啟后自動轉換否則保留原樣) db-column-underline: true #是否動態刷新mapper refresh-mapper: false #數據庫大寫命名下划線轉換 #capital-mode: true
3、在resources文件夾下創建mapper文件夾用於存放所有的mapper.xml文件,創建UserMapper.xml文件編寫一個自定義sql
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 指明當前xml對應的Mapper --> <mapper namespace="javademo.tyh.service.base.mapper.UserMapper"> <select id="listCount" resultType="Integer"> select count(*) from user_info; </select> </mapper>
4、打開main方法所在類,修改代碼指明掃描mapper接口所在包的位置
import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("javademo.tyh.service.base.mapper")//標記掃描的mapper位置 public class AppServiceBase { public static void main( String[] args ) { SpringApplication.run(AppServiceBase.class,args); } }
5、創建config文件夾用於存放mybatisplus的插件配置,目前只需要一個分頁插件
import com.baomidou.mybatisplus.plugins.PaginationInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPlusConfig { // 分頁攔截器 @Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); } }
6、創建mapper文件夾用於存放底層與xml的關聯mapper接口,要繼承BaseMapper並傳遞一個Model對象當作泛型,再寫一個自定義方法
import com.baomidou.mybatisplus.mapper.BaseMapper; import javademo.tyh.model.base.UserModel; import org.springframework.stereotype.Component; @Component public interface UserMapper extends BaseMapper<UserModel> { //自定義方法 int listCount(); }
7、創建service文件夾用於存放業務操作邏輯,此時自動注入mapper后可以調用很多mybatis plus提供的方法,基本的CRUD都不需要單獨寫了
import com.baomidou.mybatisplus.mapper.EntityWrapper; import javademo.tyh.model.base.UserModel; import javademo.tyh.service.base.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserService { @Autowired UserMapper mapper; public int insert(UserModel model) { return mapper.insert(model); } public int delete(int id) { return mapper.deleteById(id); } public int update(UserModel model) { //更新全部字段,但可以跟application.yml中的field-strategy字段策略相配合,不更新為null或為空的字段 return mapper.updateById(model); //更新全部字段,且不可為NULL //return mapper.updateAllColumnById(model); } public UserModel get(int id) { return mapper.selectById(id); } public List<UserModel> list() { EntityWrapper ew = new EntityWrapper(); ew.where("1={0}", 1); return mapper.selectList(ew); } //調用自定義方法 public int listCount(){ return mapper.listCount(); } }
8、創建controller文件夾用於接收請求和測試
import javademo.tyh.model.base.UserModel; import javademo.tyh.service.base.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.time.LocalDateTime; import java.util.List; @Controller @RequestMapping("/user") public class UserController { @Autowired private DiscoveryClient client; @Autowired UserService service; @ResponseBody @RequestMapping("/insert") public int insert() { UserModel model = new UserModel(); model.setUsername("taiyonghai"); model.setPassword("111111"); model.setSex(1); model.setAge(30); model.setCreateTime(LocalDateTime.now()); return service.insert(model); } @ResponseBody @RequestMapping("/delete") public int delete(int id) { return service.delete(id); } @ResponseBody @RequestMapping("/update") public int update() { UserModel model = new UserModel(); model.setId(1); model.setUsername("taiyonghai"+LocalDateTime.now()); model.setPassword("111111"); model.setSex(1); model.setAge(30); return service.update(model); } @ResponseBody @RequestMapping("/get") public UserModel get(int id) { return service.get(id); } @ResponseBody @RequestMapping("/list") public List<UserModel> list() { List<UserModel> list = service.list(); return list; } @ResponseBody @RequestMapping("/listCount") public int listCount() { return service.listCount(); } }
9、標記Model實體的注解,我就不粘貼get/set方法了自己生成吧
import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import java.io.Serializable; import java.time.LocalDateTime; //標記表名(此注解為必須,下面的字段注解可選) @TableName("user_info") public class UserModel implements Serializable { //標記數據表主鍵 @TableId(value = "id", type = IdType.AUTO) private int id; private String username; private String password; private int sex; private int age; private LocalDateTime createTime; //標記數據表中不存在的字段 @TableField(exist = false) private String showName; //標記數據表中的column名 @TableField("username") private String showUsername; }
由於我的模塊Model是獨立的所以需要對Model模塊增加pom.xml引用,由於不需要跟spring boot自動注入有什么關系所以直接只引用基本的即可
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.3</version> </dependency>
OK ,到此我們的MybatisPlus就引入完成,運行http://localhost:12000/user/list測試一下效果,官方文檔中推薦使用IService及ServiceImpl的接口及實現類的方式,這部分可以簡化,簡化后的效果就是這個Demo的樣子
注意:由於兩個模塊需要mybatis plus我有個父級pom.xml,而pom.xml文件有上下級繼承關系,如果父級有用到xxx-xxx-boot-starter的組件引用,子模塊中卻沒有相應的配置注入則會提示錯誤,要在main()方法對應的類中增加注解來解決
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)//禁止tomcat DataSource注入到spring boot中 @SpringBootApplication public class AppEureka { public static void main( String[] args ) { SpringApplication.run(AppEureka.class, args); } }