1. 程式人生 > >spring boot 學習之路3( 集成mybatis )

spring boot 學習之路3( 集成mybatis )

sys pat min lba asn ria [] system emp

下面就簡單來說一下spring boot 與mybatiis的整合問題,如果你還沒學習spring boot的註解的話,要先去看spring boot的註解

好了,現在讓我們來搞一下與mybatis的整合吧,在整合過程中,我會把遇到的問題也說出來,希望可以讓大家少走彎路!

首先,是在pom.xml中添加一些依賴

  1. 這裏用到spring-boot-starter基礎和spring-boot-starter-test用來做單元測試驗證數據訪問
  2. 引入連接mysql的必要依賴mysql-connector-java
  3. 引入整合MyBatis的核心依賴mybatis-spring-boot-starter
  4. 這裏不引入spring-boot-starter-jdbc依賴,是由於mybatis-spring-boot-starter中已經包含了此依賴

pom.xml部分依賴如下:

    

<!--lombok用於實體類,[email protected]-->
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId
> <artifactId>lombok</artifactId> <version>1.16.10</version> <scope>provided</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</
artifactId> <version>5.1.21</version> </dependency> <!--mybatis--> <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency>

註意,在上面依賴中,我多加了一個lombok的依賴,與本應用沒多大關系,不要也是可以的,不影響項目運行。具體作用是實體類上通過註解來替代get/set tosSring()等,具體用法參考lombok的簡單介紹(1)

application.properties中配置mysql的連接配置:

    

 1 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/spring
 2 spring.datasource.username=root
 3 spring.datasource.password=123456
 4 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 5 spring.datasource.max-idle=10
 6 spring.datasource.max-wait=10000
 7 spring.datasource.min-idle=5
 8 spring.datasource.initial-size=5
 9 server.session.timeout=10
10 server.tomcat.uri-encoding=UTF-8
11 #連接mybatis 和在springmvc中一致,要制定mybatis配置文件的路徑 上面是連接jdbcTemplate  相當於連接jdbc
12 # mybatis.config= classpath:mybatis-config.xml
13 #mybatis.mapperLocations=classpath:mappers/*.xml
14 
15 #mybatis.mapper-locations=classpath*:mappers/*Mapper.xml
16 #mybatis.type-aliases-package=com.huhy.web.entity
17 
18 spring.view.prefix=/WEB-INF/jsp/
19 spring.view.suffix=.jsp
20 
21 #設置端口
22 server.port=9999
23 #指定server綁定的地址
24 server.address=localhost
25 #設置項目訪問根路徑  不配置,默認為/
26 server.context-path=/

上面這些配置具體什麽意義我就在這不多解釋了,這些配置好之後,就可以搞代碼開發了。

首先創建一個User類:

    

 1 package com.huhy.web.entity;
 2 
 3 import lombok.AllArgsConstructor;
 4 import lombok.Data;
 5 import lombok.NoArgsConstructor;
 6 
 7 /**
 8  * Created by ${huhy} on 2017/8/5.
 9  */
10 @Data
11 @NoArgsConstructor
12 @AllArgsConstructor
13 public class User {
14     private String id;
15     private String name;
16     private int age;
17 }

實體類中我用到的註解是來自lombok中的,[email protected], @NoArgsConstructor, @AllArgsConstructor這幾個註解,和我們寫出來那些get/set,有參無參,toString 是一樣的

UserMapper接口

    

 1 package com.huhy.web.mapper;
 2 
 3 import com.huhy.web.entity.User;
 4 import org.apache.ibatis.annotations.Insert;
 5 import org.apache.ibatis.annotations.Mapper;
 6 import org.apache.ibatis.annotations.Param;
 7 import org.apache.ibatis.annotations.Select;
 8 
 9 /**
10  * @Author:{huhy}
11  * @DATE:Created on/8/5 22:19
12  * @Class Description:
13  */
14 @Mapper
15 public interface UserMapper {
16     /*
17     * 通過id查詢對應信息
18     * */
19     @Select("SELECT * FROM USER WHERE id = #{id}")
20     User selectByPrimaryKey(String id);
21     /*
22     * 通過name 查詢對應信息
23     * */
24     @Select("Select * from user where name = #{name} and id = #{id}")
25     User selectByName(@Param("name") String name, @Param("id") String id);
26 
27     /**
28      * @param id
29      * @param name
30      * @param age
31      * @return
32      */
33     @Insert("INSERT INTO USER(id,NAME, AGE) VALUES(#{id},#{name}, #{age})")
34     int insert(@Param("id") String id,@Param("name") String name, @Param("age") Integer age);
35 }

