SpringBoot数据库访问,DataSource连接池,Spring JPA:

DataSource连接池

连接池优点:连接对象重用提升程序性能(避免频繁创建和释放Connection对象);控制最大连接数有效保护数据库稳定运行。

各种不同的连接池组件都必须实现DataSource接口。

SpringBoot中提供了DataSourceAutoConfiguration自动配置组件,用于创建DataSource对象。(依次创建Hikari、Tomcat、DBCP2连接池对象,也可以根据spring.datasource.type指定类型创建)

  1. 引入驱动包和spring-boot-starter-jdbc

    boot2.x版本默认引入hikari,1.x默认引入tomcat-jdbc,将hikaricp从spring-boot-starter-jdbc排除方法如下

     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-jdbc</artifactId>
         <version>2.1.2.RELEASE</version>
         <exclusions>
             <exclusion>
                 <groupId>com.zaxxer</groupId>
                 <artifactId>HikariCP</artifactId>
             </exclusion>
         </exclusions>
     </dependency>
    
  2. 在application.properties配置文件中定义db参数

     spring.datasource.username=root
     spring.datasource.password=123456
     spring.datasource.url=jdbc:mysql://localhost:3306/jd
     spring.datasource.driverClassName=com.mysql.jdbc.Driver
    
  3. 开启自动配置,会自动调用DataSourceAutoConfiguration创建连接池

     优先级为:hikari、tomcat、dbcp2
    
  4. 利用spring.datasource.type创建指定类型的连接池

     spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    
  5. 如果通过@Bean自定义DataSource对象,自动配置dataSource不会再创建

     @Bean
     @Primary
     @ConfigurationProperties(prefix="spring.datasource")
     public DataSource dbcp() {
         BasicDataSource dbcp = new BasicDataSource();
         return dbcp;
     }
    

Spring DAO (JdbcTemplate)

spring-boot-starter-jdbc
mysql-connector-java
  1. 创建连接池对象(参考上面案例过程)
  2. 根据表编写实体类型
  3. 定义Dao接口
  4. 定义Dao实现组件,注入JdbcTemplate对象使用

Spring MyBatis

spring-boot-starter-jdbc
mybatis-spring-boot-starter
mysql-connector-java

使用XML文件定义SQL:

  1. 创建连接池对象(参考上面案例过程)
  2. 根据表编写实体类型
  3. 定义SQL语句XML文件(配置mybatis.mapperLocations=classpath:sql/*.xml)
  4. 定义Mapper映射器接口(在启动类前加@MapperScan)
  5. 定义启动类(@SpringBootApplication+@MapperScan)
  6. 添加pageHelper-spring-boot-starter启动器追加分页功能

    PageHelper.startPage(1, 3);//设置分页参数
    List list = newDao.findAll();//pageHelper先将sql封装成分页sql,再执行查询

使用注解定义SQL:

  1. 创建连接池对象(参考上面案例过程)
  2. 根据表编写实体类型
  3. 定义Mapper映射器接口,(在启动类前加@MapperScan)

    利用@Select、@Insert、@Update、@Delete定义SQL语句

  4. 定义启动类(@SpringBootApplication+@MapperScan)

  5. 添加pageHelper-spring-boot-starter启动器追加分页功能

参数映射#{}和${}区别:

1. #{}采用PrepareStatement机制执行SQL;${}采用Statement拼SQL执行

2. 字段值位置建议使用#{}安全;表名和字段名位置的参数需要使用${}不要使用#{}

Spring JPA

spring-boot-starter-jdbc
spring-boot-starter-jpa
mysql-connector-java
  1. 创建连接池对象(参考上面案例过程)
  2. 根据表编写实体类型(@Entity、@Table、@id、@Column映射描述)
  3. 定义JPA Repository接口(继承JpaRepository、PagingAndSortingRepository或CrudRepository等)
  4. 定义启动类(@SpringBootApplication)

Spring JPA 扩展

  1. 按规则定义方法名

     //select * from news where title like ?
     public List<News> findByTitleLike(String title);
     //select * from news where id<?
     public List<News> findByIdLessThan(int id);
    
  2. 定义SQL语句

     @Query(nativeQuery=true,value="select * from news where title like :title")
     public List<News> findSQL(@Param("title")String title);
    
  3. 定义JPQL面向对象语句

     //JPQL 使用类型名和属性名,区分大小写
     @Query("from News where id < :no")
     public List<News> findSQL2(@Param("no")int id);