超详细讲解SpringBoot——数据访问

心已赠人 2022-12-11 05:22 374阅读 0赞

前言:

大部分系统都离不开数据访问,数据库包括SQL和NOSQL,SQL是指关系型数据库,常见的有SQL Server,Oracle,MySQL(开源),NOSQL是泛指非关系型数据库,常见的有MongoDB,Redis。

用spring开发时我们常用的ORM框架有JDBC、Mybatis,Hibernate,现在最常用的应该是Mybatis。

在Springboot中对于数据访问层,无论是SQL还是NOSQL,都默认采用整合Spring Data的方式进行统一处理,Springboot会帮我们添加大量自动配置,屏蔽了很多设置。并引入各种xxxTemplate,xxxRepository来简化我们对数据访问层的操作。对我们来说只需要进行简单的设置即可。这篇就来学习springboot整合JDBC,mybatis、JPA。

我们需要用什么数据访问,就引入相关的start进行开发。

一、JDBC

jdbc是我们最先学习的一个数据库框架,SpringBoot也进行了相应整合。

(1)引入依赖

  1. <!--JDBC -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-jdbc</artifactId>
  5. </dependency>
  6. <!--mysql 驱动-->
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <scope>runtime</scope>
  11. </dependency>

(2)数据源配置

我們可以做个测试:

  1. @Autowired
  2. private DataSource dataSource;
  3. @Test
  4. public void test() throws SQLException {
  5. System.out.println(dataSource.getClass());
  6. Connection connection = dataSource.getConnection();
  7. System.out.println(connection);
  8. connection.close();
  9. }

输出为:com.zaxxer.hikari.HikariDataSource

说明默认数据源是com.zaxxer.hikari.HikariDataSource,而在springboot 2.0之前为org.apache.tomcat.jdbc.pool.DataSource。我们也可以通过改变spring.datasource.type 属性来更改我们想自定义的数据源。数据源的相关配置都在DataSourceProperties,我们可以参考这个类进行配置。

(3)DataSourceInitializer

DataSourceInitializer这里面有两个方法runSchemaScripts()可以运行建表语句,runDataScripts()可以运行插入数据的sql语句。

默认使用schema-.sql创建建表语句,用data-.sql插入数据语句,当然我们也可以自己配置:

  1. spring:
  2. datasource:
  3. schema:
  4. - classpath:department.sql

(4)操作数据库

由于spingboot已经帮我们自动配置了,那我们可以直接使用JdbcTemplate进行数据库操作:

  1. @Autowired
  2. JdbcTemplate jdbcTemplate;
  3. @Test
  4. public void jdbcTest(){
  5. List<Map<String, Object>> mapList = jdbcTemplate.queryForList("select * from user ");
  6. System.out.println(mapList.get(0));
  7. }

结果:{id=1, username=王五, birthday=null, sex=2, address=null}

二、整合Druid数据源

上面讲到我们有默认的数据源,但一般情况我们还是会使用阿里提供的Druid数据源,因为Druid提供的功能更多,并且能够监控统计,这个时候我们需要先引入pom依赖,然后将spring.datasource.type 修改:

  1. <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid</artifactId>
  5. <version>1.1.16</version>
  6. </dependency>

Druid的常用配置如下:

  1. type: com.alibaba.druid.pool.DruidDataSource
  2. # 数据源其他配置
  3. initialSize: 5
  4. minIdle: 5
  5. maxActive: 20
  6. maxWait: 60000
  7. timeBetweenEvictionRunsMillis: 60000
  8. minEvictableIdleTimeMillis: 300000
  9. validationQuery: SELECT 1 FROM DUAL
  10. testWhileIdle: true
  11. testOnBorrow: false
  12. testOnReturn: false
  13. poolPreparedStatements: true
  14. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
  15. filters: stat,wall,log4j
  16. maxPoolPreparedStatementPerConnectionSize: 20
  17. useGlobalDataSourceStat: true
  18. connectionProperties: druid.stat.mergeSql=true;
  19. druid.stat.slowSqlMillis=500

