前言:
Spring boot集成mybatis大致过程如下:
(1)新建maven project,在pom.xml文件中引入相关依赖。
(2)配置文件application.yml(application.properties)
(3)编写pojo实体类
(4)编写Mapper接口
(5)编写Service类
(6)编写Controller类
(7)编写启动的主类
用JdbcTemplate就不必写Service类,但需要写个Configuration类中配置JdbcTemplate的bean实例。
一、项目目录结构
二、新建MVN项目
创建过程需要填写groupId和artifactId,这里都是springboottest。
三、pom.xml把依赖的库都填进去。内容如下:
<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>
四、创建数据库表user及配置:
见Spring Mybatis实例SqlSessionDaoSupport混用xml配置和注解。为了演示多数据源,分别在yiibai和test2中建user表,插入的数据内容不一样(随便写、只要两个不也一样就行)。
-- 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以适应你的数据库环境
五、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"));
}
}
六、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);
}
}
七、多数据源配置
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);
}
}
七、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());
}
}
八、主类:
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);
}
}
九、运行:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: 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表数据
十、也可以写个: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)
Spring中jdbcTemplate的用法实例(一)
Springboot中使用mybatis连接mysql数据库