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多数据源的更多相关文章

  1. SpringBoot学习笔记(14):使用SpringBootAdmin管理监控你的应用

    SpringBoot学习笔记(14):使用SpringBootAdmin管理监控你的应用 Spring Boot Admin是一个管理和监控Spring Boot应用程序的应用程序.本文参考文档: 官 ...

  2. SpringBoot 集成MyBatis、事务管理

    集成MyBatis (1)在pom.xml中添加依赖 <!-- mybatis的起步依赖.包含了mybatis.mybatis-spring.spring-jdbc(事务要用到)的坐标 --&g ...

  3. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

  4. springboot学习笔记:2.搭建你的第一个springboot应用

    1.开发环境 (推荐):jdk1.8+Maven(3.2+)+Intellij IDEA+windows10; 说明: jdk:springboot官方说的很明确,到目前版本的springboot(1 ...

  5. Mybatis-学习笔记(6)Mybatis的事务管理机制

    1.什么是事务. 多个数据库原子访问应该被绑定成一个整体,这就是事务.事务是一个最小的逻辑执行单元,整个事务不能分开执行,要么同时执行,要么同时放弃执行. 事务的4个特性:原子性.一致性.隔离性.持续 ...

  6. SpringBoot学习笔记三之表述层

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6803355920697917965/ 首先配置learn-admin-webui中的web.xml文件 配置Con ...

  7. MySQL学习笔记三:库和表的管理

    1.MySQL数据库服务配置好后,系统会有4个默认的数据库. information_schema:虚拟对象,其对象都保存在内存中 performance_schema:服务器性能指标库 mysql: ...

  8. JVM学习笔记三:垃圾收集器及内存管理策略

    垃圾收集器 上文说到了垃圾收集算法,这次我们聊一下HotSpot的具体垃圾收集器的实现,以JDK1.7为例,其包含的可选垃圾收集器如下图: 不同收集器之间的连线,代表它们可以搭配使用,收集器所属的区域 ...

  9. Java框架spring 学习笔记(十九):事务管理(注解管理)

    注解管理的方式要比xml配置方式要简单很多 只需在配置文件中添加事务注解 <?xml version="1.0" encoding="UTF-8"?> ...

  10. Spring学习笔记(五):JDBCTemplate+事务管理

    1 概述 Spring为开发者提供了JDBCTemplate,可以简化很多数据库操作相关的代码,本文主要介绍JDBCTemplate的使用以及事务管理功能. 2 JDBC Template 2.1 配 ...

随机推荐

  1. OpenCV3 VideoCapture buffer

    在ubuntu16.04下写关于opencv的工程,在调用摄像头时发现VideoCapture有5帧的buffer,所以采用5个capture>>mat来处理. if (FlagConti ...

  2. arm-linux-objdump 的使用

    1. 查看静态库或.o 文件的组成文件 [arm@localhost gcc]$ arm­linux­objdump ­a libhello.a 2. 查看静态库或.o 文件的络组成部分的头部分 [a ...

  3. 两个table合并

    1.两个一样的table合并用Merge函数即可合并(但要求table要有主键id) DataTable1.Merge(DataTable2); 2.没写完,以后继续补充(只有经过笔者验证,能用的才会 ...

  4. leetcode-227-基本计算器②

    题目描述: 方法一:中缀转后缀 #!_*_coding:utf-8_*_ class Solution: def calculate(self, s: str) -> int: def in_t ...

  5. 视频云肖长杰:视频AI科技助力短视频生态

    人工智能技术是当今炙手可热的技术领域,它在制造.家居.零售.交通.安防等行业的应用已经是大势所趋.在本月云栖Techday音视频技术沙龙中,阿里云视频云产品专家肖长杰为我们分享了一些AI技术在视频中应 ...

  6. 训练计划Day2

    Day2:线段树(可持久化),平衡树(splay,treap),并查集,树链剖分,动态树,树状数组,点分治(可持久). 线段树模板 //区间最大,and,or #include <cstdio& ...

  7. 牛客多校第四场 J Free 最短路

    题意: 求最短路,但是你有k次机会可以把路径中某条边的长度变为0. 题解: 跑k+1次迪杰斯特拉,设想有k+1组dis数组和优先队列,第k组就意味着删去k条边的情况,每次松弛操作,松弛的两点i,j和距 ...

  8. hexo next主题中关于pc端点击链接没问题,移动端点击链接页面不显示。

    个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 背景 hexo next主题,本人diy的时候 ...

  9. day20_函数的闭包 与 装饰器

    #!/usr/bin/env python # -*- coding:utf-8 -*- # # 一些文章 # https://www.cnblogs.com/Vae1242/p/6944338.ht ...

  10. 华为-eNSP模拟器路由器无法正常启动一直显示“#”

    问题项如截图: 解决方案: 1. 打开自己电脑的控制面板 -->> 系统和安全 -->> Windows Defender防火墙 (运行应用通过Windows防火墙) 2 .找 ...