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. Deep Dive into Neo4j 3.5 Full Text Search

    In this blog we will go over the Full Text Search capabilities available in the latest major release ...

  2. jdbc出现中文乱码的解决办法

  3. 我写的界面,在ARM上跑

    这个...其实,我对ARM了解并不多,我顶多也就算是知道ARM怎么玩,EMMC干啥,MMU干啥,还有早期的叫法,比如那个NorFlash NandFlash ,然后也就没啥了. 然后写个裸机什么的,那 ...

  4. C#中,用户控件UserControl里面用Panl加载UserControl,并实现利用委托互相传值

    用户控件主窗体结构:左侧树形菜单,右侧Panl: 根据点击的菜单节点,panl里面选择性加载某一个子窗体用户控件,并传值给子窗体: 反之,在子窗体进行相应的操作之后,传值给主窗体,触发主窗体的刷新. ...

  5. 深度探索C++对象模型之第一章:关于对象之C++对象模型

    一.C和C++对比: C语言的Point3d: 数据成员定义在结构体之内,存在一组各个以功能为导向的函数中,共同处理外部的数据. typedef struct point3d { float x; f ...

  6. scala中Map集合的简单使用

    import scala.collection.mutable /** * Map集合的简单使用 */ object MapUse { def main(args: Array[String]): U ...

  7. 边双联通分量缩点+树的直径——cf1000E

    题意理解了就很好做 题意:给一张无向图,任意取两个点s,t,s->t的路径上必经边数量为k 求这样的s,t,使得k最大 #include<bits/stdc++.h> #define ...

  8. java基本类型映射表

  9. hibernate_05_hibernateHQL查询QBC查询和SQL查询

    1.HQL简介:HQL是Hibernate Query Language(Hibernate 查询语言)的缩写,提供更加丰富灵活.更为强大的查询能力:HQL更接近SQL语句查询语法.Hibernate ...

  10. nginx css,js合并插件,淘宝nginx合并js,css插件

    先下载Nginx_concat_module,下载后把它放在/usr/local/src/文件夹中,新建文件夹nginx-http-concat把下载的config  ngx_http_concat_ ...