配置之后不会立刻生效,我们还需要编写配置类:

  1. @Configuration
  2. public class DruidConfig {
  3. @ConfigurationProperties(prefix = "spring.datasource")
  4. @Bean
  5. public DataSource druid(){
  6. return new DruidDataSource();
  7. }
  8. }

再次运行上面查询数据源的方法,可以得到如下结果:

在这里插入图片描述
注:必须引入日志依赖,否则会报错

  1. <!-- https://mvnrepository.com/artifact/log4j/log4j -->
  2. <dependency>
  3. <groupId>log4j</groupId>
  4. <artifactId>log4j</artifactId>
  5. <version>1.2.17</version>
  6. </dependency>

我们在加上Druid的监控配置:

  1. //配置Druid的监控
  2. //1、配置一个管理后台的Servlet
  3. @Bean
  4. public ServletRegistrationBean statViewServlet(){
  5. ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
  6. Map<String,String> initParams = new HashMap<>();
  7. initParams.put("loginUsername","admin");
  8. initParams.put("loginPassword","123456");
  9. initParams.put("allow","");
  10. //默认就是允许所有访问
  11. initParams.put("deny","192.168.15.21");
  12. bean.setInitParameters(initParams);
  13. return bean;
  14. }
  15. //2、配置一个web监控的filter
  16. @Bean
  17. public FilterRegistrationBean webStatFilter(){
  18. FilterRegistrationBean bean = new FilterRegistrationBean();
  19. bean.setFilter(new WebStatFilter());
  20. Map<String,String> initParams = new HashMap<>();
  21. initParams.put("exclusions","*.js,*.css,/druid/*");
  22. bean.setInitParameters(initParams);
  23. bean.setUrlPatterns(Arrays.asList("/*"));
  24. return bean;
  25. }

这样我们可以直接通过后台监控数据源访问情况。

三、Mybatis

第一步也是引入依赖:

  1. <dependency>
  2. <groupId>org.mybatis.spring.boot</groupId>
  3. <artifactId>mybatis-spring-boot-starter</artifactId>
  4. <version>1.3.1</version>
  5. </dependency>

也导入Druid数据源,并加入之前学习Mybatis时用到的实体,而后就可以进行测试,Mybatis的使用也有两种方法,注解版和配置文件版,注解版用的很少,一般都是配置文件。

(1)注解版

  1. @Mapper
  2. public interface DepartmentMapper {
  3. @Select("select * from department where id=#{id}")
  4. Department getDeptById(Integer id);
  5. @Delete("delete from department where id=#{id}")
  6. int deleteDeptById(Integer id);
  7. @Options(useGeneratedKeys = true,keyProperty = "id")
  8. @Insert("insert into department(departmentName) values(#{departmentName})")
  9. int insertDept(Department department);
  10. @Update("update department set departmentName=#{departmentName} where id=#{id}")
  11. int updateDept(Department department);
  12. }

测试:

  1. @Autowired
  2. UserMapper userMapper;
  3. @Autowired
  4. DepartmentMapper departmentMapper;
  5. @Test
  6. public void mybatisTest(){
  7. Department deptById = departmentMapper.getDeptById(1);
  8. System.out.println(deptById);
  9. }
  10. 结果:Department(id=1, departmentName=AA)

(2)配置文件版

使用配置文件版方式也很简单,也是先新增一个接口:

  1. @Mapper
  2. public interface UserMapper {
  3. User queryUserById(Integer id);
  4. }

然后新增一个全局配置文件:SqlMapConfig.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. </configuration>

