springBoot 集成Mysql数据库

前一段时间,我们大体介绍过SpringBoot,想必大家还有依稀的印象。我们先来回顾一下:SpringBoot是目前java世界最流行的一个企业级解决方案框架。它深度绑定了依赖注入和面向切片两种编程思想。并且通过自动化的方式减少了编程人员在开发过程中大量的繁琐的配置和通用的配置型的编码,让编程人员可以更加聚焦于业务,解决实际的问题。
 
我们的日常工作有机会主要是围绕数据库进行编程和设计,那么数据库的增删改查对于我们来说可以说是最重要最核心最需要掌握的能力。
 
本次,我们假设大家已经按照上次培训的内容,下载了对应的spring框架,开发编译器,maven等必备工具。在此基础上,我们来聊聊springBoot集成Mysql数据库。希望通过学习后,大家能够发挥聪明材质,将Mysql库更换成oracle库甚至是sqlserver库。
 
mysql库的安装,网络上有很多其他教程,在此略过不谈,我们假设大家的mysql库已经安装完毕。直接开始mysql库的集成工作。
 
springBoot链接数据库,有三种方式:
  1. 采用JDBC直接链接
  2. 采用JdbcTemplate链接
  3. 采用SpringDataJPA链接
  4. 通过其他框架链接
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链接的。
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <scope>runtime</scope>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
 
