Spring Boot 数据访问(五)

前言

这篇文章我们来讲解数据的交互和访问,主要包括 JDBC,MyBatis,Spring Data JAP

Spring Boot 数据访问

对于数据访问层,无论是SQL还是NOSQL,Spring Boot默认采用整合 Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多设置。引入 各种xxxTemplate,xxxRepository来简化我们对数据访问层的操作。对我们来 说只需要进行简单的设置即可

  • 我们需要用什么数据访问,就引入相关的start进行开发。
    在这里插入图片描述

Spring Boot 整合JDBC

1、引入依赖
<!--JDBC -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mysql 驱动-->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>
2、配置application.yml
spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/jdbc
    driver-class-name: com.mysql.jdbc.Driver
3、数据源配置测试

经过上面的两个步骤基本已经配置完毕,下面我们测试看看是否成功

@Autowired
private DataSource dataSource;
@Test
public void test() throws SQLException {
    System.out.println(dataSource.getClass());
    Connection connection = dataSource.getConnection();
    System.out.println(connection);
    connection.close();
}

输出为:com.zaxxer.hikari.HikariDataSource

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

DataSourceInitializer

DataSourceInitializer这里面有两个方法runSchemaScripts()可以运行建表语句,runDataScripts()可以运行插入数据的sql语句。默认使用schema-.sql创建建表语句,用data-.sql插入数据语句,当然我们也可以自己配置:

spring:
  datasource:
    schema:
     - classpath:department.sql

操作数据库

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

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

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


整合Druid数据源

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

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.16</version>
</dependency>

Druid的常用配置如下:

spring:
  datasource:
#   数据源基本配置
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_crud
    type: com.alibaba.druid.pool.DruidDataSource
#   数据源其他配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
#   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙  
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true  
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
    

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

@Configuration
public class DruidConfig {
    @ConfigurationProperties(prefix = "spring.datasource")
        @Bean
        public DataSource druid(){
        return new DruidDataSource();
    }
}

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

//配置Druid的监控
//1、配置一个管理后台的Servlet
@Bean
public ServletRegistrationBean statViewServlet(){
    ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
    Map<String,String> initParams = new HashMap<>();
    initParams.put("loginUsername","admin");
    initParams.put("loginPassword","123456");
    initParams.put("allow","");
    //默认就是允许所有访问
    initParams.put("deny","192.168.15.21");
    bean.setInitParameters(initParams);
    return bean;
}
//2、配置一个web监控的filter
@Bean
public FilterRegistrationBean webStatFilter(){
    FilterRegistrationBean bean = new FilterRegistrationBean();
    bean.setFilter(new WebStatFilter());
    Map<String,String> initParams = new HashMap<>();
    initParams.put("exclusions","*.js,*.css,/druid/*");
    bean.setInitParameters(initParams);
    bean.setUrlPatterns(Arrays.asList("/*"));
    return  bean;
}

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


整合MyBatis

第一步导入依赖

	<dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.1</version>
    </dependency>

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

@Mapper
public interface DepartmentMapper {
    @Select("select * from department where id=#{id}")
        Department getDeptById(Integer id);
    @Delete("delete from department where id=#{id}")
        int deleteDeptById(Integer id);
    @Options(useGeneratedKeys = true,keyProperty = "id")
        @Insert("insert into department(departmentName) values(#{departmentName})")
        int insertDept(Department department);
    @Update("update department set departmentName=#{departmentName} where id=#{id}")
        int updateDept(Department department);
}

测试:

@Autowired
DepartmentMapper departmentMapper;

@Test
public void mybatisTest(){
    Department deptById = departmentMapper.getDeptById(1);
    System.out.println(deptById);

}

结果:Department(id=1, departmentName=AA)

自定义Mybatis配置规则

给容器中添加一个ConfigurationCustomizer;定制开启驼峰命名

@org.springframework.context.annotation.Configuration
public class MyBatisConfig {

    @Bean
    public ConfigurationCustomizer configurationCustomizer(){
        return new ConfigurationCustomizer(){

            @Override
            public void customize(Configuration configuration) {
                configuration.setMapUnderscoreToCamelCase(true);
            }
        };
    }
}

配置文件版

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

@Mapper
public interface UserMapper {
    User queryUserById(Integer id);
}

然后新增一个全局配置文件:mybatis-config.xml

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

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

mybatis:
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml 指定全局配置文件的位置
  mapper-locations: classpath:mybatis/mapper/*.xml  指定sql映射文件的位置

EmployeeMapper.xml内容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.springboot.mapper.EmployeeMapper">
   <!--    public Employee getEmpById(Integer id);

    public void insertEmp(Employee employee);-->
    <select id="getEmpById" resultType="com.atguigu.springboot.bean.Employee">
        SELECT * FROM employee WHERE id=#{id}
    </select>
</mapper>

测试:

@Test
public void mybatisTest(){
    Employee employee = EmployeeMapper.getDeptById(1);
    System.out.println(deptById);
}

Mybatis的配置很简单基本不需要额外配置。


整合JPA

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

Spring Data 项目的目的是为了简化构建基于Spring 框架应用的数据访问技术,包括非关系数据库、Map-Reduce 框架、云数据服务等等;另外也包含对关系数据库的访问支持。

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

步骤

  1. 导入依赖

    	<!-- springdata jpa依赖 -->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
    
  2. 对应的实体类

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

    @Repository
    public interface OrderRepository extends JpaRepository<Order, Integer> {
    }
    
  4. 测试

    @Autowired
    OrderRepository orderRepository;
    @Test
    public void jpaTest(){
        List<Order> all = orderRepository.findAll();
        System.out.println(all);
    }
    

这整合的小案例,要想深入学习我们可以参考官方文档,和查阅视频资料。

总结

Spring Boot 数据访问就讲到这了,里面没学过的只是可以查阅资料学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值