SpringBoot操作数据库

SpringData简介

对于数据访问层,无论是SQL还是NoSQL,在SpringBoot 底层都是采用SpringData来进行封装的。
官网地址:https://spring.io/projects/spring-data

官网

使用IDEA构建项目时,我们可以勾选SpringData相关依赖。

勾选SpringData相关依赖

如上图界面所示,Spring提供了很多工具供我们使用,它封装了大量的模板,在Template Engines选项中可以勾选需要的模板引擎依赖,IDEA会自动帮我们导入。
JDBC我们选择了Spring Data JDBC,对应的依赖为spring-boot-start-data-jdbc,它本质上和spring-boot-start-jdbc依赖是一样的,点击依赖,我们发现它的底层使用的还是spring-boot-start-jdbc依赖。
与此同时,可以发现SpringBoot2.x默认的数据源是HikariCP,其maven依赖如下:


  com.zaxxer
  HikariCP
  3.4.2
  compile

我们还导入了MySQL驱动,需要注意的是MySQL驱动如果不指定版本号,默认使用8.0版本,其maven依赖如下:


  mysql
  mysql-connector-java
  runtime

如果不想使用默认版本,加上version即可。

集成JDBC

导入数据库

1、创建springboot数据库。

CREATE DATABASE /*!32312 IF NOT EXISTS*/`springboot` 
/*!40100 DEFAULT CHARACTER SET utf8 */;

2、创建员工表,插入若干数据。

