SpringBoot学习笔记(三):SpringBoot集成Mybatis、SpringBoot事务管理、SpringBoot多数据源

版权声明:本文为作者原创,转载请注明出处,联系qq:32248827 https://blog.csdn.net/dataiyangu/article/details/85561916

SpringBoot集成Mybatis

第一步我们需要在pom.xml里面引入mybatis相关的jar包

   <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>
<version>5.1.21</version>
</dependency>

在application.properties中填写我们的连接数据库相关的配置信息

spring.datasource.url=jdbc:mysql://localhost:3306/springboot_mjxy?characterEncoding=utf-8 //?后面的是为了解决向数据库中post数据时候的乱码
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#mybatis.mapper-locations=classpath:mapper/*.xml

首先自己在建一个位于entity包下面的User类对应于下面的这个表,并且提供get set方法。

在springboot_mjxy数据库中新建一张user表,新增一条数据,结构如下:
在这里插入图片描述
然后我们新建一个commapper的包,在包下新建一个Interface名为:UserMapper代码如下:注意使用Mapper注解让系统自己扫包到这里

@Mapper
public interface UserMapper {

@Select("select * from user where id = #{id}")
User selectUserById(@Param("id") Integer id);

@Insert("INSERT INTO user (`id`, `username`, `sex`) VALUES (NULL, #{name}, #{sex});")
int insert(@Param("name") String name, @Param("sex") String sex);

}

然后我们按照正常实际生产的方式来进行获取数据,新建Service层和实现层,这里就只贴实现层的代码如下:
这里也需要Service注解,也是让系统自动扫包

@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserMapper userMapper;

@Override
public User getUserById(Integer id) {
return userMapper.selectUserById(id);
}

@Override
public void insertUser(String name, String sex) {
userMapper.insert(name, sex);
}
}

最后我们新建一个Controller进行访问数据,UserController代码如下:这里我们就用RestController注解返回JSON

@RestController
@RequestMapping("/user")
public class UserController {

@Autowired
private UserService userService;

@RequestMapping("/get") //restful风格 @GetMapping
public Object getUser(Integer id) {
return userService.getUserById(id);
}

@RequestMapping("/add")  //restful风格 @PostMapping
public Object add(String name) {
System.out.println("add");
userService.insertUser(name, "SEX");
return "SUCCESS";
}
}

最后将项目启动,什么都不用做变动,直接通过浏览器访问:http://127.0.0.1:8080/user/get?id=1,浏览器返回结果
到这里就集成完毕了我们的MyBatis,我们这里就不讲深入了,这里只要学习过SSM框架的都很简单了,后面我们会集成一个非常牛X的框架,Mybatis-Plus,到时候你们会发现完全不用自己写SQL了

SpringBoot事务管理

什么是事物???
是指多个SQL作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
事物的四大特性(ACID):
原子性(Atomicity):对于其数据修改,要么全都执行,要么全都不执行。
一致性(Consistency):事务在完成时,必须使所有的数据都保持一致状态。
隔离性(Isolation):由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
持久性(Durability):事务完成之后,它对于系统的影响是永久性的。

这里只需要一个注解就搞定了:
@Transactional

小例子:
在UserMapper中新增两个SQL,一个更新,一个删除

@Update("UPDATE user SET username =#{name} WHERE id = #{id}")
int update(@Param("name") String name, @Param("id") Integer id);

@Delete("DELETE from user where id = #{id}")
void delete(@Param("id") Integer id);

然后在Service中写一个事务测试方法

@Transactional
public void transcationtest(Integer id) {
           // 我们要做的操作,我们将某个用户的NAME更新成待删除,然后去删除,但是中间我们制造一个异常出来
userMapper.update("DeleteTHIS", id);
System.out.println("异常之前");
int a = 2 / 0;
System.out.println("异常之后");
userMapper.delete(id);
}

然后运行查看效果,发现Update根本不会成功,因为下面出现错误了,自动回滚。

SpringBoot多数据源

什么是多数据源:多数据源指的是如果一个web项目用到了多个数据库,那么就需要连接多个数据库操作,这就是多数据源。
多数据源的好处:我要用到A数据库(mysql)中 的某些数据进行数据验证,并且要将数据插入B数据库中。这样做的好处是,不需要改变A中数据库的结构,就算是连接更多数据库的话,都不需要考虑其中结构问题,但是这就需要一个web项 目跟多个数据库进行连接操作的技术。
项目结构:
在这里插入图片描述
配置文件中,看配置文件(代表两个数据源:用spring.datasource.test*区别):

spring.datasource.test1.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test1.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username = root
spring.datasource.test1.password = admin

spring.datasource.test2.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test2.url = jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username = root
spring.datasource.test2.password = admin

然后为每个配置源配置一个加载类:

/这里配置mapper所在的包
@Configuration
@MapperScan(basePackages = "com.majiaxueyuan.mapper.test1", sqlSessionTemplateRef = "test1SqlSessionTemplate")//扫描的包
public class DataSource1Config {

@Bean(name = "test1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test1")//对应上面配置文件中的名字
          
@Primary//primary代表主库
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}

@Bean(name = "test1SqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}

@Bean(name = "test1TransactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}

@Bean(name = "test1SqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

建一个相同的mapper
将里面的test1全部改为test2,通过controller进行相应的操作。

这样的话就配置完成,可以调用不用的Mapper,实际上是存储在不同的库中。
这里大家会发现如果使用事务并且制造一个异常的话,会很明显的出现几种不同的效果,我们让mapper1和mapper2在不同顺序下面插入数据并且在中间抛出异常,发现只有一个插入成功了,另外一个没成功,为什么呢?就是因为@Primary的原因,这样就设置了主数据库。这里会发现设置了Primary的数据库只要出错都不会插入成功,都会事务回滚,大家注意了!!!!!

如果涉及到a数据库去调用b数据库,一般不会涉及到多数据源的问题,因为,SpringBoot是分布式的微服务,将每个服务封装起来调用相应的api即可。

猜你喜欢

转载自blog.csdn.net/dataiyangu/article/details/85561916