SpringBoot之旅第五篇-數據訪問

1、引言

大部分系統都離不開數據訪問,數據庫包括SQL和NOSQL,SQL是指關係型數據庫,常見的有SQL Server,Oracle,MySQL(開源),NOSQL是泛指非關係型數據庫,常見的有MongoDB,Redis。css

用spring開發時咱們經常使用的ORM框架有JDBC、Mybatis,Hibernate,如今最經常使用的應該是Mybatis。java

在Springboot中對於數據訪問層,不管是SQL仍是NOSQL,都默認採用整合Spring Data的方式進行統一處理,Springboot會幫咱們添加大量自動配置,屏蔽了不少設置。並引入各類xxxTemplate,xxxRepository來簡化咱們對數據訪問層的操做。對咱們來講只須要進行簡單的設置便可。這篇就來學習springboot整合JDBC,mybatis、JPA。mysql

咱們須要用什麼數據訪問,就引入相關的start進行開發。web

2、JDBC

jdbc是咱們最早學習的一個數據庫框架,SpringBoot也進行了相應整合.spring

2.一、 引入依賴

<!--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.二、數據源配置

我們能夠作個測試:sql

@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,咱們能夠參考這個類進行配置。apache

2.三、DataSourceInitializer

DataSourceInitializer這裏面有兩個方法runSchemaScripts()能夠運行建表語句,runDataScripts()能夠運行插入數據的sql語句。tomcat

默認使用schema-.sql建立建表語句,用data-.sql插入數據語句,固然咱們也能夠本身配置:springboot

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

2.四、操做數據庫

因爲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=王五, birthday=null, sex=2, address=null}

3、整合Druid數據源

上面講到咱們有默認的數據源,但通常狀況咱們仍是會使用阿里提供的Druid數據源,由於Druid提供的功能更多,而且可以監控統計,這個時候咱們須要先引入pom依賴,而後將spring.datasource.type 修改:

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.16</version>
</dependency>

Druid的經常使用配置以下:

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();
    }
}

再次運行上面查詢數據源的方法,能夠獲得以下結果:

注:必須引入日誌依賴,不然會報錯

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

咱們在加上Druid的監控配置:

//配置Druid的監控
//一、配置一個管理後臺的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;
}


//二、配置一個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;
}

這樣咱們能夠直接經過後臺監控數據源訪問狀況。

4、Mybatis

第一步也是引入依賴:

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

也導入Druid數據源,並加入以前學習Mybatis時用到的實體,然後就能夠進行測試,Mybatis的使用也有兩種方法,註解版和配置文件版,註解版用的不多,通常都是配置文件。

4.一、註解版

@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
UserMapper userMapper;

@Autowired
DepartmentMapper departmentMapper;

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

}

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

4.二、配置文件版

使用配置文件版方式也很簡單,也是先新增一個接口:

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

而後新增一個全局配置文件:SqlMapConfig.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:
  config-location: classpath:mybatis/SqlMapConfig.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

UserMapper.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.yuanqinnan.mapper.UserMapper">
    <select id="queryUserById" parameterType="int" resultType="com.yuanqinnan.model.User">
    SELECT * FROM `user`where id=#{id}
   </select>

</mapper>

測試:

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

Mybatis的配置就是這麼簡單,基本不須要額外配置。

5、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<T, ID extends Serializable>:統一接口 RevisionRepository<T, ID extends Serializable, N extends Number & Comparable<N>>:基於樂觀鎖機制 CrudRepository<T, ID extends Serializable>:基本CRUD操做 PagingAndSortingRepository<T, ID extends Serializable>:基本CRUD及分頁

咱們要使用JPA,就是繼承JpaRepository,咱們只要按照它的命名規範去對命名接口,即可以實現數據庫操做功能,這樣說有些抽象,仍是用一個例子來講明:

第一步:引入依賴

  <!-- springdata jpa依賴 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

第二步:編寫表對應實體:

//使用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;
}

第三步:編寫倉庫接口:

@Repository
public interface OrderRepository extends JpaRepository<Order, Integer> {
}

這個時候OrderRepository 已經有了不少實現好的方法,咱們只要跟着調用便可

測試:

@Autowired
OrderRepository orderRepository;

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

}

一個簡單的JPA實現完成,固然JPA的內容不少,這裏只是一個很是簡單的例子,要進一步的學習的話仍是要去看官方文檔。

相關文章
相關標籤/搜索