本節(jié)利用Mybatis實(shí)現(xiàn)數(shù)據(jù)庫相關(guān)操作赋荆,數(shù)據(jù)庫選擇mysql
Mybatis的配置分為兩個(gè)版本邪狞,注解版與XML版挖垛,兩種版本使用場景有些許不同咳秉。
注解版
-
配置依賴
mybatis-spring-boot-starter
是mybatis針對spring推出的框架婉支,簡單易用。在pom.xml中最好指定一下它的版本澜建。而Mysql模塊與Web模塊不用多說向挖。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
-
applicaiton.properties
mybatis.type-aliases-package
用于配置類型別名的包名,在映射時(shí)只需要寫類名就足夠了
spring.datasource.url
炕舵、username
與 password
不用多說何之,注意所用數(shù)據(jù)庫的名稱及參數(shù)
spring.datasource.driver-class-name
用于配置mysql驅(qū)動(dòng)
mybatis.type-aliases-package=com.example.datasource-demo.model
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
這些配置會(huì)被Spring Boot自動(dòng)加載從而將數(shù)據(jù)源注入進(jìn) SqlSessionFactory
中。同時(shí)SqlSessionFactory
也會(huì)自動(dòng)注入到 Mapper
中咽筋。
-
表結(jié)構(gòu)
-
實(shí)體類
此處我使用了 Lombok
插件溶推,引入了 @Data
注解,可以免去 get
/ set
-
Mapper
注解版最大的特點(diǎn)就是Sql語句可以直接以注解的形式寫在mapper接口中
那么如何讓SpringBoot識別到這個(gè)mapper呢奸攻?添加 @Mapper
注解是一個(gè)方式蒜危,但需要在每一個(gè)Mapper上都添加一個(gè)注解,更簡便的方式是在啟動(dòng)類中添加注解睹耐,自動(dòng)掃描mapper包辐赞。
-
Controller
為了測試方便,簡單寫了一個(gè)delete接口硝训,別忘了為Controller加上@RestController注解
@RequestMapping(value = "/delete/{id}")
public void delete(@PathVariable("id") Long id) {
userMapper.delete(id);
}
-
測試結(jié)果
- user表中數(shù)據(jù)
user表-
測試delete接口
delete接口 -
id為1的字段被刪除
此時(shí)表中數(shù)據(jù)
XML版
application.yml
yml文件與properties文件同是配置文件响委,區(qū)別在于前者通過樹形結(jié)構(gòu)分層,使得層次更加分明窖梁,后者則相對比較直接赘风,當(dāng)工程中同時(shí)存在application.properties文件和 application.yml文件時(shí),yml文件中的配置優(yōu)先級會(huì)更高纵刘,所以保險(xiǎn)起見贝次,工程中只用一種類型即可。
application.yml配置內(nèi)容:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
type-aliases-package: com.example.datasource-demo.model
可以見到彰导,相比于注解版蛔翅,配置文件中新增了mybatis的內(nèi)容鳞青,config-location
指定了配置文件的路徑盔夜,mapper-locations
指定了映射xml文件的路徑,type-aliases-package
在上文解釋過。
mybatis-config.xml
在applicaiton.yml中我們配置了config-location
,這個(gè)配置文件需要我們自行創(chuàng)建宇立,特別注意頭文件不能遺漏
<?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版與注解版最大的不同就是sql語句是存放在獨(dú)立的映射xml文件中的兜叨,根據(jù)我們在配置文件中的路徑創(chuàng)建UserMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.datasourcedemo.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.example.datasourcedemo.model.User">
<id column="id" property="id" jdbcType="BIGINT" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="nick_name" property="nickName" jdbcType="VARCHAR" />
</resultMap>
<sql id="Base_Column_List" >
id, username, password, nick_name
</sql>
<select id="getAll" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM user
</select>
<select id="getOne" parameterType="java.lang.Long" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM user
WHERE id = #{id}
</select>
</mapper>
而UserMapper接口只需要定義接口方法即可聂沙,無需注解
public interface UserMapper {
List<User> getAll();
User getOne(Long id);
}
運(yùn)行項(xiàng)目家浇,結(jié)果與注解版并無二致
// http://localhost:8080/getUser?id=2
{
"code": 200,
"message": "查詢用戶成功",
"data": {
"id": 2,
"username": "jerry",
"password": "123123",
"nickName": "Jerry"
}
}
如何選擇
兩種模式各有特點(diǎn)與適用場景,注解版適合簡單快速的模式爵政,適合無需大量多表連接查詢的情況仅讽,而xml模式則更適合傳統(tǒng)中大型項(xiàng)目,靈活地生成Sql钾挟。