在mapper通過註解編程寫的,你也可以通過配置文件的形式,在.properties也有,只是被我註釋了,現在統一用註解開發。

  Service

  

 1 package com.huhy.web.service.impl;
 2 
 3 import com.huhy.web.entity.User;
 4 import com.huhy.web.mapper.UserMapper;
 5 import com.huhy.web.service.UserService;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.stereotype.Service;
 8 
 9 /**
10  * @Author:{huhy}
11  * @DATE:Created on 2017/8/5 22:18
12  * @Class Description:
13  */
14 @Service
15 public class UserServiceImpl implements UserService{
16 
17     @Autowired
18     private UserMapper userMapper;
19 
20     @Override
21     public User queryById(String id) {
22         User user = userMapper.selectByPrimaryKey(id);
23         return user;
24     }
25 
26     public User queryByName(String name,String id){
27         User user = userMapper.selectByName(name,id);
28         return user;
29     }
30 }

註意:在這有個問題: 通過UserMapper 的類上有兩種註解可以使用:@Mapper 和 @Repository (我從網上查了一下,沒發現有太大的差別,而且用不用都可以。我在使用中的唯一區別就是 @Repository註解,在service進行自動註入不會報warn,[email protected] ,不管怎樣不影響程序的運行)

展示層(controller)

    

 1 package com.huhy.web.controller;
 2 
 3 import com.huhy.web.entity.User;
 4 import com.huhy.web.service.UserService;
 5 import org.springframework.beans.factory.annotation.Autowired;
 6 import org.springframework.web.bind.annotation.PathVariable;
 7 import org.springframework.web.bind.annotation.RequestMapping;
 8 import org.springframework.web.bind.annotation.RestController;
 9 
10 /**
11  * Created by ${huhy} on 2017/8/5.
12  */
13 
14 
15 @RestController
16 public class JDBCController {
17    /* @Autowired
18     private JdbcTemplate jdbcTemplate;
19     */
20     @Autowired
21     private UserService userService;
22 
23     /**
24      * 測試數據庫連接
25      */
26     /*@RequestMapping("/jdbc/getUsers")
27     public List<Map<String, Object>> getDbType(){
28         String sql = "select * from user";
29         List<Map<String, Object>> list =  jdbcTemplate.queryForList(sql);
30         for (Map<String, Object> map : list) {
31             Set<Entry<String, Object>> entries = map.entrySet( );
32             if(entries != null) {
33                 Iterator<Entry<String, Object>> iterator = entries.iterator( );
34                 while(iterator.hasNext( )) {
35                     Entry<String, Object> entry =(Entry<String, Object>) iterator.next( );
36                     Object key = entry.getKey( );
37                     Object value = entry.getValue();
38                     System.out.println(key+":"+value);
39                 }
40             }
41         }
42         return list;
43     }*/
44 
45 
46     @RequestMapping("/jdbcTest/{id}")
47     public User jdbcTest(@PathVariable("id") String id){
48         return userService.queryById(id);
49     }
50 
51 
52     @RequestMapping("/jdbcTestName/{name}/{id}")
53     public User queryByName(@PathVariable("name") String name,@PathVariable("id") String id){
54         return userService.queryByName(name,id);
55     }
56     @RequestMapping("/name")
57     public  String getName(){
58         return "huhy";
59     }
60 
61 }

最後運行啟動類就可以測試了:(在這有兩中方式測試,第一種單獨運行測試類,第二種就是junit測試)

  第一種:啟動類啟動

    

package com;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.huhy.web.mapper")//掃描dao接口
public class DemoApplication {
    /**
     *
     * @param 啟動類
     */
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class,args);
    }
}

[email protected]

第二種啟動方式:junit測試([email protected]

    

 1 package com.example.demo;
 2 
 3 import com.DemoApplication;
 4 import com.huhy.web.entity.User;
 5 import com.huhy.web.mapper.UserMapper;
 6 import org.junit.Test;
 7 import org.junit.runner.RunWith;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.boot.test.context.SpringBootTest;
10 import org.springframework.test.annotation.Rollback;
11 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
12 import org.springframework.test.context.web.WebAppConfiguration;
13 
14 @RunWith(SpringJUnit4ClassRunner.class) // SpringJUnit支持,由此引入Spring-Test框架支持!
15 @SpringBootTest(classes = DemoApplication.class) // 指定我們SpringBoot工程的Application啟動類
16 @WebAppConfiguration // 由於是Web項目,Junit需要模擬ServletContext,[email protected]
17 public class DemoApplicationTests {
18     @Autowired
19     private UserMapper userMapper;
20     @Test
21     @Rollback
22     public void findByName() throws Exception {
23         userMapper.insert("17","def",123);
24         User user = userMapper.selectByName("def","17");
25         System.out.println(user);
26     }
27 }

註意 :@SpringBootTest註解是在1.4版本之後才有的,原來是SpringApplicationConfiguration。在使用junit測試時,具體看看你的sprin-boot-test的版本

      如果你遇到SpringApplicationConfiguration 不能使用那就是以為 Spring Boot的SpringApplicationConfiguration註解在Spring Boot 1.4開始,被標記為Deprecated

   解決:替換為SpringBootTest即可

spring boot 學習之路3( 集成mybatis )