第二步,在配置文件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
第三步,设计数据库表
CREATE TABLE `ay_user` (
  `id` varchar(32) NOT NULL,
  `name` varchar(10) DEFAULT NULL COMMENT '用户名',
  `password` varchar(32) DEFAULT NULL COMMENT '密码'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
第四步,建立对应的数据库实体
public class AyUser {
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
    private String id;
    private  String name;
    private  String password;
 
}
第五步利用springboot的jdbc类读取。此处采用一个测试用例展现
@Resource
private JdbcTemplate jdbcTemplate;
 
@Test
public  void  mySqlTest(){
    String sql = "select id,name,password from ay_user ";
    //query(),查询方法,传入sql语句和RowMapper对象,返回对象List。
    //RowMapper对象,将查询出来的每一行数据封装成用户定义的类
    List<AyUser> userList = (List<AyUser>) jdbcTemplate.query(sql, new RowMapper<AyUser>() {
        @Override
        public  AyUser mapRow(ResultSet re, int rowNum) throws SQLException {
            AyUser user = new AyUser();
            user.setId(re.getString("id"));
            user.setName(re.getString("name"));
            user.setPassword(re.getString("password"));
            return  user;
        }
 
    });
    System.out.println("查询成功:");
    for (AyUser user:userList){
        System.out.println("[id]:"+user.getId()+";[name]:"+user.getName());
    }
}
此处有部分细节需要进一步阐释。
@Resource
private JdbcTemplate 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依赖添加进去。
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
第二步,创建一个接口继承JpaRepository接口(后期可以添加一些自定义的东西)
public interface AyUserRepository extends JpaRepository<AyUser,String> {
    //自定义内容
    List<AyUser> findByName(String name);
    List<AyUser> findByNameLike(String name);
    List<AyUser> findByIdIn(Collection<String> ids);
}
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的名字进行寻找
public class AyUser {
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
    @Id//表示表的主键
    private String id;
    private  String name;
    private  String password;
 
}
第四部,模拟一个简单的JPA实现
public interface AyUserService {
    AyUser findById(String id);
    List<AyUser> findAll();
    AyUser save(AyUser ayUser);
    void  delete(String id);

    //Pageable是一个分页接口,Page是一个分页查询结果借口
    Page<AyUser> findAll(Pageable pageable);

   List<AyUser> findByName(String name);
   List<AyUser> findByNameLike(String name);
   List<AyUser> findByIdIn(Collection<String> ids);
}
 
@Service//服务类注解,和@Component起到类似的作用:自动扫描并注册到Spring容器中
public class AyUserServiceImpl implements AyUserService {
    @Resource//自动扫描AyUserRepository并注册
    private AyUserRepository ayUserRepository;
 
    @Override
    public AyUser findById(String id) {
        return ayUserRepository.findById(id).get();
    }
 
    @Override
    public List<AyUser> findAll() {
        return ayUserRepository.findAll();
    }
 
    @Override
    public AyUser save(AyUser ayUser) {
        return ayUserRepository.save(ayUser);
    }
 
    @Override
    public void delete(String id) {
        ayUserRepository.deleteById(id);
    }
    //翻页
    @Override
    public Page<AyUser> findAll(Pageable pageable) {
        return ayUserRepository.findAll(pageable);
    }

    @Override
    public List<AyUser> findByName(String name) {
        return ayUserRepository.findByName(name);
    }
 
    @Override
    public List<AyUser> findByNameLike(String name) {
        return ayUserRepository.findByNameLike(name);
    }
 
    @Override
    public List<AyUser> findByIdIn(Collection<String> ids) {
        return ayUserRepository.findByIdIn(ids);
    }
}
第五步,使用JPA进行增删改查
@Resource
private AyUserService ayUserService;
 
@Test
public  void testRepository(){
    List<AyUser> userList = ayUserService.findAll();
    System.out.println("findAll():"+userList.size());
 
    List<AyUser> userList2 = ayUserService.findByName("文鹏");
    System.out.println("findByName():"+userList2.size());
    Assert.isTrue(userList2.get(0).getName().equals(("文鹏")));
 
 
    List<AyUser> userList3 = ayUserService.findByNameLike("文%");
    System.out.println("findByNameLike():"+userList3.size());
    Assert.isTrue(userList3.get(0).getName().equals(("文鹏")));
 
    List<String> ids = new ArrayList<String>();
    ids.add("1");
    ids.add("2");
    List<AyUser> userList4 = ayUserService.findByIdIn(ids);
    System.out.println("findByIdIn:"+userList4.size());
 
    PageRequest pageRequest = PageRequest.of(0,10);
    Page<AyUser> userList5 = ayUserService.findAll(pageRequest);
    System.out.println("page findAll:"+userList5.getTotalPages()+"/"+userList5.getSize());
 
    List<AyUser> userList6 = ayUserService.findByNameLike("%国%");
    System.out.println("findByNameLike():"+userList6.size());
    Assert.isTrue(userList6.get(0).getName().equals(("文国平")));
 
    AyUser ayUser = new AyUser();
    ayUser.setId("4");
    ayUser.setName("李国正");
    ayUser.setPassword("123");
    ayUserService.save(ayUser);
 
    List<AyUser> userList7 = ayUserService.findByNameLike("%国%");
    System.out.println("findByNameLike():"+userList7.size());
    Assert.isTrue(userList7.get(0).getName().equals(("文国平")));
 
    ayUserService.delete("4");
 
    List<AyUser> userList8 = 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
public class AyUserServiceImpl implements AyUserService {
    @Transactional
    @Override
    public void delete(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数据库的更多相关文章

  1. 关于springboot 连接mysql 数据库报错问题

    springboot连接MySQL运行报错: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more ...

  2. 【SpringBoot】SpringBoot集成jasypt数据库密码加密

    一.为什么要使用jasypt库? 目前springboot单体应用项目中,甚至没有使用外部配置中心的多服务的微服务架构的项目,开发/测试/生产环境中的密码往往是明文配置在yml或properties文 ...

  3. SpringBoot配置MySql数据库和Druid连接池

    1.pom文件增加相关依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connec ...

  4. springboot集成巨杉数据库

    springboot倾向于约定优于配置,所以大大简化了搭建项目的流程,包括各种数据源的配置,接下来就和大家分享下最近用到的巨杉数据源连接池的配置 1.现在配置文件中定义巨杉连接池的各种连接信息,至于每 ...

  5. springboot连接mysql数据库,JdbcTemplate和spring JPA方式

    SQL部分 CREATE TABLE test( id ) primary key, name ) not null, age ), address ) ); ,,'bj'); ,,'sh'); ,, ...

  6. SpringBoot使用Druid数据库加密链接完整方案

    网上的坑 springboot 使用 Druid 数据库加密链接方案,不建议采用网上的一篇文章<springboot 结合 Druid 加密数据库密码遇到的坑!>介绍的方式来进行加密链接实 ...

  7. SpringBoot框架与MyBatis集成,连接Mysql数据库

    SpringBoot是一种用来简化新Spring应用初始搭建及开发过程的框架,它使用特定方式来进行配置,使得开发人员不再需要定义样板化的配置.MyBatis是一个支持普通SQL查询.存储和高级映射的持 ...

  8. SpringBoot 集成Mybatis 连接Mysql数据库

    记录SpringBoot 集成Mybatis 连接数据库 防止后面忘记 1.添加Mybatis和Mysql依赖 <dependency> <groupId>org.mybati ...

  9. 通用mapper版+SpringBoot+MyBatis框架+mysql数据库的整合

    转:https://blog.csdn.net/qq_35153200/article/details/79538440 开发环境: 开发工具:Intellij IDEA 2017.2.3 JDK : ...

