1、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、关闭连接,释放资源

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

2、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/ 下载)
                    
             <!-- 引入starter-->
                     <dependency>
                         <groupId>org.mybatis.spring.boot</groupId>
                         <artifactId>mybatis-spring-boot-starter</artifactId>
                         <version>1.3.2</version>
                         <scope>runtime</scope>               
                     </dependency>
                     
              <!-- MySQL的JDBC驱动包    -->   
                      <dependency>
                         <groupId>mysql</groupId>
                         <artifactId>mysql-connector-java</artifactId>
                         <scope>runtime</scope>
                     </dependency>
             <!-- 引入第三方数据源 -->       
                     <dependency>
                         <groupId>com.alibaba</groupId>
                         <artifactId>druid</artifactId>
                         <version>1.1.6</version>
                     </dependency>

3、加入配置文件(application.properties)
             #mybatis.type-aliases-package=net.xdclass.base_project.domain
             #可以自动识别
             #spring.datasource.driver-class-name =com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/movie?useUnicode=true&characterEncoding=utf-8
             spring.datasource.username =root
             spring.datasource.password =password
             #如果不使用默认的数据源 (com.zaxxer.hikari.HikariDataSource)
             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")

说明:keyProperty java对象的属性;keyColumn表示数据库的字段

4、开发mapper
             参考语法 http://www.mybatis.org/mybatis-3/zh/java-api.html

