一,SpringBoot整合Mybatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
1)MyBATIS 目前提供了三种语言实现的版本,包括:Java、.NET以及Ruby。(我主要学习java,就讲java的使用
2)它提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
3)mybatis与hibernate的对比?
mybatis提供一种“半自动化”的ORM实现。这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言,“全自动”ORM实现了POJO和数据库表之间的映射,以及 SQL 的自动生成和执行。而mybatis的着力点,则在于POJO与SQL之间的映射关系。
第一步,引入Spring Boot 依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
第二步,在application.properties中配置连接数据库相关配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
第三步,加入Mapper层,Service层
mapper层:
package com.crisp.mapper;
import com.crisp.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("SELECT * FROM USERS WHERE NAME = #{name}")
User findByName(@Param("name") String name);
@Insert("INSERT INTO USERS(NAME, AGE) VALUES(#{name}, #{age})")
int insert(@Param("name") String name, @Param("age") Integer age);
}
Service层:
package com.crisp.service;
import com.crisp.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class UserService {
@Autowired
private UserMapper userMapper;
public int insertUser(String name,Integer age){
int result=userMapper.insert(name,age);
log.info("{}",result);
return result;
}
}
第四步,在启动主程序中加入mapper扫包范围 @MapperScan(basePackages = {"com.crisp"})
二,@Transactional 整合事务
事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性,当一个事务中有异常发生,通过事务可以回滚操作。
第一步,直接添加@Transactional注解即可实现
@Service
@Slf4j
@Transactional
public class UserService {
@Autowired
private UserMapper userMapper;
public int insertUser(String name,Integer age){
int result=userMapper.insert(name,age);
int i=1/age;
log.info("{}",result);
return result;
}
}
三,整合多数据源,使用分包拆分多数据源
一个项目中存在多个数据源,一般可以采用两种方式划分,分包和注解
注解:在每个方法上加注解指向数据源
分包:拆分为多个包,每个包对应不同的数据源,类似把不同的业务打成不同的jar包
第一步,我们分两个包,分别建立mapper和service
源代码:
public interface UserMapperTest01 {
@Select("SELECT * FROM USERS WHERE NAME = #{name}")
User findByName(@Param("name") String name);
@Insert("INSERT INTO USERS(NAME, AGE) VALUES(#{name}, #{age})")
int insert(@Param("name") String name, @Param("age") Integer age);
}
public class UserServiceTest01 {
@Autowired
private UserMapperTest01 userMapperTest01;
public int insertUser(String name,Integer age){
int result=userMapperTest01.insert(name,age);
log.info("{}",result);
return result;
}
}
第二步,配置文件中配置两个数据源
###datasource1
spring.datasource.test1.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.test1.jdbc-url = jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username = root
spring.datasource.test1.password = 123456
###datasource2
spring.datasource.test2.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.test2.jdbc-url = jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username = root
spring.datasource.test2.password = 123456
第三步,新增数据源配置
// DataSource01
@Configuration // 注册到springboot容器中
@MapperScan(basePackages = "com.crisp.test01", sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSource1Config {
@Bean(name = "test1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test1")
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "test1SqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// bean.setMapperLocations(
// new
// PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
return bean.getObject();
}
@Bean(name = "test1TransactionManager")
public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "test1SqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
拷贝DataSource1Config复制成DataSource2Config,将test1替换为test2
第四步,创建Controller测试效果
@RestController
public class MybatisMutiliDataSourceController {
@Autowired
private UserServiceTest01 userServiceTest01;
@RequestMapping("/addUser01")
public Integer insertUser01(String name,Integer age){
return userServiceTest01.insertUser(name,age);
}
@Autowired
private UserServiceTest02 userServiceTest02;
@RequestMapping("/addUser02")
public Integer insertUser02(String name,Integer age){
return userServiceTest02.insertUser(name,age);
}
}
四,多数据源事务管理
在整合多数据源配置多数据源时,存在多个事务管理器
@Bean(name = "test1TransactionManager")
public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "test2TransactionManager")
public DataSourceTransactionManager testTransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
因此配置事务时需要在service中指定使用哪个事务管理器
@Transactional(transactionManager = "test1TransactionManager")
public int insertUser(String name,Integer age){