六、SpringBoot与数据访问

1、JDBC

pom.xml配置

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>

application.yml

spring:
datasource:
username: root
password:
url: jdbc:mysql://192.168.1.2:/jdbc
driver-class-name: com.mysql.jdbc.Driver
#type: 也可以自定义数据源类型

效果:默认是用org.apache.tomcat.jdbc.pool.DataSource作为数据源,相关配置都在DataSourceProperties里面;

自动配置原理:org.springframework.boot.autoconfigure.jdbc:

1、默认使用Tomcat连接池;

参考DataSourceConfiguration.java

    @ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true)
static class Tomcat extends DataSourceConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.tomcat")
public org.apache.tomcat.jdbc.pool.DataSource dataSource(
DataSourceProperties properties) {
......
}
}

2、SpringBoot默认可以支持;

参考DataSourceConfiguration.java

org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource(dbcp,dbcp2)、

3、自定义数据源类型

参考DataSourceConfiguration.java

@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
public DataSource dataSource(DataSourceProperties properties) {
//使用DataSourceBuilder创建数据源,利用反射创建响应type的数据源,并且绑定相关属性
return properties.initializeDataSourceBuilder().build();
}
}

4、DataSourceInitializer:其实是一个ApplicationListener监听器, 用于执行一些初始化sql脚本

参考DataSourceAutoConfiguration.java  的 dataSourceInitializer(...)方法

初始化配置如下:

1)、runSchemaScripts();运行建表语句,放在指定位置即可自动运行,只需在classpath下将文件命名为schema.sql或schema-all.sql

2)、runDataScripts();运行插入数据的sql语句,只需在classpath下将文件命名为data.sql或data-all.sql

3)  、如果不想以schema,data等开头, 那么也可以在application.yml中直接指定多个文件 ,如下:

application.yml配置:

    #指定启动时执行的数据定义语句DDL,且指定schema后默认classpath路径下的schema-all.sql将无效
schema: classpath:initsql/schema-cat.sql,classpath:initsql/schema-dog.sql
#指定启动时执行的数据操作语句DML,且指定data属性,后默认classpath路径下的data-all.sql将无效
data: classpath:initsql/data-cat.sql,classpath:initsql/data-dog.sql

或者在application.properties中配置:

# 程序启动时初始化语句
#(数据定义语句DDL)
spring.datasource.schema=classpath:schema-cat.sql
#(数据操作语句DML)
spring.datasource.data=classpath:data-cat.sql

5、操作数据库:自动配置了JdbcTemplate操作数据库

test测试用途:

@RunWith(SpringRunner.class)
@SpringBootTest
public class JdbcTemplateTest {
Logger logger = LoggerFactory.getLogger(getClass()); @Autowired
DataSource dataSource; @Test
public void contextLoads() throws SQLException {
System.out.println(dataSource.getClass());
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close(); }
}

2、整合Druid数据源

pom.xml中引用druid依赖

<!--引入druid数据源-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.8</version>
</dependency>

application.yml配置

# 数据源配置
spring:
datasource:
username: zd
password: zd
url: jdbc:mysql://centos/test
driver-class-name: com.mysql.jdbc.Driver
#也可以自定义数据源类型,目前指定了druid数据源
#type: com.alibaba.druid.pool.DruidDataSource #配置druid数据源特有的属性,对应 com.alibaba.druid.pool.DruidDataSource 属性
initialSize: 2
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

新增MyDruidConfiguration.java配置

@Configuration//指明当前类是一个配置类
public class MyDruidConfiguration { @ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid() {
return new DruidDataSource();
} /**
* 配置一个管理后台的Servlet
*
* @accessAddress http://localhost:8080/springbootdemo/druid
*/
@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.16"); 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;
}
}

DruidController.java

@RequestMapping("/MyDruidController")
@Controller
public class MyDruidController {
@Autowired
JdbcTemplate jdbcTemplate;
/**
* http://localhost:8080/springbootdemo/MyDruidController/selectFromStudent
*/
@ResponseBody
@GetMapping("/selectFromStudent")
public List selectFromStudent(){
List<Map<String, Object>> list = jdbcTemplate.queryForList("select * FROM student limit 1");
return list;
}
}

