Spring Boot學習日誌(四)使用Mybatis
前言
之前簡單介紹了一下Soring Boot Jpa操作Mysql資料庫的相關方法,但是在使用Jpa的時候總有寫不習慣,比如:複雜的邏輯使用Jpa的規則生成Sql總覺得很麻煩,如果直接在 @Query裡面寫Sql總是不那麼的“舒服”,下面開始關於MyBatis相關的使用。
新增依賴
<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>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId >
<scope>runtime</scope>
</dependency>
配置檔案application.properties
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowMultiQueries=true&&useSSL=false
spring.datasource.username = root
spring.datasource.password = root
#mapper掃描範圍
mybatis.mapperLocations=classpath:mapper/**/*.xml
#entity位置
mybatis.typeAliasesPackage=com.example.mybatis_demo.entity
使用mybatis有兩種方法,一種是使用註解的方式,一種是使用xml配置檔案的方式,這裡選擇xml配置檔案的形式介紹。
mybatis.mapperLocations:設定xml檔案的位置,這裡xml裡寫sql語句
mybatis.typeAliasesPackage:設定實體類所在位置
測試表結構
CREATE TABLE `tb_user` (
`id` int(11) NOT NULL,
`username` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
`group` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
CREATE TABLE `tb_group` (
`id` varchar(20) DEFAULT NULL,
`group` int(11) NOT NULL DEFAULT '0',
`groupname` varchar(20) CHARACTER SET utf8mb4 DEFAULT NULL,
PRIMARY KEY (`group`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
建立實體類
public class User {
private Integer id;
private String userName;
private Integer group;
省略get和set方法
}
建立Mybatis配置檔案
由於spring在啟動時不知道mapper介面位置在什麼地方,所以要做一個設定告訴spring程式mapper所在的位置,資料來源就會自動注入到sqlSessionFactory中
@Configuration
public class MyBatisMapperConfig {
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
mapperScannerConfigurer.setBasePackage("com.example.mybatis_demo.mapper");
return mapperScannerConfigurer;
}
}
建立Mapper介面
public interface UserMapper {
/**
* 查詢使用者
* @param user
* @return
*/
List<User> queryUser(User user);
/**
* 新增使用者
* @param user
* @return
*/
Integer insertUser(User user);
/**
* 更新使用者資訊
* @param user
* @return
*/
Boolean updateUser(User user);
/**
* 刪除使用者
* @param user
* @return
*/
Integer deleteUser(User user);
}
建立Mapper對應的sql
上邊的操作已經建立了使用者相關的增改查,但是僅僅建立了介面,還沒有具體的實現,具體的實現怎麼做呢?
#mapper掃描範圍
mybatis.mapperLocations=classpath:mapper/**/*.xml
配置檔案裡已經設定了mapper的掃描範圍,在這裡建立相應的.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.mybatis_demo.mapper.UserMapper">
<select id="queryUser" resultType="com.example.mybatis_demo.entity.User">
select * from tb_user
<where>
<if test="id!= null ">
id =#{id}
</if>
</where>
</select>
<insert id="insertUser" parameterType="com.example.mybatis_demo.entity.User">
insert into tb_user(
id,
username,
groupid
)
values(
#{id},
#{userName},
#{groupid}
)
</insert>
<update id="updateUser" parameterType="com.example.mybatis_demo.entity.User">
UPDATE tb_user
<set>
<if test="userName!=null and userName!='' ">
username= #{userName},
</if>
<if test="groupid!=null">
groupid= #{groupid},
</if>
</set>
WHERE id= #{id};
</update>
<delete id="delete" parameterType="int">
delete from tb_user where id=#{id}
</delete>
</mapper>
需要注意的地方有:
.xml配置檔案
<mapper namespace="com.example.mybatis_demo.mapper.UserMapper">
這裡寫的是之前建立的介面的地址,地址要寫全(包名+介面名)
resultType="com.example.mybatis_demo.entity.User"
sql查詢之後資料返回型別
parameterType="com.example.mybatis_demo.entity.User"
sql新增或者修改返回操作後的實體
parameterType="int"
sql刪除資料之後返回操作成功的個數
<set>
<if test="username!=null and username!='' ">
username= #{username},
</if>
<if test="group!=null">
group= #{group},
</if>
</set>
#{userName}表示mapper介面傳遞過來的User類的userName屬性的值
這裡因為username是String型別,所以要判斷username不為null並且不為空
而group是Integer,只要判斷是否為空就可以了
編寫控制器
@RestController
@RequestMapping(value = "/user")
public class UserController {
@Autowired
private UserMapper mapper;
@RequestMapping(value = "/list",method = RequestMethod.GET)
public Object queryUser(User user) {
return mapper.queryUser(user);
}
@RequestMapping(value = "/insert",method = RequestMethod.GET)
public Object insertUser(User user) {
return mapper.insertUser(user);
}
@RequestMapping(value = "/update",method = RequestMethod.GET)
public Object updateUser(User user) {
return mapper.updateUser(user);
}
@RequestMapping(value = "/delete",method = RequestMethod.GET)
public Object deleteUser(User user) {
return mapper.deleteUser(user);
}
}
這裡的UserMapper和Jpa一樣,無需例項化,只需新增 @Autowired註解就可以使用,mybatis會自動執行.xml檔案裡的sql語句。
測試
和上一章一樣,資料庫理有三條資料如下所示
先測試一下檢索,如果不加引數,會檢索出所有資料
http://127.0.0.1:8080/user/list
可以看到和預期一樣,三條資料都被檢索出來了。
再測試一下條件檢索
http://127.0.0.1:8080/user/list?id=1
只檢索出來了一條資料,也是符合預期的
再測試一下新增資料
http://127.0.0.1:8080/user/insert?id=4&userName=測試&groupid=2
可以看到資料已經新增進去了
更新資料
http://127.0.0.1:8080/user/update?id=4&groupid=3
刪除資料
http://127.0.0.1:8080/user/delete?id=4
結果和過程大致相同,就不再一一描述