本文重點給大家介紹spring boot mybatis 注解化的實例代碼,具體內容大家參考下本文:
pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
|
<!-- 引入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> |
基本SQL操作
spring boot已經自動實現了mybatis所有配置,直接寫dao接口即可
1
2
3
4
|
@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值
掃描Mapper
@MapperScan("hello.dao")
在配置類上添加以上注解,可以掃描dao包中的所有接口,替代在每個dao中寫@Mapper注解,不過這樣會提高耦合度。而@Mapper可以與dao自成一體,與@Controller、@Service遙相呼應,整體結構更優雅
駝峰命名
在properties中添加以下配置,在執行查詢后,可以將數據庫的NN_NN格式字段,在java結果集對象中自動轉換成駝峰命名參數
1
|
mybatis.configuration.mapUnderscoreToCamelCase= true |
結果映射@Results
如果結果集不是JAVA對象而是Map,map中的列名會和數據庫中的NN_NN一樣,是不會自動駝峰轉換的??梢允褂聾Result來指明結果映射,同樣也適用JAVA對象
1
2
3
4
5
|
@Results ({ @Result (property= "nnNn" ,column= "NN_NN" ) }) @Select ( "select * from user" ) public List<Map> findAll(); |
使用List<Map>不用去維護pojo,適于用數據庫字段不確定或經常變化的場景。但是程序的可讀性、可維護性不如List<User>
可復用的@Results
聲明時給id賦值為user
1
2
3
|
@Results (id= "user" ,value={ @Result (property= "nnNn" ,column= "NN_NN" ) }) |
在其他 方法中,重復使用id為user的結果映射
@ResultMap("user")
打印SQL日志到控制臺
在application.properties中添加以下配置
logging.level.你的包名.mybatis接口包=debug
執行SQL時,會在控制臺打印SQL日志
第一行:==>左邊是執行SQL的接口及其方法,右邊是執行語句
第二行:傳參數1,String類型
第三行:查到一行數據
分頁
首先要在pom.xml中引入文章開頭的分頁插件,分頁邏輯寫在service層。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@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對象的相關參數賦值
回傳ID
假設數據庫表的ID主鍵是自動增長的,現在添加一條數據,想要得到這條數據自動增長的ID,方法如下
dao層
useGeneratedKeys=true:獲取數據庫生成的主鍵
keyProperty="id":把主鍵值存入User param對象的id屬性
1
2
3
|
@Insert ( "insert into user(name) values(#{name})" ) @Options (useGeneratedKeys= true ,keyProperty= "id" ) public int add(User param); |
service層
1
2
3
4
|
User user = new User(); user.setName( "tom" ); mybatisDao.add(user); System.out.println( "回傳ID值:" +user.getId()); |
控制臺
存儲過程
這是一個mysql存儲過程,傳入一個id值,根據這個id查詢出name值并且做為傳出參數
1
2
3
4
5
6
|
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:說明這是一個存儲過程
1
2
3
|
@Select ( "call hello(#{id,mode=IN,jdbcType=VARCHAR},#{name,mode=OUT,jdbcType=VARCHAR})" ) @Options (statementType= StatementType.CALLABLE ) public void call(User user); |
service層
1
2
3
4
5
|
public void call(){ User user = new User(); user.setId( "14" ); mybatisDao.call(user); System.out.println(user.getName()); |
執行結果
總結
以上所述是小編給大家介紹的spring boot mybatis全注解化,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://blog.csdn.net/ztx114/article/details/78082294