SpringBoot学习笔记(三):SpringBoot集成Mybatis、SpringBoot事务管理、SpringBoot多数据源
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即可。
SpringBoot学习笔记(三):SpringBoot集成Mybatis、SpringBoot事务管理、SpringBoot多数据源的更多相关文章
- SpringBoot学习笔记(14):使用SpringBootAdmin管理监控你的应用
SpringBoot学习笔记(14):使用SpringBootAdmin管理监控你的应用 Spring Boot Admin是一个管理和监控Spring Boot应用程序的应用程序.本文参考文档: 官 ...
- SpringBoot 集成MyBatis、事务管理
集成MyBatis (1)在pom.xml中添加依赖 <!-- mybatis的起步依赖.包含了mybatis.mybatis-spring.spring-jdbc(事务要用到)的坐标 --&g ...
- Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)
在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...
- springboot学习笔记:2.搭建你的第一个springboot应用
1.开发环境 (推荐):jdk1.8+Maven(3.2+)+Intellij IDEA+windows10; 说明: jdk:springboot官方说的很明确,到目前版本的springboot(1 ...
- Mybatis-学习笔记(6)Mybatis的事务管理机制
1.什么是事务. 多个数据库原子访问应该被绑定成一个整体,这就是事务.事务是一个最小的逻辑执行单元,整个事务不能分开执行,要么同时执行,要么同时放弃执行. 事务的4个特性:原子性.一致性.隔离性.持续 ...
- SpringBoot学习笔记三之表述层
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6803355920697917965/ 首先配置learn-admin-webui中的web.xml文件 配置Con ...
- MySQL学习笔记三:库和表的管理
1.MySQL数据库服务配置好后,系统会有4个默认的数据库. information_schema:虚拟对象,其对象都保存在内存中 performance_schema:服务器性能指标库 mysql: ...
- JVM学习笔记三:垃圾收集器及内存管理策略
垃圾收集器 上文说到了垃圾收集算法,这次我们聊一下HotSpot的具体垃圾收集器的实现,以JDK1.7为例,其包含的可选垃圾收集器如下图: 不同收集器之间的连线,代表它们可以搭配使用,收集器所属的区域 ...
- Java框架spring 学习笔记(十九):事务管理(注解管理)
注解管理的方式要比xml配置方式要简单很多 只需在配置文件中添加事务注解 <?xml version="1.0" encoding="UTF-8"?> ...
- Spring学习笔记(五):JDBCTemplate+事务管理
1 概述 Spring为开发者提供了JDBCTemplate,可以简化很多数据库操作相关的代码,本文主要介绍JDBCTemplate的使用以及事务管理功能. 2 JDBC Template 2.1 配 ...
随机推荐
- python中面向对象
一.Python经典类与新类 经典类:如果没有直接或间接的子类化一个对象,也就是说如果没有指定一个父类,或者是如果子类化的基本类没有父类,那么就定义了经典类: class classics: 'def ...
- 初学者学习PHP开发应该掌握的几段精华代码
来自:http://hi.baidu.com/dckhello/item/d62b16d8994bf93449e1ddb0 经典循环例子 <HTML><HEAD><TIT ...
- .net 接受请求过来的流
//接收POST过来的数据 System.IO.Stream s = Request.InputStream; int count = 0; byte[] buffer = new byte[1024 ...
- Python全栈开发:django网络框架(二)
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...
- 5.从物理层到MAC层
第一层(物理层) 如何用两台电脑构成最小的局域网(LAN)? 网线的水晶头1.2和3.6脚分别起着收.发信号的作用,随意只要将水晶头做交叉线1-3.2-6交叉法,然后连接两台电脑.除了 ...
- matplotlib 画图颜色参数值及对应色卡
matplotlib 色卡对应参数值 cnames = { 'aliceblue': '#F0F8FF', 'antiquewhite': '#FAEBD7', 'aqua': '#00FFFF', ...
- .net core 3.0 发布 500.0 - ANCM In-Process Handler Load Failure 错误
.net core 3.0 发布后报500.0错误 原因: 发布设置和下载的Runtime SDK不匹配 https://dotnet.microsoft.com/download/dotnet-c ...
- x-杂项-maven-repository-lombok-intro:使用PROJECT LOMBOK减少BOILERPLATE代码
ylbtech-杂项-maven-repository-lombok-intro:使用PROJECT LOMBOK减少BOILERPLATE代码 1.返回顶部 1. REDUCING BOILERPL ...
- Vue入坑——vue-cli(脚手架)目录结构认识
转载:https://my.oschina.net/u/3802541/blog/1809182 一.目录结构 |-- build // 项目构建 ...
- windows安装vscode,配置golang环境
出现的问题: 进行如下命令进行目录切换:cd %GOPATH%\src\github.com\golang我这里的GOPATH是在D:\GoPath,大家这里一定要注意些如果src目录下面没有gith ...