里面暂时什么配置都不需要,然后再引入相应的XXXMapper.xml文件,最后在配置文件中加上扫描文件配置即可

  1. mybatis:
  2. config-location: classpath:mybatis/SqlMapConfig.xml
  3. mapper-locations: classpath:mybatis/mapper/*.xml

在这里插入图片描述
UserMapper.xml内容:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.yuanqinnan.mapper.UserMapper">
  6. <select id="queryUserById" parameterType="int" resultType="com.yuanqinnan.model.User">
  7. SELECT * FROM `user`where id=#{ id}
  8. </select>
  9. </mapper>

测试:

  1. @Test
  2. public void mybatisTest(){
  3. Department deptById = departmentMapper.getDeptById(1);
  4. System.out.println(deptById);
  5. User userById = userMapper.queryUserById(1);
  6. System.out.println(userById);
  7. }

Mybatis的配置就是这么简单,基本不需要额外配置。

四、JPA

JDBC和Mybatis我们之前都学习过,SpringBoot只不过是帮我们整合配置,而JPA我们之前没有接触过,所以还是要先解释下,了解JPA之前我们先了解Spring Data:

Spring Data 项目的目的是为了简化构建基于Spring 框架应用的数据访问技术,包括非关系数据库、Map-Reduce 框架、云数据服务等等;另外也包含对关系数据库的访问支持。
在这里插入图片描述
Spring Data 主要特点是:

SpringData为我们提供使用统一的API来对数据访问层进行操作;这主要是Spring Data Commons项目来实现的。Spring Data Commons让我们在使用关系型或者非关系型数据访问技术时都基于Spring提供的统一标准,标准包含了CRUD(创建、获取、更新、删除)、查询、排序和分页的相关操作。

SpringData帮我们封装了数据库操作,我们只需要进程接口,就可以进行操作,SpringData有如下统一的接口

Repository:统一接口 RevisionRepository:基于乐观锁机制 CrudRepository:基本CRUD操作 PagingAndSortingRepository:基本CRUD及分页

我们要使用JPA,就是继承JpaRepository,我们只要按照它的命名规范去对命名接口,便可以实现数据库操作功能,这样说有些抽象,还是用一个例子来说明:

第一步:引入依赖

  1. <!-- springdata jpa依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-jpa</artifactId>
  5. </dependency>

第二步:编写表对应实体:

  1. //使用JPA注解配置映射关系
  2. @Entity //告诉JPA这是一个实体类(和数据表映射的类)
  3. @Table(name = "order") //@Table来指定和哪个数据表对应;order;
  4. @Data
  5. public class Order {
  6. @Id //这是一个主键
  7. @GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
  8. private Integer id;
  9. @Column(name = "user_Id")
  10. private Integer userId;
  11. //这是和数据表对应的一个列
  12. @Column(name="number",length = 32)
  13. private String number;
  14. // 订单创建时间,省略默认列名就是属性名
  15. private Date createtime;
  16. // 备注
  17. private String note;
  18. }

第三步:编写仓库接口:

  1. @Repository
  2. public interface OrderRepository extends JpaRepository<Order, Integer> {
  3. }

这个时候OrderRepository 已经有了很多实现好的方法,我们只要跟着调用即可

测试:

  1. @Autowired
  2. OrderRepository orderRepository;
  3. @Test
  4. public void jpaTest(){
  5. List<Order> all = orderRepository.findAll();
  6. System.out.println(all);
  7. }

一个简单的JPA实现完成,当然JPA的内容很多,这里只是一个非常简单的例子,要进一步的学习的话还是要去看官方文档。

结语:

这里的分享暂时就这样了,我这还整理有大量的Java面试资料和学习资料,有需要的可以点击进入,暗号:cszq,免费领取!
在这里插入图片描述
在这里插入图片描述
最后!祝大家都能工作顺利哦!

发表评论

表情:
评论列表 (有 0 条评论,374人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringBoot详细讲解

    这篇文章主要介绍了SpringBoot通过自定义classloader加密class文件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考

    相关 RAID技术详细讲解

    RAID 技术是一种多磁盘技术,面对数据的各方面有着两面性的影响,整体来说优点大于缺点的,下面我将详细介绍一下 RAID ,简称磁盘阵列技术。 一、RAID 概述