5、sql脚本
             CREATE TABLE `user` (
               `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
               `name` varchar(128) DEFAULT NULL COMMENT '名称',
               `phone` varchar(16) DEFAULT NULL COMMENT '用户手机号',
               `create_time` datetime DEFAULT NULL COMMENT '创建时间',
               `age` int(4) DEFAULT NULL COMMENT '年龄',
               PRIMARY KEY (`id`)
             ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;

controller——存放api

domain——存放实体类

mapper/dao——访问数据库接口

service——业务层

utils——工具类

警告:WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

解决:在数据库配置文件中加入useSSL=false

代码实例:

controller/UserController.java:

  1 package net.xdclass.base_project.controller;
2
3
4 import java.util.Date;
5
6 import net.xdclass.base_project.domain.JsonData;
7 import net.xdclass.base_project.domain.User;
8 import net.xdclass.base_project.service.UserService;
9
10 import org.springframework.beans.factory.annotation.Autowired;
11 import org.springframework.web.bind.annotation.GetMapping;
12 import org.springframework.web.bind.annotation.RequestMapping;
13 import org.springframework.web.bind.annotation.RestController;
14
15 @RestController
16 @RequestMapping("/api/v1/user")
17 public class UserController {
18
19
20 @Autowired
21 private UserService userService;
22
23
24 /**
25 * 功能描述: user 保存接口
26 * @return
27 */
28 @GetMapping("add")
29 public Object add(){
30
31 User user = new User();
32 user.setAge(11);
33 user.setCreateTime(new Date());
34 user.setName("xdclass");
35 user.setPhone("10010000");
36 int id = userService.add(user);
37
38 return JsonData.buildSuccess(id);
39 }
40
41 // @Autowired
42 // private UserMapper userMapper;
43 //
44 //
45 //
46 // @GetMapping("findAll")
47 // public Object findAll(){
48 //
49 // return JsonData.buildSuccess(userMapper.getAll());
50 // }
51 //
52 //
53 //
54 // @GetMapping("findById")
55 // public Object findById(long id){
56 // return JsonData.buildSuccess(userMapper.findById(id));
57 // }
58 //
59 //
60 // @GetMapping("del_by_id")
61 // public Object delById(long id){
62 // userMapper.delete(id);
63 // return JsonData.buildSuccess();
64 // }
65 //
66 // @GetMapping("update")
67 // public Object update(String name,int id){
68 // User user = new User();
69 // user.setName(name);
70 // user.setId(id);
71 // userMapper.update(user);
72 // return JsonData.buildSuccess();
73 // }
74 //
75
76 // //测试事务
77 // @GetMapping("transac")
78 // public Object transac(){
79 // int id = userService.addAccount();
80 // return JsonData.buildSuccess(id);
81 // }
82 //
83 //
84
85 }
86

实体类User.java:

  1 package net.xdclass.base_project.domain;
2
3 import java.util.Date;
4
5 public class User {
6
7 private int id;
8
9 private String name;
10
11 private String phone;
12
13 private int age;
14
15 private Date createTime;
16
17 public int getId() {
18 return id;
19 }
20
21 public void setId(int id) {
22 this.id = id;
23 }
24
25 public String getName() {
26 return name;
27 }
28
29 public void setName(String name) {
30 this.name = name;
31 }
32
33 public String getPhone() {
34 return phone;
35 }
36
37 public void setPhone(String phone) {
38 this.phone = phone;
39 }
40
41 public int getAge() {
42 return age;
43 }
44
45 public void setAge(int age) {
46 this.age = age;
47 }
48
49 public Date getCreateTime() {
50 return createTime;
51 }
52
53 public void setCreateTime(Date createTime) {
54 this.createTime = createTime;
55 }
56
57
58
59
60 }
61

UserMapper.java:

  1 package net.xdclass.base_project.mapper;
2
3 import net.xdclass.base_project.domain.User;
4
5 import org.apache.ibatis.annotations.Insert;
6 import org.apache.ibatis.annotations.Options;
7
8 public interface UserMapper {
9
10
11 //推荐使用#{}取值,不要用${},因为存在注入的风险
12 @Insert("INSERT INTO user(name,phone,create_time,age) VALUES(#{name}, #{phone}, #{createTime},#{age})")
13 @Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id") //keyProperty java对象的属性;keyColumn表示数据库的字段
14 int insert(User user);
15
16
17
18
19 //
20 // @Select("SELECT * FROM user")
21 // @Results({
22 // @Result(column = "create_time",property = "createTime") //javaType = java.util.Date.class
23 // })
24 // List<User> getAll();
25 //
26 //
27 //
28 // @Select("SELECT * FROM user WHERE id = #{id}")
29 // @Results({
30 // @Result(column = "create_time",property = "createTime")
31 // })
32 // User findById(Long id);
33 //
34 //
35 //
36 // @Update("UPDATE user SET name=#{name} WHERE id =#{id}")
37 // void update(User user);
38 //
39 // @Delete("DELETE FROM user WHERE id =#{userId}")
40 // void delete(Long userId);
41 //
42 }

UserService.java:

  1 package net.xdclass.base_project.service;
2
3 import net.xdclass.base_project.domain.User;
4
5 public interface UserService {
6
7 public int add(User user);
8
9
10
11 //public int addAccount();
12
13 }
14

UserServiceImpl.java:

  1 package net.xdclass.base_project.service.impl;
2
3 import java.util.Date;
4
5 import net.xdclass.base_project.domain.User;
6 import net.xdclass.base_project.mapper.UserMapper;
7 import net.xdclass.base_project.service.UserService;
8
9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.stereotype.Service;
11 import org.springframework.transaction.annotation.Transactional;
12
13 @Service
14 public class UserServiceImpl implements UserService{
15
16 @Autowired
17 private UserMapper userMapper;
18
19 @Override
20 public int add(User user) {
21 userMapper.insert(user);
22 int id = user.getId();
23 return id;
24 }
25
26
27
28
29
30
31 }
32

浏览器输入:http://localhost:8080/api/v1/user/add

数据库查看:

添加成功

相关资料:
         http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/#Configuration

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

3、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代码       
         @Select("SELECT * FROM user")
         @Results({
             @Result(column = "create_time",property = "createTime")  //javaType = java.util.Date.class       
         })
         List<User> getAll();
      
         @Select("SELECT * FROM user WHERE id = #{id}")
         @Results({
              @Result(column = "create_time",property = "createTime")
         })
         User findById(Long id);

@Update("UPDATE user SET name=#{name} WHERE id =#{id}")
         void update(User user);

@Delete("DELETE FROM user WHERE id =#{userId}")
         void delete(Long userId);
     
      3、增加API

@GetMapping("find_all")
         public Object findAll(){
            return JsonData.buildSuccess(userMapper.getAll());
         }
        
         @GetMapping("find_by_Id")
         public Object findById(long id){
            return JsonData.buildSuccess(userMapper.findById(id));
         }
        
         @GetMapping("del_by_id")
         public Object delById(long id){
         userMapper.delete(id);
            return JsonData.buildSuccess();
         }
        
         @GetMapping("update")
         public Object update(String name,int id){
             User user = new User();
             user.setName(name);
             user.setId(id);
             userMapper.update(user);
             return JsonData.buildSuccess();
         }

4、事务介绍和常见的隔离级别,传播行为
    
     简介:讲解什么是数据库事务,常见的隔离级别和传播行为

1、介绍什么是事务,单机事务,分布式事务处理等

2、讲解场景的隔离级别
         Serializable: 最严格,串行处理,消耗资源大
         Repeatable Read:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据
         Read Committed:大多数主流数据库的默认事务等级
         Read Uncommitted:保证了读取过程中不会读取到非法数据。

3、讲解常见的传播行为
         PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务,最常见的选择。

PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起, 两个事务之间没有关系,一个异常,一个提交,不会同时回滚

PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常

5、SpringBoot整合mybatis之事务处理实战
     简介:SpringBoot整合Mybatis之事务处理实战
     1、service逻辑引入事务 @Transactional(propagation=Propagation.REQUIRED)

2、service代码
         @Override
         @Transactional(propagation=Propagation.REQUIRED)
         public int addAccount() {
             User user = new User();
             user.setAge(9);
             user.setCreateTime(new Date());
             user.setName("事务测试");
             user.setPhone("000121212");
            
             userMapper.insert(user);
             int a = 1/0;

return user.getId();
         }

数据库操作之整合Mybaties和事务讲解 5节课的更多相关文章

  1. 【SpringBoot】数据库操作之整合Mybaties和事务讲解

    ========================8.数据库操作之整合Mybaties和事务讲解 ================================ 1.SpringBoot2.x持久化数 ...

  2. 小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_32..SpringBoot2.x持久化数据方式介绍

    笔记 1.SpringBoot2.x持久化数据方式介绍          简介:介绍近几年常用的访问数据库的方式和优缺点 1.原始java访问数据库             开发流程麻烦        ...

  3. 一个基于PDO的数据库操作类(新) 一个PDO事务实例

    <?php /* * 作者:胡睿 * 日期:2011/03/19 * 电邮:hooray0905@foxmail.com * * 20110319 * 常用数据库操作,如:增删改查,获取单条记录 ...

  4. mysql数据库操作语句整合

    查看版本:select version();显示当前时间:select now(); 注意:在语句结尾要使用分号; 远程连接 一般在公司开发中,可能会将数据库统一搭建在一台服务器上,所有开发人员共用一 ...

  5. ThinkPHP 数据库操作(六) : 查询事件、事务操作、监听SQL

    查询事件 查询事件(V5.0.4+) 从 5.0.4+ 版本开始,增加了数据库的CURD操作事件支持,包括: 查询事件仅支持 find . select . insert . update 和 del ...

  6. SpringBoot整合定时任务和异步任务处理 3节课

    1.SpringBoot定时任务schedule讲解   定时任务应用场景: 简介:讲解什么是定时任务和常见定时任务区别 1.常见定时任务 Java自带的java.util.Timer类        ...

  7. 十三、EnterpriseFrameWork框架核心类库之数据库操作(多数据库事务处理)

    本章介绍框架中封装的数据库操作的一些功能,在实现的过程中费了不少心思,针对不同数据库的操作(SQLServer.Oracle.DB2)这方面还是比较简单的,用工厂模式就能很好解决,反而是在多数据库同时 ...

  8. Spring Boot学习——数据库操作及事务管理

    本文讲解使用Spring-Data-Jpa操作数据库. JPA定义了一系列对象持久化的标准. 一.在项目中使用Spring-Data-Jpa 1. 配置文件application.properties ...

  9. JDBC:数据库操作:事务

    事务特征:原子性,一致性,独立性,持久性. 要想操作事务,必须按照以下步骤完成. 1,取消掉自动提交(SET AUTOCOMMIT=0):每次执行数据库更新的时候实际上发出SQL命令之后就已经提交上去 ...

随机推荐

  1. BZOJ3505 CQOI2014数三角形(组合数学)

    显然可以用总方案数减掉三点共线的情况.对于三点共线,一个暴力的做法是枚举起点终点,其间整点数量即为横纵坐标差的gcd-1.这样显然会T,注意到起点终点所形成的线段在哪个位置是没有区别的,于是枚举线段算 ...

  2. IDEA如何刷新pom文件

    被新手问到了“IDEA如何刷新pom文件?”这个问题,想来这是一个不好意思问的常犯的错误吧. 在IDEA中,修改了pom.xml文件,添加了依赖以后,一般会弹出以下这个警告来. 点击[Import C ...

  3. [luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结

    t1-快速多项式变换(FPT) 题解 看到这个\(f(x)=a_0+a_1x+a_2x^2+a_3x^3+ \cdots + a_nx^n\)式子,我们会想到我们学习进制转换中学到的,那么我们就只需要 ...

  4. SP1805 HISTOGRA (单调栈)

    单调栈维护栈顶为高度最大的 记下来栈中每个元素入栈时顶掉的最靠左的一个位置(如果没顶掉就是它本身),那么在它出栈的时候,它所带来的面积就是(出栈位置-记录位置)*高度 (可能会有加一减一之类的细节) ...

  5. bzoj5017 炸弹 (线段树优化建图+tarjan+拓扑序dp)

    直接建图边数太多,用线段树优化一下 然后缩点,记下来每个点里有多少个炸弹 然后按拓扑序反向dp一下就行了 #include<bits/stdc++.h> #define pa pair&l ...

  6. JDK源码分析(4)HashSet

    JDK版本 HashSet简介 HashSet特点 非线程安全 允许null值 添加值得时候会先获取对象的hashCode方法,如果hashCode 方法返回的值一致,则再调用equals方法判断是否 ...

  7. Windows 10更新时出现0x80070422错误

    Windows更新 更新状态 安装更新时出现一些问题,但我们稍后会重试.如果你继续看到此错误,并想要搜索Web或联系支持人员以获取相关信息,一下信息可能会对你有帮助:(0x80070422) 分析原因 ...

  8. (转)Maven之自定义archetype生成项目骨架

    背景:最近在开发一个项目的基础构件,在以后项目的开发过程中可以直接使用该构件快速的生成项目骨架进行开发. 摘要:使用过Maven的人都知道maven中有许多功能都是通过插件来提供的,今天我们来说一下其 ...

  9. Codeforces Round #510 (Div. 2)(B)

    传送门:Problem B https://www.cnblogs.com/violet-acmer/p/9682082.html 题意: 如果可以通过喝果汁将维生素A,B,C全部摄取,求最小花费,如 ...

  10. 'RegAsm.exe' 不是内部或外部命令

    我想从cmd运行regasm.exe.它在c:\windows \Microsoft.net\framework\2.057 中可用 我喜欢这个c:\ regasm.exe 它给予 regasm无法识 ...