Spring Boot(六)集成 MyBatis 操作 MySQL 8
## 一、簡(jiǎn)介
1.1 MyBatis介紹
MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 避免了幾乎所有的 JDBC代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。
1.2 MyBatis發(fā)展史
MyBatis 原本是apache的一個(gè)開(kāi)源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis ,2013年11月遷移到Github。
1.3 MyBatis和Hibernate的區(qū)別
MyBatis 和 Hibernate 都是優(yōu)秀的持久化框架,都支持JDBC(Java DataBase Connection)和JTA(Java Transaction API)事務(wù)處理。
MyBatis 優(yōu)點(diǎn)
- 更加輕量級(jí),如果說(shuō)Hibernate是全自動(dòng)的框架,MyBatis就是半自動(dòng)的框架;
- 入門(mén)簡(jiǎn)單,即學(xué)即用,并且延續(xù)了很好的SQL使用經(jīng)驗(yàn);
Hibernate 優(yōu)點(diǎn)
- 開(kāi)發(fā)簡(jiǎn)單、高效,不需要編寫(xiě)SQL就可以進(jìn)行基礎(chǔ)的數(shù)據(jù)庫(kù)操作;
- 可移植行好,大大降低了MySQL和Oracle之間切換的成本(因?yàn)槭褂昧薍QL查詢,而不是直接寫(xiě)SQL語(yǔ)句);
- 緩存機(jī)制上Hibernate也好于MyBatis;
1.4 MyBatis集成方式
Mybatis集成方式分為兩種:
- 注解版集成
- XML版本集成
XML版本為老式的配置集成方式,重度集成XML文件,SQL語(yǔ)句也是全部寫(xiě)在XML中的;注解版版本,相對(duì)來(lái)說(shuō)比較簡(jiǎn)約,不需要XML配置,只需要使用注解和代碼來(lái)操作數(shù)據(jù)。
二、注解版 MyBatis 集成
開(kāi)發(fā)環(huán)境
- MySQL 8.0.12
- Spring Boot 2.0.4
- MyBatis Spring Boot 1.3.2(等于 MyBatis 3.4.6)
- JDK 8
- IDEA 2018.2
MyBatis Spring Boot 是 MyBatis 官方為了集成 Spring Boot 而推出的MyBatis版本。
2.1 添加依賴
設(shè)置pom.xml文件,添加如下配置
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.12</version> </dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version> </dependency>添加 MySQL 和 MyBatis 支持。
2.2 配置數(shù)據(jù)庫(kù)連接
設(shè)置application.properties文件,添加如下配置
# MyBatis 配置 spring.datasource.url=jdbc:mysql://172.16.10.79:3306/mytestdb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver mybatis.type-aliases-package=com.hello.springboot.mapper- spring.datasource.url 數(shù)據(jù)庫(kù)連接字符串
- spring.datasource.username 數(shù)據(jù)庫(kù)用戶名
- spring.datasource.password 數(shù)據(jù)庫(kù)密碼
- spring.datasource.driver-class-name 驅(qū)動(dòng)類型(注意MySQL 8.0的值是com.mysql.cj.jdbc.Driver和之前不同)
- mybatis.type-aliases-package 配置mapper包名
Mapper文件說(shuō)明
Mapper是MyBatis的核心,是SQL存儲(chǔ)的地方,也是配置數(shù)據(jù)庫(kù)映射的地方。
2.3 設(shè)置 MapperScan 包路徑
直接在啟動(dòng)文件SpringbootApplication.java的類上配置@MapperScan,這樣就可以省去,單獨(dú)給每個(gè)Mapper上標(biāo)識(shí)@Mapper的麻煩。
@SpringBootApplication @MapperScan("com.hello.springboot.mapper") public class SpringbootApplication {public static void main(String[] args) {SpringApplication.run(SpringbootApplication.class, args);} }2.4 添加代碼
為了演示的簡(jiǎn)潔性,我們不做太多的分層處理了,我們這里就分為:實(shí)體類、Mapper接口、Controller類,使用Controller直接調(diào)用Mapper接口進(jìn)行數(shù)據(jù)持久化處理。
User 類:
public class User {private Long id;private String name;private int age;private String pwd;//省去set、get方法 }UserMapper 接口:
public interface UserMapper {@Select("select * from user")@Results({@Result(property = "name", column = "name")})List<User> getAll();@Select("select * from user where id=#{id}")User getById(Long id);@Insert({"insert into user(name,age,pwd) values(#{name},#{age},#{pwd})"})void install(User user);@Update({"update user set name=#{name} where id=#{id}"})void Update(User user);@Delete("delete from user where id=#{id}")void delete(Long id); }可以看出來(lái),所有的SQL都是寫(xiě)在Mapper接口里面的。
Mapper里的注解說(shuō)明
- @Select 查詢注解
- @Result 結(jié)果集標(biāo)識(shí),用來(lái)對(duì)應(yīng)數(shù)據(jù)庫(kù)列名的,如果實(shí)體類屬性和數(shù)據(jù)庫(kù)屬性名保持一致,可以忽略此參數(shù)
- @Insert 插入注解
- @Update 修改注解
- @Delete 刪除注解
Controller 控制器:
@RestController @RequestMapping("/") public class UserController {@Autowiredprivate UserMapper userMapper;@RequestMapping("/")public ModelAndView index() {User user = new User();user.setAge(18);user.setName("Adam");user.setPwd("123456");userMapper.install(user);ModelAndView modelAndView = new ModelAndView("/index");modelAndView.addObject("count", userMapper.getAll().size());return modelAndView;} }到此為止,已經(jīng)完成了MyBatis項(xiàng)目的配置了,可以運(yùn)行調(diào)試了。
注解版GitHub源碼下載:https://github.com/vipstone/springboot-example/tree/master/springboot-mybatis
三、XML 版 MyBatis 集成
3.1 添加依賴
設(shè)置pom.xml文件,添加如下配置
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.12</version> </dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version> </dependency>添加 MySQL 和 MyBatis 支持。
3.2 配置數(shù)據(jù)庫(kù)連接
設(shè)置application.properties文件,添加如下配置
# MyBatis 配置 spring.datasource.url=jdbc:mysql://172.16.10.79:3306/mytestdb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver mybatis.type-aliases-package=com.hello.springboot.entity mybatis.config-locations=classpath:mybatis/mybatis-config.xml mybatis.mapper-locations=classpath:mybatis/mapper/*.xml- spring.datasource.url 數(shù)據(jù)庫(kù)連接字符串
- spring.datasource.username 數(shù)據(jù)庫(kù)用戶名
- spring.datasource.password 數(shù)據(jù)庫(kù)密碼
- spring.datasource.driver-class-name 驅(qū)動(dòng)類型(注意MySQL 8.0的值是com.mysql.cj.jdbc.Driver和之前不同)
- mybatis.type-aliases-package 實(shí)體類包路徑
- mybatis.config-locations 配置MyBatis基礎(chǔ)屬性
- mybatis.mapper-locations 配置Mapper XML文件
3.3 設(shè)置 MapperScan 包路徑
直接在啟動(dòng)文件SpringbootApplication.java的類上配置@MapperScan,這樣就可以省去,單獨(dú)給每個(gè)Mapper上標(biāo)識(shí)@Mapper的麻煩。
@SpringBootApplication @MapperScan("com.hello.springboot.mapper") public class SpringbootApplication {public static void main(String[] args) {SpringApplication.run(SpringbootApplication.class, args);} }3.4 配置XML文件
本示例設(shè)置兩個(gè)xml文件,在resource/mybatis下的mybatis-config.xml(配置MyBatis基礎(chǔ)屬性)和在resource/mybatis/mapper下的UserMapper.xml(用戶和數(shù)據(jù)交互的SQL語(yǔ)句)。
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><typeAliases><typeAlias alias="Integer" type="java.lang.Integer"/><typeAlias alias="Long" type="java.lang.Long"/><typeAlias alias="HashMap" type="java.util.HashMap"/><typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/><typeAlias alias="ArrayList" type="java.util.ArrayList"/><typeAlias alias="LinkedList" type="java.util.LinkedList"/></typeAliases> </configuration>UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace是命名空間,是mapper接口的全路徑--> <mapper namespace="com.hello.springboot.mapper.UserMapper"><!--resultMap – 是最復(fù)雜也是最強(qiáng)大的元素,用來(lái)描述如何從數(shù)據(jù)庫(kù)結(jié)果集中來(lái)加載對(duì)象--><resultMap id="userResultMap" type="com.hello.springboot.entity.User"><id property="name" column="username"></id></resultMap><!--sql – 可被其他語(yǔ)句引用的可重用語(yǔ)句塊--><sql id="colums">id,username,age,pwd</sql><select id="findAll" resultMap="userResultMap">select<include refid="colums" />from user</select><select id="findById" resultMap="userResultMap">select<include refid="colums" />from userwhere id=#{id}</select><insert id="insert" parameterType="com.hello.springboot.entity.User" >INSERT INTOuser(username,age,pwd)VALUES(#{name}, #{age}, #{pwd})</insert><update id="update" parameterType="com.hello.springboot.entity.User" >UPDATEusersSET<if test="username != null">username = #{username},</if><if test="pwd != null">pwd = #{pwd},</if>username = #{username}WHEREid = #{id}</update><delete id="delete" parameterType="java.lang.Long" >DELETE FROMuserWHEREid =#{id}</delete></mapper>SQL 映射文件有很少的幾個(gè)頂級(jí)元素(按照它們應(yīng)該被定義的順序):
- cache – 給定命名空間的緩存配置。
- cache-ref – 其他命名空間緩存配置的引用。
- resultMap – 是最復(fù)雜也是最強(qiáng)大的元素,用來(lái)描述如何從數(shù)據(jù)庫(kù)結(jié)果集中來(lái)加載對(duì)象。
- parameterMap – 已廢棄!老式風(fēng)格的參數(shù)映射。內(nèi)聯(lián)參數(shù)是首選,這個(gè)元素可能在將來(lái)被移除,這里不會(huì)記錄。
- sql – 可被其他語(yǔ)句引用的可重用語(yǔ)句塊。
- insert – 映射插入語(yǔ)句
- update – 映射更新語(yǔ)句
- delete – 映射刪除語(yǔ)句
- select – 映射查詢語(yǔ)句
注意: MyBatis中 config 和 mapper 的 XML 頭文件是不一樣的。
config 頭文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">mapper 頭文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">Mapper XML 更多配置:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
3.5 添加代碼
為了演示的便捷性,我們添加3個(gè)類用于功能的展示,分別是實(shí)體類User.java、mapper接口UserMapper.java和控制器類UserController.java,使用控制器類直接調(diào)用UserMapper的方法,進(jìn)行數(shù)據(jù)存儲(chǔ)和查詢。
User.java
package com.hello.springboot.entity; public class User {private Long id;private String name;private int age;private String pwd;//省略set/get方法 }UserMapper.java
package com.hello.springboot.mapper; import com.hello.springboot.entity.User; import java.util.List; public interface UserMapper {List<User> findAll();User findById(Long id);void insert(User user);void update(User user);void delete(Long id); }注意: Mapper里的方法名必須和Mapper XML里的一致,不然會(huì)找不到執(zhí)行的SQL。
UserController.java
@RestController @RequestMapping("/") public class UserController {@Resourceprivate UserMapper userMapper;@RequestMapping("/")public ModelAndView index() {User user = new User();user.setAge(18);user.setName("Adam");user.setPwd("123456");userMapper.insert(user);ModelAndView modelAndView = new ModelAndView("/index");modelAndView.addObject("count", userMapper.findAll().size());return modelAndView;}}到此為止,已經(jīng)完成了MyBatis項(xiàng)目的配置了,可以運(yùn)行調(diào)試了。
XML版GitHub源碼下載:https://github.com/vipstone/springboot-example/tree/master/springboot-mybatis-xml
四、總結(jié)
到目前為止我們已經(jīng)掌握了MyBatis的兩種集成方式,注解集成和XML集成,注解版更符合程序員的代碼書(shū)寫(xiě)習(xí)慣,適用于簡(jiǎn)單快速查詢;XML版可以靈活的動(dòng)態(tài)調(diào)整SQL,更適合大型項(xiàng)目開(kāi)發(fā),具體的選擇還要看開(kāi)發(fā)場(chǎng)景以及個(gè)人喜好了。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Spring Boot(六)集成 MyBatis 操作 MySQL 8的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 附录:更多有序集合操作命令
- 下一篇: 经典面试题|ConcurrentHash