Spring Boot入門系列(十八)整合mybatis,使用註解的方式實現增刪改查
之前介紹了Spring Boot 整合mybatis 使用xml配置的方式實現增刪改查,還介紹了自定義mapper 實現複雜多表關聯查詢。雖然目前 mybatis 使用xml 配置的方式 已經極大減輕了配置的複雜度,支援 generator 外掛 根據表結構自動生成實體類、配置檔案和dao層程式碼,減輕很大一部分開發量;但是 java 註解的運用發展到今天。約定取代配置的規範已經深入人心。開發者還是傾向於使用註解解決一切問題,註解版最大的特點是具體的 SQL 檔案需要寫在 Mapper 類中,取消了 Mapper 的 XML 配置 。這樣不用任何配置檔案,就可以簡單配置輕鬆上手。所以今天就介紹Spring Boot 整合mybatis 使用註解的方式實現資料庫操作 。
Spring Boot 整合mybatis 使用xml配置版之前已經介紹過了,不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html。
一、整合Mybatis
Spring Boot 整合Mybatis 的步驟都是一樣的,已經熟悉的同學可以略過。
1、pom.xml增加mybatis相關依賴
我們只需要加上pom.xml檔案這些依賴即可。
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.41</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <!--mapper--> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>1.2.4</version> </dependency> <!-- pagehelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.3</version> </dependency> <!-- druid 資料庫連線框架--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.9</version> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> <scope>compile</scope> <optional>true</optional> </dependency>
2、application.properties配置資料連線
application.properties中需要增加mybatis相關的資料庫配置。
############################################################ # 資料來源相關配置,這裡用的是阿里的druid 資料來源 ############################################################ spring.datasource.url=jdbc:mysql://localhost:3306/zwz_test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.druid.initial-size=1 spring.datasource.druid.min-idle=1 spring.datasource.druid.max-active=20 spring.datasource.druid.test-on-borrow=true spring.datasource.druid.stat-view-servlet.allow=true ############################################################ # mybatis 相關配置 ############################################################ mybatis.type-aliases-package=com.weiz.pojo mybatis.mapper-locations=classpath:mapper/*.xml mapper.mappers=com.weiz.utils.MyMapper #這個MyMapper 就是我之前建立的mapper統一介面。後面所有的mapper類都會繼承這個介面 mapper.not-empty=false mapper.identity=MYSQL # 分頁框架 pagehelper.helperDialect=mysql pagehelper.reasonable=true pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql
這裡的配置有點多,不過最基本的配置都在這。
3、在啟動主類新增掃描器
在SpringBootStarterApplication 啟動類中增加包掃描器。
@SpringBootApplication
//掃描 mybatis mapper 包路徑
@MapperScan(basePackages = "com.weiz.mapper") // 這一步別忘了。
//掃描 所有需要的包, 包含一些自用的工具類包 所在的路徑
@ComponentScan(basePackages = {"com.weiz","org.n3r.idworker"})
public class SpringBootStarterApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootStarterApplication.class, args);
}
}
注意:這一步別忘了,需要在SpringBootStarterApplication 啟動類中增加包掃描器,自動掃描載入com.weiz.mapper 裡面的mapper 類。
以上,就把Mybatis 整合到專案中了。 接下來就是建立表和pojo類,mybatis提供了強大的自動生成功能。只需簡單幾步就能生成pojo 類和mapper。
二、程式碼自動生成工具
Mybatis 整合完之後,接下來就是建立表和pojo類,mybatis提供了強大的自動生成功能的外掛。mybatis generator外掛只需簡單幾步就能生成pojo 類和mapper。操作步驟和xml 配置版也是類似的,唯一要注意的是 generatorConfig.xml 的部分配置,要配置按註解的方式生成mapper 。
1、增加generatorConfig.xml配置檔案
在resources 檔案下建立 generatorConfig.xml 檔案。此配置檔案獨立於專案,只是給自動生成工具類的配置檔案,具體配置如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressDate" value="true"/> <!-- 是否去除自動生成的註釋 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--資料庫連結URL,使用者名稱、密碼 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/zwz_test" userId="root" password="root"> </jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成模型的包名和位置--> <javaModelGenerator targetPackage="com.weiz.pojo" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成對映檔案的包名和位置--> <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成DAO的包名和位置--> <!-- XMLMAPPER生成xml對映檔案, ANNOTATEDMAPPER生成的dao採用註解來寫sql --> <javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.weiz.mapper" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 要生成的表 tableName是資料庫中的表名或檢視名 domainObjectName是實體類名--> <table tableName="sys_user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table> </context> </generatorConfiguration>
注意:
這裡的配置 <javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.weiz.mapper" targetProject="src/main/java">
type 的值很重要:
XMLMAPPER : 表示生成xml對映檔案。
ANNOTATEDMAPPER: 表示生成的mapper 採用註解來寫sql。
2、資料庫User表
需要在資料庫中建立相應的表。這個表結構很簡單,就是普通的使用者表sys_user。
CREATE TABLE `sys_user` ( `id` varchar(32) NOT NULL DEFAULT '', `username` varchar(32) DEFAULT NULL, `password` varchar(64) DEFAULT NULL, `nickname` varchar(64) DEFAULT NULL, `age` int(11) DEFAULT NULL, `sex` int(11) DEFAULT NULL, `job` int(11) DEFAULT NULL, `face_image` varchar(6000) DEFAULT NULL, `province` varchar(64) DEFAULT NULL, `city` varchar(64) DEFAULT NULL, `district` varchar(64) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, `auth_salt` varchar(64) DEFAULT NULL, `last_login_ip` varchar(64) DEFAULT NULL, `last_login_time` datetime DEFAULT NULL, `is_delete` int(11) DEFAULT NULL, `regist_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
3、建立GeneratorDisplay類
package com.weiz.utils; import java.io.File; import java.util.ArrayList; import java.util.List; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; public class GeneratorDisplay { public void generator() throws Exception{ List<String> warnings = new ArrayList<String>(); boolean overwrite = true; //指定 逆向工程配置檔案 File configFile = new File("generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } public static void main(String[] args) throws Exception { try { GeneratorDisplay generatorSqlmap = new GeneratorDisplay(); generatorSqlmap.generator(); } catch (Exception e) { e.printStackTrace(); } } }
這個其實也是呼叫mybatis generator實現的。跟mybatis generator安裝外掛是一樣的。
注意:利用Generator自動生成程式碼,對於已經存在的檔案會存在覆蓋和在原有檔案上追加的可能性,不宜多次生成。如需重新生成,需要刪除已生成的原始檔。
4、Mybatis Generator自動生成pojo和mapper
執行GeneratorDisplay 如下圖所示,即可自動生成相關的程式碼。
上圖可以看到,pojo 包裡面自動生成了User 實體物件 ,mapper包裡面生成了 UserMapper 和UserSqlProvider 類。UserMapper 是所有方法的實現。UserSqlProvider則是為UserMapper 實現動態SQL。
注意:
UserMapper 中的所有的動態SQL指令碼,都定義在類UserSqlProvider中。若要增加新的動態SQL,只需在UserSqlProvider中增加相應的方法,然後在UserMapper中增加相應的引用即可,
如:@UpdateProvider(type=UserSqlProvider.class, method="updateByPrimaryKeySelective")。
三、實現增刪改查
在專案中整合了Mybatis並通過自動生成工具生成了相關的mapper和配置檔案之後,下面就開始專案中的呼叫。這個和之前的xml 配置版也是一樣的。
1、在service包下建立UserService及UserServiceImpl介面實現類
建立com.weiz.service包,新增UserService介面類
package com.weiz.service; import com.weiz.pojo.User; public interface UserService { public int saveUser(User user); public int updateUser(User user); public int deleteUser(String userId); public User queryUserById(String userId); }
建立com.weiz.service.impl包,並增加UserServiceImpl實現類,並實現增刪改查的功能,由於這個程式碼比較簡單,這裡直接給出完整的程式碼。
package com.weiz.service.impl; import com.weiz.mapper.UserMapper; import com.weiz.pojo.User; import com.weiz.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public int saveUser(User user) { return userMapper.insertSelective(user); } @Override public int updateUser(User user) { return userMapper.updateByPrimaryKeySelective(user); } @Override public int deleteUser(String userId) { return userMapper.deleteByPrimaryKey(userId); } @Override public User queryUserById(String userId) { return userMapper.selectByPrimaryKey(userId); } }
2、編寫controller層,增加MybatisController控制器
package com.weiz.controller; import com.weiz.pojo.User; import com.weiz.utils.JSONResult; import com.weiz.service.UserService; import org.n3r.idworker.Sid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Date; @RestController @RequestMapping("mybatis") public class MyBatisCRUDController { @Autowired private UserService userService; @Autowired private Sid sid; @RequestMapping("/saveUser") public JSONResult saveUser() { String userId = sid.nextShort(); User user = new User(); user.setId(userId); user.setUsername("spring boot" + new Date()); user.setNickname("spring boot" + new Date()); user.setPassword("abc123"); user.setIsDelete(0); user.setRegistTime(new Date()); userService.saveUser(user); return JSONResult.ok("儲存成功"); } @RequestMapping("/updateUser") public JSONResult updateUser() { User user = new User(); user.setId("10011001"); user.setUsername("10011001-updated" + new Date()); user.setNickname("10011001-updated" + new Date()); user.setPassword("10011001-updated"); user.setIsDelete(0); user.setRegistTime(new Date()); userService.updateUser(user); return JSONResult.ok("儲存成功"); } @RequestMapping("/deleteUser") public JSONResult deleteUser(String userId) { userService.deleteUser(userId); return JSONResult.ok("刪除成功"); } @RequestMapping("/queryUserById") public JSONResult queryUserById(String userId) { return JSONResult.ok(userService.queryUserById(userId)); } }
3、測試
在瀏覽器輸入controller裡面定義的路徑即可。只要你按照上面的步驟一步一步來,基本上就沒問題,是不是特別簡單。
最後
以上,就把Spring Boot整合Mybatis註釋版 實現增刪改查介紹完了,Spring Boot 整合Mybatis 是整個Spring Boot 非常重要的功能,也是非常核心的基礎功能,希望大家能夠熟練掌握。後面會深入介紹Spring Boot的各個功能和用法。
這個系列課程的完整原始碼,也會提供給大家。大家關注我的微信公眾號(架構師精進),回覆:springboot原始碼。獲取這個系列課程的完整原始碼。
&n