3、整合MyBatis

步骤:

1)、配置数据源相关属性(见上一节Druid)

2)、给数据库建表

3)、创建JavaBean

pom.xml依赖配置

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

MyMybatisConfiguration.java添加

@org.springframework.context.annotation.Configuration//指明当前类是一个配置类
//配置mybatis扫描mapper的包路径,被MapperScan扫描到的类不用再加Mybatis的@Mapper注解也能生效
@MapperScan(value = "com.example.demo.dao.mapper")
public class MyMybatisConfiguration {
@Bean
public ConfigurationCustomizer configurationCustomizer(){
return new ConfigurationCustomizer(){
@Override
public void customize(org.apache.ibatis.session.Configuration configuration) {
//设置mybatis 下划线和驼峰映射, 比如数据库stu_name和类属性stuName能正常映射
//但目前发现不管true,false都没有区别,一样正常
configuration.setMapUnderscoreToCamelCase(true);
}
};
}
}

Mapper注解接口

@Mapper
public interface StudentMapper { @Select("select * from student where id=#{id}")
public Student getStudentById(Integer id); @Delete("delete from student where id=#{id}")
public int deleteStudentById(Integer id); //useGeneratedKeys使用自动生成的主键"id" ,这样对象插入后可以正常获取id
@Options(useGeneratedKeys = true , keyProperty = "id")
@Insert("insert into student(name) values(#{name})")
public int insertStudent(Student student); @Update("update student set studentName=#{name} where id=#{id}")
public int updateStudent(Student student);
}

MyMybatisController.java

@RequestMapping("/MyMybatisController")
@Controller
public class MyMybatisController { @Autowired
StudentMapper studentMapper; /**
* address: http://localhost:8080/springbootdemo/MyMybatisController/selectById/1
*/
@ResponseBody
@GetMapping("/selectById/{id}")
public Student selectById(@PathVariable int id) {
Student stu = studentMapper.selectById(id);
return stu;
} /**
* address: http://localhost:8080/springbootdemo/MyMybatisController/save?name=bobo&motherName=sisi&age=18&monitor=false&birthday=1964-07-12%2011:12:13
*/
@ResponseBody
@GetMapping("/save")
public Student save(Student stu) {
studentMapper.save(stu);
return stu;
} /**
* web数据绑定器,在获取到数据前,做一些预处理,仅对当前Controller有效。
*
* @param binder
* @throws Exception
*/
@InitBinder
public void initBinder(WebDataBinder binder) throws Exception {
//允许Long类型为空
binder.registerCustomEditor(Long.class, new CustomNumberEditor(Long.class, true));
//设置接收的日期,把默认的yyyy/MM/dd HH:mm:ss格式改成yyyy-MM-dd HH:mm:ss
binder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true));
} }

5)、配置文件版(未验证)

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

更多使用参照

http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

4、整合SpringData JPA

1)、SpringData简介

spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问,包括非关系数据库、Map-Reduce 框架、云数据服务等等;另外也包含对关系数据库的访问支持。
Spring Data 作为SpringSource的其中一个父项目, 旨在统一和简化对各类型持久化存储, 而不拘泥于是关系型数据库还是NoSQL 数据存储。
SpringData是一个用于简化数据库访问,并支持云服务的开源框架。
这主要是Spring Data Commons项目来实现的,它提供统一的标准, 包含CRUD(创建、获取、更新、删除)、查询、排序和分页的相关操作。目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算机数据服务。
支持基于关系型数据库的数据服务,如OracleRAC等。
对于拥有海量数据的项目,可以用SpringData来简化项目的开发,就如Spring Framework对JDBC,ORM的支持一样,SpringData会让数据访问变得更加方便。

2)、SpringData基本接口