随机推荐

  1. SpringCloud微服务(03):Hystrix组件,实现服务熔断

    本文源码:GitHub·点这里 || GitEE·点这里 写在前面:阅读本文前,你可能需要熟悉一下内容. 微服务组件:Eureka管理注册中心 微服务组件:Ribbon和Feign服务调用 Sprin ...

  2. Spring Boot 2.2.2.RELEASE 版本中文参考文档【3.2 - 3.10】

    Spring Boot 2.2.2.RELEASE版本中文文档持续更新中~如有需要获取参考文档文件,关注公众号JavaSo,回复“参考文档”即可. 3.2 结构化代码 Spring Boot不需要任何 ...

  3. SpringCloud(六):服务网关zuul-API网关(服务降级和过滤)

    什么是API网关: 在微服务架构中,通常会有多个服务提供者.设想一个电商系统,可能会有商品.订单.支付.用户等多个类型的服务,而每个类型的服务数量也会随着整个系统体量的增大也会随之增长和变更.作为UI ...

  4. JS基础语法---内置对象

    js学习中三种对象: 内置对象----js系统自带的对象 自定义对象---自己定义的构造函数创建的对象 浏览器对象---BOM的时候讲 内置对象: Math Date String Array Obj ...

  5. CSS学习笔记-边框图片等属性

      1.边框图片:        1.1含义:            告诉浏览器指定一张图片作为边框        1.2格式:             border-image-source:url ...

  6. MySQL基础之练习题

    题目 现有班级.学生以及成绩三张表: 备注:表名称和字段名称可以参考表格内单词设置 根据表格信息,按要求完成下面SQL语句的编写: 1.使用SQL分别创建班级表.学生表以及成绩表的表结构,表内数据可以 ...

  7. 数据结构笔记1(c++)_指针

    一.数据结构概述 1.定义: 我们如何把现实中大量而复杂的问题,以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排 ...

  8. linux服务器下oracle开机自启动设置

    1.首先切换到Oracle用户 [oracle@oracletest ~]$ cd /u01/app/oracle/product/11.2.0/db_1/bin/       -----标红字体部分 ...

  9. python的imread、newaxis

    一:imread 用来读取图片,返回一个numpy.ndarray类型的多维数组,具有两个参数: 参数1 filename, 读取的图片文件名,可以使用相对路径或者绝对路径,但必须带完整的文件扩展名( ...

  10. Vue入门(二)

    1.vue3.0安装 cnpm install -g @vue/cli 或者 yarn global add @vue/cli //创建项目 vue create hello-world //运行 n ...