1. 程式人生 > >詳解spring boot mybatis全註解化

詳解spring boot mybatis全註解化

color 引入 自動增長 type cat OS TE myba IV

  本文重點介紹spring boot mybatis 註解化的實例代碼

1、pom.xml

//引入mybatis
<dependency> 
  <groupId>org.mybatis.spring.boot</groupId> 
  <artifactId>mybatis-spring-boot-starter</artifactId> 
  <version>1.3.0</version> 
</dependency> 
// mybatis分頁插件
<dependency> 
  <groupId>com.github.pagehelper</groupId> 
  <artifactId>pagehelper-spring-boot-starter</artifactId> 
  <version>1.1
.1</version> </dependency>

2、基本SQL操作

  spring boot已經自動實現了mybatis所有配置,直接寫dao接口即可

@Mapper
public interface MybatisDao { 
  @Select("select * from user where id = #{id}") 
  public List<User> findById(User param);

  @Mapper:聲明一個mybatis的dao接口,會被spring boot掃描到

  @Select:聲明一個查詢方法,相應的增、刪、改使用:@Insert、 @Delete、 @Update

  List<User>:返回集合。如果只返回一個結果,返回值是User。如果是增、刪、改方法,返回值是int

  User param:傳參,#{id}就是param對象的id值

3、掃描Mapper

@MapperScan("hello.dao")

  在配置類上添加以上註解,可以掃描dao包中的所有接口,替代在每個dao中寫@Mapper註解,不過這樣會提高耦合度

  而@Mapper可以與dao自成一體,與@Controller、@Service遙相呼應,整體結構更優雅

4、駝峰命名

  在properties中添加以下配置,在執行查詢後,可以將數據庫的NN_NN格式字段,在java結果集對象中自動轉換成駝峰命名參數

mybatis.configuration.mapUnderscoreToCamelCase=true

5、結果映射@Results

  如果結果集不是JAVA對象而是Map,map中的列名會和數據庫中的NN_NN一樣,是不會自動駝峰轉換的

  可以使用@Result來指明結果映射,同樣也適用JAVA對象

@Results({ 
  @Result(property="nnNn",column="NN_NN")   
}) 
@Select("select * from user")   
public List<Map> findAll();

  使用List<Map>不用去維護pojo,適於用數據庫字段不確定或經常變化的場景。但是程序的可讀性、可維護性不如List<User>

6、可復用的@Results

  聲明時給id賦值為user

@Results(id="user",value={ 
  @Result(property="nnNn",column="NN_NN") 
})

  在其他方法中,重復使用id為user的結果映射:@ResultMap("user")

7、打印SQL日誌到控制臺

  在application.properties中添加以下配置:logging.level.你的包名.mybatis接口包=debug

  執行SQL時,會在控制臺打印SQL日誌

  第一行:==>左邊是執行SQL的接口及其方法,右邊是執行語句

  第二行:傳參數1,String類型

  第三行:查到一行數據

8、分頁

  首先要在pom.xml中引入文章開頭的分頁插件,分頁邏輯寫在service層。

@Service
@Transactional
public class HelloServiceImpl { 
  @Autowired
  MybatisDao mybatisDao; 
  public void find(){  
    //分頁插件: 查詢第1頁,每頁10行 
    Page<User> page =PageHelper.startPage(1, 10);  
    mybatisDao.findAll();  
    //數據表的總行數 
    page.getTotal(); 
    //分頁查詢結果的總行數 
    page.size(); 
    //第一個User對象,參考list,序號0是第一個元素,依此類推 
    page.get(0); 
  }

  執行原理:

  PageHelper.startPage會攔截下一個sql,也就是mybatisDao.findAll()的SQL。並且根據當前數據庫的語法,把這個SQL改造成一個高性能的分頁SQL,同時還會查詢該表的總行數,具體可以看SQL日誌。

  PageHelper.startPage和mybatisDao.findAll()最好緊跟在一起,中間不要有別的邏輯,否則可能出BUG

  Page<User> page:相當於一個list集合,findAll()方法查詢完成後,會給page對象的相關參數賦值

9、回傳ID

  假設數據庫表的ID主鍵是自動增長的,現在添加一條數據,想要得到這條數據自動增長的ID,方法如下

  dao層

  useGeneratedKeys=true:獲取數據庫生成的主鍵

  keyProperty="id":把主鍵值存入User param對象的id屬性

@Insert("insert into user(name) values(#{name})") 
@Options(useGeneratedKeys=true,keyProperty="id")  
public int add(User param);

  service層

User user = new User(); 
user.setName("tom"); 
mybatisDao.add(user); 
System.out.println("回傳ID值:"+user.getId());

10、控制臺

  存儲過程

  這是一個mysql存儲過程,傳入一個id值,根據這個id查詢出name值並且做為傳出參數

DELIMITER $$ 
CREATE PROCEDURE `hello`(IN id_in VARCHAR(10),OUT name_out VARCHAR(10)) 
BEGIN 
     SELECT NAME INTO name_out FROM USER WHERE id=id_in; 
  END$$ 
DELIMITER ;

  dao層

  mode=IN:傳入參數,就是user.id

  mode=OUT:傳出參數,就是user.name

  StatementType.CALLABLE:說明這是一個存儲過程

@Select("call hello(#{id,mode=IN,jdbcType=VARCHAR},#{name,mode=OUT,jdbcType=VARCHAR})") 
@Options(statementType= StatementType.CALLABLE ) 
public void call(User user);

  service層

public void call(){ 
  User user = new User(); 
  user.setId("14"); 
  mybatisDao.call(user); 
  System.out.println(user.getName());
}

  執行結果

技術分享圖片

詳解spring boot mybatis全註解化