一、SpringBoot2.x持久化数据方式介绍
简介:介绍近几年常用的访问数据库的方式和优缺点
1、原始java访问数据库
开发流程麻烦
1、注册驱动/加载驱动
Class.forName("com.mysql.jdbc.Driver")
2、建立连接
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname","root","root");
3、创建Statement
4、执行SQL语句
5、处理结果集
6、关闭连接,释放资源
对原始的java访问数据库方式流程进行封装,于是apache的dbutils出来了
2、apache dbutils框架
比上一步简单点
官网:https://commons.apache.org/proper/commons-dbutils/
3、jpa框架 :只需要在实体类中写上注解即可,直接将数据映射到数据库,无需写配置文件,
spring-data-jpa
缺点: jpa在复杂查询的时候性能不是很好,简单一点就是无法满足当前互联网项目中复杂的 业务需求
4、Hiberante 解释:ORM:对象关系映射Object Relational Mapping
企业大都喜欢使用hibernate :传统项目几乎都用这个框架
5、Mybatis框架
互联网行业通常使用mybatis
不提供对象和关系模型的直接映射,半ORM
Mybatis和hibernate对比
Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
二、SpringBoot2.x整合Mybatis3.x注解实战
简介:SpringBoot2.x整合Mybatis3.x注解配置实战(我们这里用注解开发)
1、使用starter, maven仓库地址:http://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter
2、加入依赖(可以用 http://start.spring.io/ 下载)
1 <!-- 引入starter--> 2 <dependency> 3 <groupId>org.mybatis.spring.boot</groupId> 4 <artifactId>mybatis-spring-boot-starter</artifactId> 5 <version>1.3.2</version> 6 <scope>runtime</scope> 7 </dependency> 8 9 <!-- MySQL的JDBC驱动包 --> 10 <dependency> 11 <groupId>mysql</groupId> 12 <artifactId>mysql-connector-java</artifactId> 13 <scope>runtime</scope> 14 </dependency> 15 <!-- 引入第三方数据源 --> 16 <dependency> 17 <groupId>com.alibaba</groupId> 18 <artifactId>druid</artifactId> 19 <version>1.1.6</version> 20 </dependency>
此外添加热部署的依赖
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-devtools</artifactId> 4 <optional>true</optional> 5 </dependency>
3、加入配置文件
1 #mybatis.type-aliases-package=net.xdclass.base_project.domain 2 #可以自动识别 3 #spring.datasource.driver-class-name =com.mysql.jdbc.Driver 4 5 spring.datasource.url=jdbc:mysql://localhost:3306/movie?useUnicode=true&characterEncoding=utf-8 6 spring.datasource.username =root 7 spring.datasource.password =password 8 #如果不使用默认的数据源 (com.zaxxer.hikari.HikariDataSource) 9 spring.datasource.type =com.alibaba.druid.pool.DruidDataSource
加载配置,注入到sqlSessionFactory等都是springBoot帮我们完成
4、启动类增加mapper扫描
@MapperScan("net.xdclass.base_project.mapper")
技巧:保存对象,获取数据库自增id
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")
4、开发mapper
参考语法 http://www.mybatis.org/mybatis-3/zh/java-api.html
5、sql脚本
1 CREATE TABLE `user` ( 2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 3 `name` varchar(128) DEFAULT NULL COMMENT '名称', 4 `phone` varchar(16) DEFAULT NULL COMMENT '用户手机号', 5 `create_time` datetime DEFAULT NULL COMMENT '创建时间', 6 `age` int(4) DEFAULT NULL COMMENT '年龄', 7 PRIMARY KEY (`id`) 8 ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
当然写好我们的实体
https://github.com/mybatis/spring-boot-starter/tree/master/mybatis-spring-boot-samples
整合问题集合:
https://my.oschina.net/hxflar1314520/blog/1800035
https://blog.csdn.net/tingxuetage/article/details/80179772
6、SpringBoot2.x整合Mybatis3.x增删改查实操和控制台打印SQL语句
讲解:SpringBoot2.x整合Mybatis3.x增删改查实操, 控制台打印sql语句
1、控制台打印sql语句
#增加打印sql语句,一般用于本地开发测试
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
2、增加mapper代码
1)添加数据
3)实现service接口
4)写controller
5)访问
6)数据库 id=1,和2的数据我删除了嘿嘿,id从3开始
验证使用的数据源
1.我们一开始使用的是阿里巴巴的数据源,访问之后,查看控制台是可以看到的
现在我将配置文件注释掉
启动程序,访问再查看
此时用的是默认的数据源
好的,添加数据的步骤结束
7.我们有时候希望sql语句打印出来方便我调式,怎么配呢?
在application.properties中配置如
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
1)启动程序(如果配置了热部署直接保存即可),访问
2)查看控制台
注意 这四个参数和Values里面的?号对应的
8. 增删改查比较简单,我只重点介绍原理
9.由于我们的业务很简单,增删改查就不通过Service层了,直接将UserMapper结果引用到controller
1)
2)访问即可
3)查询
4)更新
5)删除
三、事务介绍和常见的隔离级别,传播行为
简介:讲解什么是数据库事务,常见的隔离级别和传播行为
1、介绍什么是事务,单机事务,分布式事务处理等
单机事务介绍转账的案例 : 一个数据库
分布式事务 微服务中会涉及多个数据库,必须用分布式事务
2、讲解场景的隔离级别
Serializable: 最严格,串行处理,消耗资源大
Repeatable Read:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据
Read Committed:大多数主流数据库的默认事务等级(读提交)
Read Uncommitted:保证了读取过程中不会读取到非法数据。(读未提交)
3、讲解常见的传播行为
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务,最常见的选择。必须的
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起, 两个事务之间没有关系,一个异常,一个提交,不会同时回滚
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常
四、SpringBoot整合mybatis之事务处理实战
简介:SpringBoot整合Mybatis之事务处理实战
1、service 先不引入事务的异常
2、controller代码
3.启动访问 报异常
看看数据库 数据插入了,显然是不应该的
4.我们加入事务注解
5.启动访问
虽然也还是报异常
但是数据库并没有添加数据
Propagation 默认的传播行为