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. npm报错及解决

    nodejs安装之后 无法使用 npm的解决方法 首先我们要知道Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 Node.js 使用了一个事件驱动.非阻塞式 I ...

  2. ubuntu18.04 安装 QQ

    参照大佬文章https://www.lulinux.com/archives/1319 我将安装过程需要的命令行总结出来,便于直接快速安装. # 安装 wine git clone https://g ...

  3. Xcode 中配置 clang-format 格式化 C++ 代码

    Xcode 自带的代码格式化功能(control + I)很有限,其 "格式化" 仅限于设置缩进,代码里面的格式是不会处理的.所以需要借助额外的工具来完成代码的美化. clang- ...

  4. FCC---Use the CSS Transform Property skewX to Skew an Element Along the X-Axis

    The next function of the transform property is skewX(), which skews the selected element along its X ...

  5. react-native 键盘遮挡输入框

    Android上已经自动对键盘遮挡输入框做了处理,所以我们只需要关注ios. 1.首先引入 KeyboardAvoidingView import { KeyboardAvoidingView } f ...

  6. Jupyter Notebooks的安装和使用介绍

    最近又开始重新学习Python,学习中使用到了一款编辑器Jupyter Notebooks ,非常想安利给初学python的同学.注:本文内容仅针对windows环境下安装和配置Jupyter Not ...

  7. hadoop节点动态删除与增加

    动态删除 1)修改配置文件 修改hdfs-site.xml文件,适当减小dfs.replication的数量,增加dfs.hosts.exclude选项 vi hdfs-site.xml <pr ...

  8. 跑健壮性Monkey,出现一次Crash全过程-日志分析-董浩-Dotest

    最近带着学生做的某个项目,跑健壮性Monkey,出现一次Crash全过程-日志分析: 准备:搭建adb环境.安装实际测试包:开始: Monkey命令: 1 2 3 4 5 adb shell monk ...

  9. java8-02-再探Lambda表达式

    Lambda表达式   主要作用替代匿名内部类   达到简化代码的操作                                  Lambda表达式 在对象中的使用   Employee类

  10. c++ 命令行执行

    常用命令如下 g++ -g -std=c++ a.cpp -std 指定c++的版本 -g 在可执行程序中包含标准调试信息 -o FILE 指定输出文件名,在编译为目标代码时,这一选项不是必须的.如果 ...