前言:html
Spring boot集成mybatis大體過程以下:java
(1)新建maven project,在pom.xml文件中引入相關依賴。
(2)配置文件application.yml(application.properties)
(3)編寫pojo實體類
(4)編寫Mapper接口
(5)編寫Service類
(6)編寫Controller類
(7)編寫啓動的主類mysql
用JdbcTemplate就沒必要寫Service類,但須要寫個Configuration類中配置JdbcTemplate的bean實例。web
1、項目目錄結構spring
2、新建MVN項目sql
建立過程須要填寫groupId和artifactId,這裏都是springboottest。數據庫
3、pom.xml把依賴的庫都填進去。內容以下:apache
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>springboottest</groupId> <artifactId>springboottest</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot-mybatis</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
4、建立數據庫表user及配置:springboot
見Spring Mybatis實例SqlSessionDaoSupport混用xml配置和註解。爲了演示多數據源,分別在yiibai和test2中建user表,插入的數據內容不同(隨便寫、只要兩個不也同樣就行)。mybatis
-- Database: `yiibai` INSERT INTO `user` (`id`, `name`, `dept`, `website`, `phone`, `birthday`) VALUES (1, 'yiibai1', 'Tech', 'http://www.yiibai.com', '13800009911', '1973-11-05'), (2, '依依2', 'Tech', 'http://www.zjptcc.com', '13800009922', '1973-11-05'), (3, 'yiibai3', 'Tech', 'http://www.zjptcc.com', '13800009900', '1973-11-05'), (4, 'yiibai4', 'Tech', 'http://www.zjuni.com', '13800009900', '1973-11-05');
-- -- Database: `test2` -- INSERT INTO `user` (`id`, `name`, `dept`, `website`, `phone`, `birthday`) VALUES (1, 'yiibai1', 'Tech', 'http://www.yiibai.com', '13800009911', '1973-11-05'), (2, '依蓓2', 'Tech', 'http://www.zjptcc.com', '13800009900', '1973-11-05'), (3, '依蓓3', 'Tech', 'http://www.zjptcc.com', '13800009900', '1973-11-05'), (4, '依依4', 'Tech', 'http://www.zjuni.com', '13800009900', '1973-11-05');
數據源的配置在MVN項目的application.yml中
spring: datasource: url : jdbc:mysql://localhost:3306/yiibai?useSSL=false username : your-user password : your-passwd driver-class-name : com.mysql.jdbc.Driver test2ds: url : jdbc:mysql://localhost:3306/test2?useSSL=false username : your-user password : your-passwd driver-class-name : com.mysql.jdbc.Driver
修改username和password以適應你的數據庫環境
5、DAO層接口和實體類
和Spring Mybatis實例SqlSessionDaoSupport混用xml配置和註解中的例子相似。其中IUser加@Mapper
註釋並去掉public User oneByID(int id);方法。修改後內容以下:
package com.yiibai.mybatis.dao; import java.util.List; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import com.yiibai.mybatis.models.User; @Mapper public interface IUser { @Select("select * from user where id= #{id}") public User getUserByID(int id); @Insert("insert into user(id,name, dept,phone,website,birthday) values(#{id},#{name}, #{dept},#{phone}, #{website}, #{birthday})") public int insertUser(User user); @Delete("delete from user where id=#{id}") public int deleteUserById(int id); @Update("update user set name=#{name},dept=#{dept},phone=#{phone},website=#{website},birthday=#{birthday} where id=#{id}") public int updateUser(User user); @Select("select * from user") public List<User> getAllUser(); }
User類內容不變。加一個UserRowMapper類JdbcTemplate函數中使用,具體做用見Spring 的持久化實例中的三第2點中有詳細說明。內容以下:
package com.yiibai.mybatis.models; import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.jdbc.core.RowMapper; public class UserRowMapper implements RowMapper<User> { public User mapRow(ResultSet rs, int arg1) throws SQLException { // TODO 自動生成的方法存根 return new User(rs.getInt("id"),rs.getString("name"),rs.getString("dept") ,rs.getString("phone"),rs.getString("website"),rs.getDate("birthday")); } }
6、Server類
package com.yiibai.mybatis.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.yiibai.mybatis.dao.IUser; import com.yiibai.mybatis.models.User; @Service(value="userService") public class UserService { @Autowired private IUser iUser; public List<User> getAllUser() { // TODO 自動生成的方法存根 return iUser.getAllUser(); } public User getUserByID(int id) { // TODO 自動生成的方法存根 return iUser.getUserByID(id); } public int deleteUserById(int id) { // TODO 自動生成的方法存根 return iUser.deleteUserById(id); } public int updateUser(User user) { // TODO 自動生成的方法存根 return iUser.updateUser(user); } }
7、多數據源配置
package com.yiibai.mybatis.datasource; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.jdbc.core.JdbcTemplate; @Configuration public class DataSourceConfig { @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @ConfigurationProperties(prefix="spring.datasource") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @Primary @ConfigurationProperties(prefix="spring.test2ds") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "primaryJdbcTemplate") public JdbcTemplate primaryJdbcTemplate( @Qualifier("primaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean(name = "secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate( @Qualifier("secondaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } }
7、web控制類
這裏實現了兩個controller類,UserController注入了Service類實例、Ucontroller注入了JdbcTemplate類實例。代碼以下:
package com.yiibai.mybatis.web; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.yiibai.mybatis.models.User; import com.yiibai.mybatis.service.UserService; @RestController @RequestMapping("/user") public class UserController { @Autowired @Qualifier("userService") // @Resource(name = "userService") private UserService userService; @RequestMapping(value = "/list", method = RequestMethod.GET) public List<User> getUsers() { return userService.getAllUser(); } @RequestMapping(value = "/{id}", method = RequestMethod.GET) public User getUserByID(@PathVariable("id") int id) { return userService.getUserByID(id); } }
其中 userService會使用默認數據源,也就是在DataSourceConfig中有@Primary註釋的那個DataSource
也就是在application.yml中spring.test2ds(數據庫test2)那個。
package com.yiibai.mybatis.web; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.yiibai.mybatis.models.User; import com.yiibai.mybatis.models.UserRowMapper; @RestController @RequestMapping("/u") public class Ucontroller { @Autowired @Qualifier("primaryJdbcTemplate") protected JdbcTemplate primaryJdbcTemplate; @Autowired @Qualifier("secondaryJdbcTemplate") protected JdbcTemplate secondaryJdbcTemplate; @RequestMapping(value = "/list", method = RequestMethod.GET) public List<User> getUsers() { String sql = "SELECT * FROM user"; return primaryJdbcTemplate.query(sql, new UserRowMapper()); } @RequestMapping(value = "/{id}", method = RequestMethod.GET) public User getUserByID(@PathVariable("id") int id) { String sql= "SELECT * FROM user WHERE id = '"+id+"' "; return secondaryJdbcTemplate.queryForObject(sql,new UserRowMapper()); } }
8、主類:
package com.yiibai.mybatis; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class SpringbootMutiDsApp implements EmbeddedServletContainerCustomizer{ public static void main(String[] args) { SpringApplication.run(SpringbootMutiDsApp.class, args); } public void customize(ConfigurableEmbeddedServletContainer container) { // TODO 自動生成的方法存根 container.setPort(8080); } }
9、運行:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.5.8.RELEASE) 2017-11-01 09:02:22.233 INFO 5972 --- [ main] com.yiibai.mybatis.SpringbootMutiDsApp : Starting SpringbootMutiDsApp on mymotif-Vostro-14-5480 with PID 5972 (/home/mymotif/workspace/SpringBootTest/target/classes started by mymotif in /home/mymotif/workspace/SpringBootTest) 2017-11-01 09:02:22.314 INFO 5972 --- [ main] com.yiibai.mybatis.SpringbootMutiDsApp : No active profile set, falling back to default profiles: default 2017-11-01 09:02:22.458 INFO 5972 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@56de5251: startup date [Wed Nov 01 09:02:22 CST 2017]; root of context hierarchy 2017-11-01 09:02:26.092 INFO 5972 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http) 2017-11-01 09:02:26.140 INFO 5972 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2017-11-01 09:02:26.141 INFO 5972 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.23 2017-11-01 09:02:26.341 INFO 5972 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2017-11-01 09:02:26.341 INFO 5972 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 3895 ms 2017-11-01 09:02:26.509 INFO 5972 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 2017-11-01 09:02:26.514 INFO 5972 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2017-11-01 09:02:26.514 INFO 5972 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2017-11-01 09:02:26.515 INFO 5972 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 2017-11-01 09:02:26.515 INFO 5972 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2017-11-01 09:02:27.587 INFO 5972 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@56de5251: startup date [Wed Nov 01 09:02:22 CST 2017]; root of context hierarchy 2017-11-01 09:02:27.676 INFO 5972 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/u/{id}],methods=[GET]}" onto public com.yiibai.mybatis.models.User com.yiibai.mybatis.web.Ucontroller.getUserByID(int) 2017-11-01 09:02:27.678 INFO 5972 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/u/list],methods=[GET]}" onto public java.util.List<com.yiibai.mybatis.models.User> com.yiibai.mybatis.web.Ucontroller.getUsers() 2017-11-01 09:02:27.679 INFO 5972 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user/{id}],methods=[GET]}" onto public com.yiibai.mybatis.models.User com.yiibai.mybatis.web.UserController.getUserByID(int) 2017-11-01 09:02:27.680 INFO 5972 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user/list],methods=[GET]}" onto public java.util.List<com.yiibai.mybatis.models.User> com.yiibai.mybatis.web.UserController.getUsers() 2017-11-01 09:02:27.685 INFO 5972 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2017-11-01 09:02:27.685 INFO 5972 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2017-11-01 09:02:27.718 INFO 5972 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2017-11-01 09:02:27.719 INFO 5972 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2017-11-01 09:02:27.759 INFO 5972 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2017-11-01 09:02:28.045 INFO 5972 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2017-11-01 09:02:28.230 INFO 5972 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2017-11-01 09:02:28.235 INFO 5972 --- [ main] com.yiibai.mybatis.SpringbootMutiDsApp : Started SpringbootMutiDsApp in 7.301 seconds (JVM running for 9.627)
http://localhost:8080/user/list
http://localhost:8080/u/list
這裏能夠看出http://localhost:8080/user/list得到的是test2庫中的user表數據
而http://localhost:8080/u/list得到的是yiibai庫中(經過primaryJdbcTemplate)的user表數據
10、也能夠寫個:Repository類注入JdbcTemplate類實例
package com.yiibai.mybatis.repositories; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import com.yiibai.mybatis.models.User; import com.yiibai.mybatis.models.UserRowMapper; @Repository public class UserRepository { @Autowired @Qualifier("primaryJdbcTemplate") private JdbcTemplate jdbcTemplate; @Transactional(readOnly = true) public List<User> findAll() { return jdbcTemplate.query("select * from user", new UserRowMapper()); } @Transactional(readOnly = true) public User findUserById(int id) { return jdbcTemplate.queryForObject("select * from user where id=?", new Object[]{id}, new UserRowMapper()); } }
這時控制類改成這樣:
package com.yiibai.mybatis.web; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.yiibai.mybatis.models.User; import com.yiibai.mybatis.repositories.UserRepository; @RestController @RequestMapping("/u") public class Ucontroller { @Autowired private UserRepository userRepository; @RequestMapping(value = "/list", method = RequestMethod.GET) public List<User> getUsers() { return userRepository.findAll(); } @RequestMapping(value = "/{id}", method = RequestMethod.GET) public User getUserByID(@PathVariable("id") int id) { return userRepository.findUserById(id); } }
參考:
SpringBoot多數據源的配置(SpringBoot+MyBatis)
Springboot中使用mybatis鏈接mysql數據庫