目前暂整理这两种方式,亲测可用
一、注解的方式
1、引入依赖
在pom文件中引入 mybaits-spring-boot-starter的依赖:
<!--mybatis 依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!--mysql 依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.5</version>
</dependency>
<!--druid数据源依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
2、在application.properties配置文件中引入数据源 (不配数据连接池的情况下)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/user_boot?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
3、dao层
package com.lbh.dao;
import com.lbh.entity.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* Created by Advancer on 2018/1/19 10:52.
* auth: lbh
*/
@Mapper
@Component
public interface UserDao {
@Insert("INSERT INTO user(name, age, money) VALUES(#{name}, #{age}, #{money})")
public int addUser(@Param("name") String name, @Param("age") String age, @Param("money") double money);
@Update("UPDATE user SET name = #{name}, age = #{age}, money = #{money} WHERE id = #{id}")
public int updUser(@Param("name") String name, @Param("age") String age, @Param("money") double money, @Param("id") int id);
@Delete("DELETE FROM user WHERE id = #{id}")
public int delUser(@Param("id") int id);
/**
* 与@Select 注解并用的注解还有一个 @Result,
* @Restle:修饰返回的结果集,关联实体类属性与字段一一对应,如果实体类属性与字段名字保持一致,则不需要此属性也可以。
* @return
*/
@Select("SELECT id, name, age, money FROM user")
public List<User> findAllUser();
@Select("SELECT id, name, age, money FROM user WHERE id = #{id}")
public User findUserById(@Param("id") int id);
}
4、Service层
package com.lbh.service;
import com.lbh.dao.UserDao;
import com.lbh.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* Created by Advancer on 2018/1/19 10:59.
* auth: lbh
*/
@Service
public class UserService {
@Autowired
private UserDao userDao;
/**
* 新增一条记录
* @param name
* @param age
* @param money
* @return
*/
@Transactional(rollbackFor = Exception.class)
public int addUser(String name, String age, double money){
return userDao.addUser(name, age, money);
}
//。。。。
}
5、Controller层
package com.lbh.controller;
import com.lbh.entity.User;
import com.lbh.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* Created by Advancer on 2018/1/19 11:03.
* auth: lbh
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/addUser", method = RequestMethod.GET)
public String addUser(@RequestParam("name") String name,
@RequestParam("age") String age,
@RequestParam("money") double money){
int flag = userService.addUser(name, age, money);
if (flag == 1){
return "success";
}else {
return "fail";
}
}
6、使用postman测试
二、配置文件的方式(可支持多数据源)
1、首先还是引入先关依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<jdk.version>1.8</jdk.version>
<mybatis-spring-boot>1.2.0</mybatis-spring-boot>
<mysql-connector>5.1.39</mysql-connector>
<druid>1.0.18</druid>
<ojdbc.version>11.2.0.3</ojdbc.version>
<junit.version>4.12</junit.version>
</properties>
<dependencies>
<!-- Spring Boot Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Mybatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot}</version>
</dependency>
<dependency>
<groupId>oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>${ojdbc.version}</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/ojdbc6-11.2.0.3.jar</systemPath>
</dependency>
<!-- Druid 数据连接池依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid}</version>
</dependency>
<!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
</dependencies>
2、application.yml
server:
port: 8989
context-path: /Boot
###############数据源###################
advancer:
datasource:
driverClassName: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@localhost:1521/choice
username: choiceall
password: choiceall
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5
minIdle: 5
maxActive: 20
maxIdle: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
removeAbandonedTimeout: 60
removeAbandoned: true
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: true
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,wall,log4j
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
3、配置文件(数据源 关联 mybatis 文件)
package com.lbh.config;
import com.alibaba.druid.pool.xa.DruidXADataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
/**
* Created by Advancer on 2018/1/23 10:42.
* auth: lbh
*/
@Configuration
@MapperScan(basePackages = AdvancerDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "advancerSqlSessionFactory")
public class AdvancerDataSourceConfig {
//精确到具体目录
static final String PACKAGE = "com.lbh.dao";
static final String MAPPER_LOCATION = "classpath:mapper/*.xml";
@Value("${advancer.datasource.driverClassName}")
private String driverClass;
@Value("${advancer.datasource.url}")
private String url;
@Value("${advancer.datasource.username}")
private String userName;
@Value("${advancer.datasource.password}")
private String password;
@Bean("advancerDataSource")
@Primary
public DataSource advancerDataSource(){
DruidXADataSource dataSource = new DruidXADataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(userName);
dataSource.setPassword(password);
AtomikosDataSourceBean xaDatasource = new AtomikosDataSourceBean();
xaDatasource.setUniqueResourceName("advancerDataSource");
xaDatasource.setXaDataSource(dataSource);
return xaDatasource;
}
@Bean(name = "advancerSqlSessionFactory")
@Primary
public SqlSessionFactory advancerSqlSessionFactory(@Qualifier("advancerDataSource") DataSource advancerdataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(advancerdataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(AdvancerDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
事务控制
package com.lbh.config;
import com.atomikos.icatch.jta.UserTransactionImp;
import com.atomikos.icatch.jta.UserTransactionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.jta.JtaTransactionManager;
import javax.transaction.SystemException;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
/**
* Created by Advancer on 2018/1/23 13:15.
* auth: lbh
*/
@Configuration
@ComponentScan
@EnableTransactionManagement
public class TransactionManagerConfig {
@Bean(name = "userTransaction")
public UserTransaction userTransaction() throws SystemException {
UserTransactionImp userTransactionImp = new UserTransactionImp();
userTransactionImp.setTransactionTimeout(30);
return userTransactionImp;
}
@Bean(name = "atomikosTransactionManager", initMethod = "init", destroyMethod = "close")
public TransactionManager atomikosTransactionManager(){
UserTransactionManager userTransactionManager = new UserTransactionManager();
userTransactionManager.setForceShutdown(false);
return userTransactionManager;
}
@Bean(name = "transactionManager")
@DependsOn({"userTransaction", "atomikosTransactionManager"})
public PlatformTransactionManager transactionManager() throws SystemException {
UserTransaction userTransaction = userTransaction();
JtaTransactionManager manager = new JtaTransactionManager(userTransaction,atomikosTransactionManager());
return manager;
}
}
4、dao层
@Mapper
public interface UserDao {
/**
* 新增
* @param user
* @return
*/
public void addUser(User user);
/**
* 查询
* @return
*/
public List<User> findAllUser();
}
<insert id="addUser" parameterType="com.lbh.entity.User">
INSERT INTO user_boot (id, name, age, money)
VALUES (seq_user_id.NEXTVAL, #{name}, #{age}, #{money})
</insert>
<select id="findAllUser" resultType="com.lbh.entity.User">
SELECT id, name, age, money
FROM user_boot
</select>
5、service层
@Autowired
private UserDao userDao;
public void addUser(){
User user = new User("lbh", "24", 10000);
userDao.addUser(user);
}
public List<User> findAllUser(){
return userDao.findAllUser();
}
6、controller层
@Autowired
private UserService userService;
@RequestMapping("/addUser")
public void addUser(){
userService.addUser();
}
@RequestMapping("/findUser")
public List<User> findUser(){
List<User> userList = userService.findAllUser();
for (User user : userList) {
System.out.println(user);
}
return userList;
}
结果: