springBoot 集成Mysql数据库

前一段时间,我们大体介绍过SpringBoot,想必大家还有依稀的印象。我们先来回顾一下:SpringBoot是目前java世界最流行的一个企业级解决方案框架。它深度绑定了依赖注入和面向切片两种编程思想。并且通过自动化的方式减少了编程人员在开发过程中大量的繁琐的配置和通用的配置型的编码,让编程人员可以更加聚焦于业务,解决实际的问题。

我们的日常工作有机会主要是围绕数据库进行编程和设计,那么数据库的增删改查对于我们来说可以说是最重要最核心最需要掌握的能力。

本次,我们假设大家已经按照上次培训的内容,下载了对应的spring框架,开发编译器,maven等必备工具。在此基础上,我们来聊聊springBoot集成Mysql数据库。希望通过学习后,大家能够发挥聪明材质,将Mysql库更换成oracle库甚至是sqlserver库。

mysql库的安装,网络上有很多其他教程,在此略过不谈,我们假设大家的mysql库已经安装完毕。直接开始mysql库的集成工作。

springBoot链接数据库,有三种方式:

采用JDBC直接链接

采用JdbcTemplate链接

采用SpringDataJPA链接

通过其他框架链接

JDBC直接链接繁琐,易错。我们直接略过,不做考虑。通过其他框架如MyBatis等,种类繁多,我们后续再讲。本次我们重点讲解JdbcTemplate和SpringDataJPA。特别是SpringDataJPA。

JdbcTemplate在JDBC的基础上做了大量的封装,SpringDataJPA是基于JPA(java持久化规范,本质上是ORM)的规范的一层封装,JPA的具体的实现有Hibernate,OpenJPA等。JdbcTemplate和SpringDataJPA的最大区别是JdbcTemplate主要操作sql数据库,SpringDataJPA主要操作对象。

我们首先了解采用JdbcTemplate链接mysql

首先第一步,修改maven的pom文件,将mysql和jdbc依赖添加进去。

//第一个dependency,是添加的mysql链接java的驱动程序

//第二个dependency,是支持通过JDBC链接数据库。和C#的ADO一样,都是基于ODBC链接的。

mysql

mysql-connector-java

runtime

org.springframework.boot

spring-boot-starter-data-jdbc

第二步,在配置文件application.properties中添加mysql链接串

###mysql 连接信息,test是数据库名

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test

###用户名

spring.datasource.username=root

###密码

spring.datasource.password=sa

###驱动

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

第三步,设计数据库表

CREATETABLE`ay_user`(

`id`varchar(32)NOTNULL,

`name`varchar(10)DEFAULTNULLCOMMENT'用户名',

`password`varchar(32)DEFAULTNULLCOMMENT'密码'

)ENGINE=InnoDB DEFAULTCHARSET=utf8

第四步,建立对应的数据库实体

publicclassAyUser{

publicString getId(){

returnid;

}

publicvoidsetId(String id){

this.id =id;

}

publicString getName(){

returnname;

}

publicvoidsetName(String name){

this.name =name;

}

publicString getPassword(){

returnpassword;

}

publicvoidsetPassword(String password){

this.password =password;

}

privateString id;

privateString name;

privateString password;

}

第五步利用springboot的jdbc类读取。此处采用一个测试用例展现

@Resource

privateJdbcTemplate jdbcTemplate;

@Test

publicvoidmySqlTest(){

String sql ="select id,name,password from ay_user ";

//query(),查询方法,传入sql语句和RowMapper对象,返回对象List。

//RowMapper对象,将查询出来的每一行数据封装成用户定义的类

ListuserList =(List)jdbcTemplate.query(sql,newRowMapper(){

@Override

publicAyUser mapRow(ResultSet re,int rowNum)throws SQLException {

AyUser user =newAyUser();

user.setId(re.getString("id"));

user.setName(re.getString("name"));

user.setPassword(re.getString("password"));

returnuser;

}

});

System.out.println("查询成功:");

for(AyUser user:userList){

System.out.println("[id]:"+user.getId()+";[name]:"+user.getName());

}

}

此处有部分细节需要进一步阐释。

@Resource

privateJdbcTemplate jdbcTemplate;

JdbcTemplate是一个通过JDBC链接数据库的工具类,maven的pom文件中引入的

spring-boot-starter-data-jdbc中包含了spring-jdbc的包,我们主要通过它

来完成增删改查

@Resource代表自动注入,通过这个注解,项目启动后,SpringBoot会帮助我们实例化一个

JdbcTemplate对象,省去初始化工作

对于各种注解,可以查看一个脑图,这个脑图是基于自己的理解自行整理的,可能有错误或不全面,后面可以可以共同优化。

那么采用SpringDataJPA如何操作mysql数据库呢?

具体操作之前,我们简单了解一下SpringDataJPA。

SpringDataJPA最顶层的接口是Repository,它是一个空的,只定义了泛型和ID关键字(可以查看Repository源码),CrudRepository则提供了基本的增删改查接口,PagingAndSortingRepository提供了基本的分页和排序接口,JpaRepository继承了上述接口,是我们常用的底层的接口。

具体如何使用呢?

第一步,修改maven的pom文件,将jpa依赖添加进去。

org.springframework.boot

spring-boot-starter-data-jpa

第二步,创建一个接口继承JpaRepository接口(后期可以添加一些自定义的东西)

publicinterfaceAyUserRepositoryextendsJpaRepository{

//自定义内容

ListfindByName(String name);

ListfindByNameLike(String name);

ListfindByIdIn(Collectionids);

}

SpringDataJPA约定了一系列规范,JPA会根据代码翻译成相关的sql。如findBy,Like,In等关键字。

可从官网https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.repositories的5.3.2的table3中查看全部写法。

不完整截图如下:

第三步,修改AyUser类,添加@Entity, @Id注解。

@Entity//每个持久化POJO类都是一个实体Bean,通过此注解申明

@Table(name="ay_user")//对象映射到数据库的表,如果没有,Spring会根据class的名字进行寻找

publicclassAyUser{

publicString getId(){

returnid;

}

publicvoidsetId(String id){

this.id =id;

}

publicString getName(){

returnname;

}

publicvoidsetName(String name){

this.name =name;

}

publicString getPassword(){

returnpassword;

}

publicvoidsetPassword(String password){

this.password =password;

}

@Id//表示表的主键

privateString id;

privateString name;

privateString password;

}

第四部,模拟一个简单的JPA实现

publicinterfaceAyUserService{

AyUser findById(String id);

ListfindAll();

AyUser save(AyUser ayUser);

voiddelete(String id);

//Pageable是一个分页接口,Page是一个分页查询结果借口

PagefindAll(Pageable pageable);

ListfindByName(String name);

ListfindByNameLike(String name);

ListfindByIdIn(Collectionids);

}

@Service//服务类注解,和@Component起到类似的作用:自动扫描并注册到Spring容器中

publicclassAyUserServiceImplimplementsAyUserService{

@Resource//自动扫描AyUserRepository并注册

privateAyUserRepository ayUserRepository;

@Override

publicAyUser findById(String id){

returnayUserRepository.findById(id).get();

}

@Override

publicListfindAll(){

returnayUserRepository.findAll();

}

@Override

publicAyUser save(AyUser ayUser){

returnayUserRepository.save(ayUser);

}

@Override

publicvoiddelete(String id){

ayUserRepository.deleteById(id);

}

//翻页

@Override

publicPagefindAll(Pageable pageable){

returnayUserRepository.findAll(pageable);

}

@Override

publicListfindByName(String name){

returnayUserRepository.findByName(name);

}

@Override

publicListfindByNameLike(String name){

returnayUserRepository.findByNameLike(name);

}

@Override

publicListfindByIdIn(Collectionids){

returnayUserRepository.findByIdIn(ids);

}

}

第五步,使用JPA进行增删改查

@Resource

privateAyUserService ayUserService;

@Test

publicvoidtestRepository(){

ListuserList =ayUserService.findAll();

System.out.println("findAll():"+userList.size());

ListuserList2 =ayUserService.findByName("文鹏");

System.out.println("findByName():"+userList2.size());

Assert.isTrue(userList2.get(0).getName().equals(("文鹏")));

ListuserList3 =ayUserService.findByNameLike("文%");

System.out.println("findByNameLike():"+userList3.size());

Assert.isTrue(userList3.get(0).getName().equals(("文鹏")));

Listids =newArrayList();

ids.add("1");

ids.add("2");

ListuserList4 =ayUserService.findByIdIn(ids);

System.out.println("findByIdIn:"+userList4.size());

PageRequest pageRequest =PageRequest.of(0,10);

PageuserList5 =ayUserService.findAll(pageRequest);

System.out.println("page findAll:"+userList5.getTotalPages()+"/"+userList5.getSize());

ListuserList6 =ayUserService.findByNameLike("%国%");

System.out.println("findByNameLike():"+userList6.size());

Assert.isTrue(userList6.get(0).getName().equals(("文国平")));

AyUser ayUser =newAyUser();

ayUser.setId("4");

ayUser.setName("李国正");

ayUser.setPassword("123");

ayUserService.save(ayUser);

ListuserList7 =ayUserService.findByNameLike("%国%");

System.out.println("findByNameLike():"+userList7.size());

Assert.isTrue(userList7.get(0).getName().equals(("文国平")));

ayUserService.delete("4");

ListuserList8 =ayUserService.findByNameLike("%国%");

System.out.println("findByNameLike():"+userList8.size());

Assert.isTrue(userList8.get(0).getName().equals(("文国平")));

}

事务是我们数据库操作的重要组成部分,有很多业务场景需要事务的原子性,一致性,隔离性和持久性。

SpringBoot同时支持编程式事务管理和声明式事务管理。编程式需要每个方法中额外增加提交和回滚动作,Spring推荐采用声明式事务管理,并通过内置的Spring AOP切片框架支持。

那么通过SpringDataJPA如何实现事务?

SpringBoot默认开启了JPA,JDBC,MyBatis的事务,无需我们做任何多余的配置。我们只需要对要起开事务的类或方法添加@Transactional注解即可。

@Transactional

@Service

publicclassAyUserServiceImplimplementsAyUserService{

@Transactional

@Override

publicvoiddelete(String id){

ayUserRepository.deleteById(id);

String e =null;

e.split("/");

}

}

@Transactional注解可以通过参数propagation定义事务的传播级别,也可以通过参数isolation隔离级别。

@Transactional(propagation=Propagation.REQUIRED)//控制事务传播。默认是Propagation.REQUIRED

@Transactional(isolation=Isolation.DEFAULT)//控制事务隔离级别。默认跟数据库的默认隔离级别相同

@Transactional(readOnly=false)//控制事务可读写还是只可读。默认可读写

@Transactional(timeout=30)//控制事务的超时时间,单位秒。默认跟数据库的事务控制系统相同,又说是30秒

@Transactional(rollbackFor=RuntimeException.class)//控制事务遇到哪些异常才会回滚。默认是RuntimeException

@Transactional(rollbackForClassName=RuntimeException)//同上

@Transactional(noRollbackFor=NullPointerException.class)//控制事务遇到哪些异常不会回滚。默认遇到非RuntimeException不会回滚

@Transactional(noRollbackForClassName=NullPointerException)//同上

具体可参考文章:

springboot整合mysql数据库_springBoot 集成Mysql数据库相关推荐

  1. springboot mysql事物_springboot如何开启数据库事务

    springboot开启事务很简单,只需要一个注解@Transactional 就可以了.因为在springboot中已经默认对jpa.jdbc.mybatis开启了事事务,引入它们依赖的时候,事物就 ...

  2. springboot集合MySQL删除_SpringBoot集成Spring JdbcTemplate并完成增删改查操作

    JdbcTemplate是Spring用来简化JDBC操作的核心类,有助于与Spring集成,并且避免了过多冗长的JDBC代码.不过在实际使用中,我们通常使用NamedParameterJdbcTem ...

  3. springboot mysql脚本_springboot配置mysql连接的实例代码

    一:导入pmo.xm配置包 mysql库连接.druid连接池.mybatis组件 mysql mysql-connector-java runtime com.alibaba druid-sprin ...

  4. 【SpringBoot】65、SpringBoot整合Canal+RabbitMQ监听MySQL实现数据同步更新Redis缓存

    canal 简介 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更.从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行 ...

  5. mysql-plus多数据库_Springboot+mybatisplus+mysql配置多数据源(注解版)

    1.添加依赖,最关键的两个依赖是后面两个"druid依赖"和"配置动态数据源"(已标红),其他"非主要"依赖可按自身实际开发环境进行选择. ...

  6. springboot整合canal,监听MySQL binlog日志,实现增量同步

    有两个数据库,并不是主从关系,但是需要同步某张表,可以通过binlog日志,进行同步,前提是这两个数据库的要同步的表,表名和字段名需要一致. 当前项目连接的数据库(需要同步的数据库):base_pro ...

  7. springboot整合持久层技术(mysql驱动问题)

    java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more tha ...

  8. 关于springboot整合mybatisplus中找不到数据库中的表的问题

    错误原因: 这里是因为我yml配置文件中,我的数据库连接错误了,这里应该是 myzhxy 而我写成了 zhxy,所以导致我的数据库找不到. 解决方法: 当我们看到这种错误的时候,可能是因为我们yml配 ...

  9. springboot jpa sql打印_SpringBoot集成Spring Data JPA以及读写分离

    相关代码:github OSCchina JPA是什么 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关联映射工具 来管理 ...

  10. springboot quartz 动态配置_springboot集成quartz实现动态任务调度

    quartz是一个开源的作业调度框架,本文就是介绍下springboot框架下继承quartz的一些使用示例 首先我们需要添加quartz的spring-boot-starter-quartz依赖 o ...

最新文章

  1. 解密ATS 4.2.3的缓存状态密码
  2. python---基础知识回顾(五)(python2.7和python3.5中的编码)
  3. python画图简单代码-用python进行简单的画图操作
  4. C语言文件读写(3)-二进制文件读写操作
  5. OpenShift Rancher 进行持续集成
  6. VO(DTO)模式在架构设计中是否需要
  7. 关于Tortoise git汉化包装了,不管用,仍然是英文菜单的问题记录
  8. 别再 select * 了,送你 12 个查询技巧!
  9. K-fold vs. Monte Carlo cross-validation(K折交叉验证与蒙特卡洛交叉验证(MCCV))
  10. Zookeeper之事件监听机制
  11. nginx静态代理设置一:静态文件在本机
  12. Dapr for dotnet | 服务调用-Service invoke(HTTP协议)
  13. jvm 性能调优之 jmap
  14. Word 设置标题编号
  15. 深度学习工作站攒机指南
  16. 使用python监控NTP系统(时钟服务器)
  17. 将Xbox360连接到Mac
  18. Samba文件服务器
  19. 2020年国家高新技术企业认定再从严!
  20. 大数据征信:央行开了“半扇门”

热门文章

  1. matlab qam信号仿真,基于Matlab/Simulink的QAM通信系统的仿真
  2. 【2021最新版】Kafka面试题总结(25道题含答案解析)
  3. 单片机蓝牙模块与手机蓝牙通信(1)
  4. Window10环境下安装VMware12
  5. 方正科技与鸿蒙os系统,国产手机系统的崛起——浅谈鸿蒙OS
  6. 数据驱动下的客群经营逻辑
  7. 《嵌入式-STM32开发指南》第三部分 外设篇 - 第5章 光敏传感器
  8. 海康、大华连接相机失败:未安装USB3驱动或驱动无效
  9. html中使用js实现福彩双色球随机选号
  10. 使用IDM的正确姿势