Repository<ID extends Serializable> : 统一接口
  |RevisionRepository<ID extends Serializable , N extends Number & Comparable <N>> : 基于乐观锁机制
  |CrudRepository<ID extends Serializable>: 基本CRUD操作
    |PagingAndSortingRepository<ID extends Serializable>: 基本CRUD及分页
      |JpaRepository<ID extends Serializable>: 最常用的Jpa

Repository(org.springframework.data.repository)
  |RevisionRepository(org.springframework.repository.history)
  |CrudRepository(org.springframework.data.repository)
    |PagingAndSortingRepository(org.springframework.data.repository)
      |JpaRepository(org.springframework.data.jpa.repository)

3)、整合SpringData JPA

JPA:ORM(Object Relational Mapping);

1)、基本的配置JpaProperties

spring

  #jdb配置部分
.........
#jpa配置
jpa:
#hibernate配置
hibernate:
#更新或者创建数据表结构
ddl-auto: update
#控制台显示SQL
show-sql: true

2)、StudentEntity.java实体类

和数据表进行映射,并且配置好映射关系;

package com.example.demo.bean;

import javax.persistence.*;
import java.util.Date;
import java.util.List;
import java.util.Map; /**
* 供jpa(hibernate)使用,使用JPA注解配置映射关系
*/
@Table/*(name = "tbl_user")*/ //@Table来指定和哪个数据表对应;如果省略默认表名就是studententity;
@Entity //告诉JPA这是一个实体类(数据表映射类)
public class StudentEntity {
@Id //这是一个主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
public Integer id; @Column //省略默认列名就是属性名
public String name; private Integer age;
private Boolean monitor;//是否是班长
private Date birthday; @Column(name = "last_name",length = 50) //这是和数据表对应的一个列
private String motherName; @Transient//不和数据库作映射
private Teacher teacher; @Transient//不和数据库作映射
private Map<String, Object> maps;
@Transient//不和数据库作映射
private List<Object> lists; ......
}

3)、StudentRepository.java

Dao数据表操作类(Repository)

/**
* hibernate专用,需要继承JpaRepository来完成对数据库的操作,JpaRepository父类里面有save(),update()等方法可供使用
*/
public interface StudentRepository extends JpaRepository<StudentEntity,Integer> {
}

4)、MyHibernateController .java

@RequestMapping("/MyHibernateController")
@Controller
public class MyHibernateController { @Autowired
StudentRepository studentRepository; /**
* address: http://localhost:8080/springbootdemo/MyHibernateController/selectById/1
*/
@ResponseBody
@GetMapping("/selectById/{id}")
public StudentEntity selectById(@PathVariable int id) {
StudentEntity stu = studentRepository.findOne(id);
return stu;
} /**
* address: http://localhost:8080/springbootdemo/MyHibernateController/save?name=bobo&motherName=sisi&age=18&monitor=false&birthday=1951/02/19%2011:12:13
*/
@ResponseBody
@GetMapping("/save")
public StudentEntity save(StudentEntity stu) {
studentRepository.save(stu);
return stu;
}
}

只看了视频3中的以下部分

参考

主要引用自尚学堂视频教程

其它参考

SpringData学习总结笔记==>https://blog.csdn.net/mmh19891113/article/details/80929109  (未看)

