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 配 ...
随机推荐
- ARM多核处理器启动过程分析
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qianlong4526888/article/details/27695173 说明: 该流程图依照 ...
- php 查看linux服务器的磁盘使用情况
- 从别人git下载项目下来然后运行
1点击clone or download 2.自由选择 3.拉到你想放的位置,我是放到桌面上的 4. cmd 打开,进入你 的下载到桌面的项目 5. # install dependencies n ...
- 8.0后广播在AndroidManifest.xml中注册后发送intent接收不到广播
8.0后广播在AndroidManifest.xml中注册后发送intent是接收不到广播了,看了一下原因,好像是8.0为了管理系统和节约电量特别针对广播和服务发送intent的方式启动做出的改变,也 ...
- LeetCode第九题—— Palindrome Number(判断回文数)
题目描述 Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same ...
- python中的 += 语法的使用
python中有个缩略的写法,如下 a = a +1 等同于 a +=1 发现了一个有趣之处,+=的写法中间不能有空格,否则报错,测试如下 Python 3.7.1 (v3.7.1:260ec2c36 ...
- [JZOJ3337] 【NOI2013模拟】wyl8899的TLE
题目 题目大意 给你两个字符串\(A\)和\(B\),可以修改\(A\)中的一个字符,求修改后最长的\(A\)的前缀,使它是\(B\)的子串. 思考历程 看到这道题之后,第一眼想到的就是后缀自动机! ...
- Scala 方法与函数简单记录
/** * Scala 方法与函数 * Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法 */ o ...
- 1002CSP-S模拟测试赛后总结
晚上 我死了.T1全场AC只有我爆零了?? 还非常中二地写了个代码注释: 水题不假,但你不知道题水你更水么?? 碰到简单题就掉以轻心??还告诉自己不要掉以轻心…… 这下是真的滑天下之大稽了吧. 读题不 ...
- XAMPP的安装及使用教程
https://blog.csdn.net/qq_36595013/article/details/80373597#3%E9%85%8D%E7%BD%AEapache