spring boot 學習之路3( 集成mybatis )
下面就簡單來說一下spring boot 與mybatiis的整合問題,如果你還沒學習spring boot的註解的話,要先去看spring boot的註解
好了,現在讓我們來搞一下與mybatis的整合吧,在整合過程中,我會把遇到的問題也說出來,希望可以讓大家少走彎路!
首先,是在pom.xml中添加一些依賴
- 這裏用到spring-boot-starter基礎和spring-boot-starter-test用來做單元測試驗證數據訪問
- 引入連接mysql的必要依賴mysql-connector-java
- 引入整合MyBatis的核心依賴mybatis-spring-boot-starter
- 這裏不引入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 )