springboot 数据访问【转】【补】的更多相关文章

  1. SpringBoot数据访问之Druid启动器的使用

    数据访问之Druid启动器的使用 承接上文:SpringBoot数据访问之Druid数据源的自定义使用 官方文档: Druid Spring Boot Starter 首先在在 Spring Boot ...

  2. SpringBoot数据访问之整合mybatis注解版

    SpringBoot数据访问之整合mybatis注解版 mybatis注解版: 贴心链接:Github 在网页下方,找到快速开始文档 上述链接方便读者查找. 通过快速开始文档,搭建环境: 创建数据库: ...

  3. Springboot数据访问,棒棒哒!

    Springboot对数据访问部分提供了非常强大的集成,支持mysql,oracle等传统数据库的同时,也支持Redis,MongoDB等非关系型数据库,极大的简化了DAO的代码,尤其是Spring ...

  4. SpringBoot数据访问(一) SpringBoot整合Mybatis

    前言 SpringData是Spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案,其设计目的是为了使我们可以快速且 ...

  5. SpringBoot数据访问(二) SpringBoot整合JPA

    JPA简介 Spring Data JPA是Spring Data大家族的一部分,它可以轻松实现基于JPA的存储库.该模块用于增强支持基于JPA的数据访问层,它使我们可以更加容易地构建使用数据访问技术 ...

  6. SpringBoot数据访问之Druid数据源的使用

    数据访问之Druid数据源的使用 说明:该数据源Druid,使用自定义方式实现,后面文章使用start启动器实现,学习思路为主. 为什么要使用数据源: ​ 数据源是提高数据库连接性能的常规手段,数据源 ...

  7. SpringBoot数据访问之整合Mybatis配置文件

    环境搭建以及前置知识回顾 SpringBoot中有两种start的形式: 官方:spring-boot-starter-* 第三方:*-spring-boot-starter Mybatis属于第三方 ...

  8. SpringBoot数据访问(三) SpringBoot整合Redis

    前言 除了对关系型数据库的整合支持外,SpringBoot对非关系型数据库也提供了非常好的支持,比如,对Redis的支持. Redis(Remote Dictionary Server,即远程字典服务 ...

  9. 【串线篇】SpringBoot数据访问【数据源/mybatis/指定映射文件位置】

    一.配置数据源 1.1.jdbc版本 JDBC(.tomcat.jdbc.pool.DataSource作为数据源) <?xml version="1.0" encoding ...

随机推荐

  1. jmeter参数化之配置元件CSV控件

    1.     用badboby进行录制,录制完成后保存,用JMeter格式进行保存,如:登陆.jmx 2.     在jmeter中打开保存的文件登陆.jmx. 3.     对登陆账号和密码进行参数 ...

  2. jmeter-监听器介绍与使用

    12.jmeter-监听器介绍与使用 jmeter-监听器介绍与使用 察看结果树 Summary Report 聚合报告 Backend Listener Aggregate Graph 断言结果 C ...

  3. ECMAScript 5 新增的Array方法

    引自:by zhangxinxu from http://www.zhangxinxu.com ES5中新增了写数组方法,如下: forEach (js v1.6) map (js v1.6) fil ...

  4. return语句必须要注意的地方

    先看下面程序: function foo1() { return { /*返回对象{}他留有一个大括号跟return在同一行*/ bar: "hello" }; } functio ...

  5. 读书笔记--Struts 2 in Action 目录

    1.Struts 2:现代Web框架 1.1 web应用程序:快速学习 21.1.1 构建web应用程序 21.1.2 基础技术简介 31.1.3 深入研究 61.2 web应用程序框架 71.2.1 ...

  6. LintCode_453 将二叉树拆成链表

    题目 将一棵二叉树按照前序遍历拆解成为一个假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. 样例 1 \ 1 2 / \ \ 2 5 => 3 / \ \ ...

  7. 【arc077f】AtCoder Regular Contest 074 F - Lotus Leaves

    题意 给定一个n*m的池塘,每个格子上可能有叶子. 从一个叶子出发,可以跳到相同行或相同列的叶子. 问至少去掉多少叶子,使得起点不能到达终点. \(n,m<=100\) 解法 很显然的最小割模型 ...

  8. 加载selenium2Library失败---robotframework环境搭建(site-packages下无selenium2library文件夹)

    加载Selenium2library失败,检查D:\Python27\Lib\site-packages 目录下是否有Selenium2Library 目录,没有该目录,事情就尴尬了. 自己安装的版本 ...

  9. Apache配置虚拟主机,全部指向一个目录

    配置虚拟主机的时候,全部指向了一个目录,解决方法是在httpd.conf中添加: NameVirtualHost *:80

  10. JavaScript实现无缝滚动 原理详细讲解

    先了解一下对象的几个的属性: innerHTML: 设置或获取位于对象起始和结束标签内的 HTML scrollHeight: 获取对象的滚动高度. scrollLeft: 设置或获取位于对象左边界和 ...