CREATE TABLE `employee` (
  `id` INT(5) NOT NULL AUTO_INCREMENT COMMENT '雇员id',
  `last_name` VARCHAR(100) NOT NULL COMMENT '名字',
  `email` VARCHAR(100) NOT NULL COMMENT '邮箱',
  `gender` INT(2) NOT NULL COMMENT '性别1 男, 0 女',
  `department` INT(3) NOT NULL COMMENT '部门id',
  `birth` DATETIME NOT NULL COMMENT '生日',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1006 DEFAULT CHARSET=utf8;

3、创建部门表,插入若干数据。

CREATE TABLE `department` (
  `id` INT(3) NOT NULL AUTO_INCREMENT COMMENT '部门id',
  `department_name` VARCHAR(20) NOT NULL COMMENT '部门名字',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8;

创建项目

1、导入JDBC配置和MySQL驱动。


  org.springframework.boot
  spring-boot-starter-data-jdbc


  mysql
  mysql-connector-java
  runtime

2、编写配置文件,注意MySQL8.0以上需要配置时区。

spring:
  datasource:
    username: root
    password: 123456
    #注意MySQL8.0以上需要配置时区
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver

小技巧:如果记不清楚url,可以在IDEA的Database窗口中测试连接一下,测试成功后下方会显示完整的数据库连接地址。


测试连接地址

3、测试连接。

@SpringBootTest
class SpringBootDataDemoApplicationTests {

    @Autowired
    DataSource dataSource;

    @Test
    void contextLoads() throws SQLException {
        //查看默认数据源  class com.zaxxer.hikari.HikariDataSource
        System.out.println(dataSource.getClass());
        Connection connection=dataSource.getConnection();
        //connection代表数据源  HikariProxyConnection@64068997 wrapping com.mysql.cj.jdbc.ConnectionImpl@2ae62bb6
        System.out.println(connection);
        //真实开发更多会去使用数据源
        connection.close();
    }
}

自动配置核心类

  • DataSourceConfiguration:自动配置的数据源
  • DataSourceAutoConfiguration:自动配置类
  • DataSourceProperties:配置文件绑定

HikariDataSource号称当前Java Web环境中速度最快的数据源,和Druid相比,它的效率会更高一点。
不同的数据源拥有不同的配置,详细配置可以查看对应数据源的DataSource源码。
4、测试CRUD,直接编写Controller进行测试。我们可以使用JdbcTemplate来操作数据库,它会自动帮我们配置需要的环境,并且封装了很多操作方法,使用起来十分简单。

@RestController
@RequestMapping("/jdbc")
public class JdbcController {
    //Spring的核心思想之一:xxxTemplate
    //xxxTemplate会自动帮我们配置完需要的环境,拿来即用
    @Autowired
    JdbcTemplate jdbcTemplate;

    @GetMapping("/userList")
    public List> userList(){
        String sql="select * from employee";
        List> lists=jdbcTemplate.queryForList(sql);
        return lists;
    }

    //JdbcTemplate会自动帮我们处理事务
    @GetMapping("/add")
    public String addUser(){
        String sql="insert into employee(last_name, email, gender, department, birth)" +
                "values ('wunian','[email protected]',1,303,'"+new Date().toLocaleString()+"')";
        jdbcTemplate.update(sql);
        return "ok";
    }

    @GetMapping("/update/{id}")
    public String updateUser(@PathVariable("id")int id){
        String sql="update employee set last_name=?,email=? where id="+id;
        //数据
        Object[] objects=new Object[2];
        objects[0]="wunian";
        objects[1]="[email protected]";
        jdbcTemplate.update(sql,objects);
        return "ok";
    }

    @GetMapping("/delete/{id}")
    public String deleteUser(@PathVariable("id")int id){
        String sql="delete from employee where id=?";
        jdbcTemplate.update(sql,id);
        return "ok";
    }
}

集成Druid

Druid简介

Java程序很多时候都是要操作数据库的,为了提高操作数据库的性能,一般会使用连接池。 Druid 是阿里巴巴的开源组件之一,结合了C3P0,DBCP连接池的优点,并且自带日志监控功能,Druid 可以天然的监控 SQL和 数据库连接池的状况。

配置参数

DruidDataSource配置属性如下列表所示:

配置 缺省值 说明
name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此属性至少在1.0.5版本中是不起作用的,强行设置name会出错。详情-点此处。
url 连接数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username 连接数据库的用户名
password 连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里
driverClassName 根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
initialSize 0 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
maxActive 8 最大连接池数量
maxIdle 8 已经不再使用,配置了也没效果
minIdle 最小连接池数量
maxWait 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
poolPreparedStatements false 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
maxPoolPreparedStatementPerConnectionSize -1 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
validationQuery 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
validationQueryTimeout 单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法
testOnBorrow true 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturn false 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testWhileIdle false 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
keepAlive false (1.0.28) 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。
timeBetweenEvictionRunsMillis 1分钟(1.0.14) 有两个含义: 1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
numTestsPerEvictionRun 30分钟(1.0.14) 不再使用,一个DruidDataSource只支持一个EvictionRun
minEvictableIdleTimeMillis 连接保持空闲而不被驱逐的最小时间
connectionInitSqls 物理连接初始化的时候执行的sql
exceptionSorter 根据dbType自动识别 当数据库抛出一些不可恢复的异常时,抛弃连接
filters 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall
proxyFilters 类型是List,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

在项目中配置Druid。

spring:
  datasource:
    username: root
    password: 123456
    #?serverTimezone=UTC解决时区的报错
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    #Spring Boot 默认是不注入这些属性值的,需要自己绑定
    #druid 数据源专有配置
    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,stat:监控统计、log4j:日志记录、wall:防御sql注入
    #如果允许时报错    java.lang.ClassNotFoundException: org.apache.log4j.Priority 
    #则导入 log4j 依赖即可,Maven 地址:
    #https://mvnrepository.com/artifact/log4j/log4j
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

使用第三方数据源

如果项目中要使用第三方数据源,一般操作步骤如下:
1、导入依赖
2、看源码配置
3、看官方文档解释
4、测试使用

测试

1、导入log4j、Druid依赖。


  com.alibaba
  druid
  1.1.16


  log4j
  log4j
  1.2.17

2、配置数据源,和上面配置Druid一样。
3、配置数据日志监控。

//自定义DruidConfig
@Configuration
public class DruidConfig {

    //绑定配置的bean
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druidDataSource(){
        return new DruidDataSource();
    }

    //注册后台监控页面,SpringBoot如何注册Servlet
    //没有web.xml的情况配置Servlet的方法 ServletRegistrationBean
    //测试访问 /druid
    @Bean
    public ServletRegistrationBean statViewServlet(){
        //配置后台监控页面
        ServletRegistrationBean bean=new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
        Map map=new HashMap<>();
        //后台登陆的用户名和密码
        //用户名密码可以放到数据库
        map.put("loginUserName","admin");
        map.put("loginPassword","123456");
        // 访问权限
        //map.put("allow","localhost");//只允许本机访问
        map.put("allow","");//所有人都可以访问

        //拒绝访问
        //map.put("deny","192.168.1.1")//ip会被拒绝访问

        bean.setInitParameters(map);
        return bean;
    }

    //过滤器配置,看看哪些请求需要被过滤
    //没有web.xml的情况配置filter的方法 FilterRegistrationBean
    @Bean
    public FilterRegistrationBean  webStatFilter(){
        FilterRegistrationBean bean=new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        //配置内容
        //配置哪些请求可以被过滤
        Map map=new HashMap<>();
        map.put("exclusions",".js,*.css,/druid/*");
        bean.setInitParameters(map);
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }
}

4、测试,通过http://localhost:8080/druid来访问Druid后台监控页面。

Druid后台监控页面

当我们去访问一个查询员工列表的请求时,再回到后台监控页面的SQL监控页下,可以看到多了一条记录,详细记录了查询员工列表SQL的各项信息。
SQL监控

集成Mybatis

MyBatis如何使用?

1、导入依赖。
2、编写MyBatis配置文件。
3、编写接口。
4、编写接口Mapper配置文件。
5、注册Mapper配置文件。
6、测试。

MyBatis-Spring

在Spring中需要集成MyBatis-Spring依赖,上面原生的对象被Spring托管了,直接拿来使用即可。

MyBatis Spring Boot Starter

在maven官网中搜索"MyBatis",可以查到很多MyBatis的依赖,这些依赖都可以使用,我们这里使用的是MyBatis Spring Boot Starter

搜索MyBatis依赖

官方文档地址:

  • MyBatis:https://mybatis.org/mybatis-3/getting-started.html
  • MyBatis-Spring:http://mybatis.org/spring/zh/factorybean.html
  • MyBatis Spring Boot Starter:http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

测试

1.导入依赖,依赖要求:mybatis-spring-boot-starter2.1版本。

依赖要求



  org.mybatis.spring.boot
  mybatis-spring-boot-starter
  2.1.1

2、编写配置文件。

spring:
  datasource:
    username: root
    password: 123456
    #?serverTimezone=UTC解决时区的报错
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    #Spring Boot 默认是不注入这些属性值的,需要自己绑定
    #druid 数据源专有配置
    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,stat:监控统计、log4j:日志记录、wall:防御sql注入
    #如果允许时报错    java.lang.ClassNotFoundException: org.apache.log4j.Priority 
    #则导入 log4j 依赖即可,Maven 地址:
    #https://mvnrepository.com/artifact/log4j/log4j
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

3、启动项目,测试是否连接成功。
4、编写实体类。

@Repository //dao层使用
@Mapper //表示这是一个Mybatis的Mapper
public interface EmployeeMapper{
   // @Select("sql") 注解版配置
   //获取全部员工信息
    List getEmployees();
    //新增一个员工信息
    int save(Employee employee);
    //通过id获取员工信息
    Employee get(Integer id);
    //通过id删除员工信息
    int delete(Integer id);
}

5、编写Mapper.xml文件。SQL语句可以直接在IDEA的DataSource窗口中用鼠标点击数据库,点击上方铅笔图标打开console窗口进行编写,在这里编写会有智能提示,可以提升写SQL的效率。






    
    
    
        
        
        
        
        
        
        
        
            
            
        
    
    
    

    
        insert into employee(last_name, email, gender, department, birth)
        values (#{lastName}, #{email}, #{gender}, #{department}, #{birth})
    

    

    
         delete from employee where id= #{id}
    

6、编写Controller进行测试。

public class EmployeeController {

    @Autowired
    EmployeeMapper mapper;

    //获取全部员工信息
    @GetMapping("/getEmployees")
    public List getEmployees(){
        return mapper.getEmployees();
    }

    //新增一个员工信息
    @GetMapping("/save")
    public int save(){
        Employee employee=new Employee();
        employee.setLastName("wunian");
        employee.setEmail("[email protected]");
        employee.setGender(1);
        employee.setBirth(new Date());
        employee.setDepartment(101);
        return mapper.save(employee);
    }
    //通过id获取员工信息
    @GetMapping("/get/{id}")
    public Employee get(@PathVariable("id") Integer id){
        return mapper.get(id);
    }
    //通过id删除员工信息
    @GetMapping("/delete/{id}")
    public int delete(@PathVariable("id") Integer id){
        return mapper.delete(id);
    }
}

7、配置MyBatis的配置项。

#配置mybatis的配置
#下划线转驼峰
mybatis.configuration.map-underscore-to-camel-case=true
#使用表名的包
mybatis.type-aliases-package=com.wunian.pojo
#mapper配置文件地址,自动扫描
mybatis.mapper-locations=classpath:com/wunian/mapper/xml/*.xml

#mybatis核心配置文件地址,集成Spring之后就不需要了
#mybatis.config-location=

8、解决Maven资源过滤问题。由于Maven默认不支持从src/java目录下获取除了代码之外的配置文件,我们需要在pom文件中过滤一下配置。



  
    true
    src/main/java
      
        **/*.xml
      
  

9、测试运行。

你可能感兴趣的:(SpringBoot操作数据库)