Spring Boot整合Mybatis基礎參考文章: Spring Boot一步步整合Mybatis框架
Mybatis中每一個實體類都有一個對應的mapper.xml文件,這個文件除了用工具根據數據庫表生成的源碼外,我們還可以加入自己的sql語句。
但是直接在這個文件中加入自己的sql語句話,會比較麻煩。
比如說當你要在某張表新增字段時候,就需要重新生成這個表對應的mapper.xml文件,這時候你寫的sql語句還要手動復制過來,顯然這樣子不太方便。
如果把我們自己寫的sql語句放在一個擴展文件中,那樣的話就顯得比較方便了,那么該怎么做呢?下面以user表為例說明
1、dao層的定義
創建擴展基類BaseMapperExt.java,以后有什么公共方法定義在這個接口文件就可以了
package com.beibei.doc.dao.base;
import java.util.List;
import com.beibei.doc.util.Page;
/**
* 擴展基類
* @author beibei
*
* @param <M> 實體類
* @param <E> 實體類對應的example類
*/
public interface BaseMapperExt<M, E> {
}
創建UserMapperExt.java接口類,繼承基類,再定義一個方法用于測試
package com.beibei.doc.dao.user.ext;
import com.beibei.doc.model.user.User;
public interface UserMapperExt extends BaseMapperExt<User, UserExample> {
public User selectById(Integer id);
}
2、重新調整mybatis目錄,如圖
藍色部分是擴展類UserMapperExt.java放置的目錄,mybatis目錄中新建兩個文件夾,base中放置生成的mapper.xml文件,ext文件夾中放置擴展的mapper.xml文件,這樣做主要是為了方便構建SqlSessionFactory時候讀取,統一匹配 classpath:/mybatis/*/*/*.xml
(注:最新發現用兩個星號 ** 可以匹配路徑中零到多個目錄,即可以匹配classpath:/mybatis/**/*.xml可以同時匹配mybatis/*.xml,也可以匹配mybatis/base*.xml和mybatis/base/user*.xml等等)
public SqlSessionFactory sqlSessionFactory(){
SqlSessionFactory factory = null;
try {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource());
//讀取mybatis各個類的 *mapper.xml文件,這個地方的locationPattern一定要寫對,不然會找不到輸入的mapper.xml文件
String locationPattern = "classpath*:/mybatis/*/*/*.xml";
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources(locationPattern);
List<Resource> filterResourceList = new ArrayList<Resource>();
List<String> fileNameList = new ArrayList<String>();
for (int i=0; i<resources.length; i++){
Resource resource = resources[i];
if(!fileNameList.contains(resource.getFilename())){
filterResourceList.add(resource);
fileNameList.add(resource.getFilename());
}
}
Resource[] result = new Resource[filterResourceList.size()];
sessionFactoryBean.setMapperLocations(filterResourceList.toArray(result));
factory = (SqlSessionFactory) sessionFactoryBean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return factory;
}
3、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.beibei.doc.dao.user.ext.UserMapperExt" >
<resultMap id="ExtResultMap" extends="com.beibei.doc.dao.user.UserMapper.BaseResultMap" type="com.beibei.doc.model.user.User" >
</resultMap>
<select id="selectById" resultMap="ExtResultMap" parameterType="java.lang.Integer" >
select
<include refid="com.beibei.doc.dao.user.UserMapper.Base_Column_List"></include>
from user
where id = #{id,jdbcType=INTEGER}
</select>
</mapper>
說明: <resultMap標簽中可通過命名空間.id來繼承另外一個mapper文件中的代碼片段,比如代碼中extends="com.beibei.doc.dao.user.UserMapper.BaseResultMap"可以繼承UserMapper.xml中BaseResultMap,里面的一些代碼就可以不用重復寫了。
<include標簽中可以可通過命名空間.id來引用另外一個mapper文件中的代碼片段,比如refid="com.beibei.doc.dao.user.UserMapper.Base_Column_List"中就是引用UserMapper.xml中的Base_Column_List。
4、在service層中加入業務方法引用我們自定義的mapper方法。
UserService.java中定義方法:
public User selectById(Integer id);
UserServiceImpl.java中實現,UserMapperExt對象同樣用@Autowired自動注入:
@Autowired
private UserMapperExt userMapperExt;
@Override
public User selectById(Integer id) {
return this.userMapperExt.selectById(id);
}
5、在接口中調用測試
@Autowired
private UserService userService;
@RequestMapping(value="/say")
public String say(){
User user = userService.selectById(1);
if(user == null){
return null;
}
return user.getUsername() + ", 年齡=" + user.getAge();
}
瀏覽器中訪問,結果如下:
通過上面的方式,就可以愉快的編寫自定義sql語句了,從而充分發揮mybatis框架的靈活性。