Springboot原生JDBC操作数据库

  Spring提供了spring-jdbc: 对jdbc的轻量级的封装, 提供一个一个JdbcTemplate类操作数据

1、导入jdbc启动器 starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--springBoot父项目中, 设置一个Mysql的版本: <mysql.version>8.0.20</mysql.version>
 <version>5.1.43</version>自定义版本  --> 
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.43</version> 
</dependency>

2、springBoot的配置文件中配置数据库四大参数

#mysql数据库四大参数
spring:
  datasource:
    #driver-class-name: com.mysql.jdbc.Driver  // 如果使用mysql 5.1.43
    driver-class-name: com.mysql.cj.jdbc.Driver  //如果使用mysql 8.0.20 需要指定时区
    url: jdbc:mysql://localhost:3306/house?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: root

3、springBoot: 配置好 DataSource,  使用哪一个连接池的技术

  通过测试DataSource:   默认: Hikari的数据源

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootJdbcApplicationTests {
    @Autowired
    private DataSource ds;

    // 测试jdbc数据源是否更换成功
    @Test
    public void test1() {
        System.out.println(ds.getClass().getName());
    }

打印默认数据源为:

com.zaxxer.hikari.HikariDataSource

SpringBoot 默认支持数据源:

//查看DataSourceAutoConfiguration中的方法
    @Configuration
    @Conditional(PooledDataSourceCondition.class)
    @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
    @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
            DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class,
            DataSourceJmxConfiguration.class })
    protected static class PooledDataSourceConfiguration {
    }

更改SpringBoot使用某种数据源:  在默认支持的数据源选一个:

1) 第一种方式:  在pom文件, 排除Hikari的依赖, 添加其他(dbcp2)数据源, (不推荐)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <!-- 排除HikariCP依赖传递 -->
     <exclusions> 
        <exclusion>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId> 
        </exclusion>
    </exclusions>
</dependency>   

添加某个数据源:

<!-- 添加dbcp2的连接池 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
</dependency>

2)  第二种方式:  不在pom文件中排除hikari依赖, 在springboot配置文件中指定使用哪个数据源(DataSource) 推荐

#mysql数据库四大参数
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver  // 如果使用mysql 5.1.43
    url: jdbc:mysql://localhost:3306/house?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: root
   #指定使用哪个数据源 ***
    type: org.apache.commons.dbcp2.BasicDataSource

如果需要添加其他数据源比如(C3P0, druid)使用的数据源不是SpringBoot默认支持的

导入druid / C3P0 的依赖:

<!--添加的druid的连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.3</version>
</dependency>
...

在springBoot配置文件中指定数据源

#mysql数据库四大参数
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver  // 如果使用mysql 5.1.43
    url: jdbc:mysql://localhost:3306/house?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: root
   #指定使用哪个数据源
    #type: org.apache.commons.dbcp2.BasicDataSource
    type: com.alibaba.druid.pool.DruidDataSource   //或者添加C3p0的数据源

3)第三种方式: 编写一个DataSource的配置类, 覆盖SpringBoot的DataSourceAutoConfiguration

@Configuration
public class DruidConfig {
    @Autowired
    // springBoot的运行环境类, 获取到springBoot配置文件中内容
    private Environment environment;

    // 配置一个DataSource
    @Bean
    public DataSource createDataSource() { // 创建一个Druid的数据源 DruidDataSource
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(environment.getProperty("spring.datasource.driver-class-name"));
        druidDataSource.setUrl(environment.getProperty("spring.datasource.url"));
        druidDataSource.setUsername(environment.getProperty("spring.datasource.username"));
        druidDataSource.setPassword(environment.getProperty("spring.datasource.password")); // 初始连接数
        druidDataSource.setInitialSize(Integer.parseInt(environment.getProperty("spring.datasource.druid.initSize"))); // 最大连接数
        druidDataSource.setMaxActive(Integer.parseInt(environment.getProperty("spring.datasource.druid.maxSize"))); // 最小连接数
        druidDataSource.setMinIdle(Integer.parseInt(environment.getProperty("spring.datasource.druid.minSize")));

        return druidDataSource;
    }

可以配置连接参数

#mysql数据库四大参数
spring:
  datasource:
    #driver-class-name: com.mysql.jdbc.Driver
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/house?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
    #指定使用哪个数据源
    #type: org.apache.commons.dbcp2.BasicDataSource
    #type: com.alibaba.druid.pool.DruidDataSource
    druid: 
       initSize: 10
       maxSize: 100
       minSize: 10
  profiles:
    active: dev

使用Spring-jdbc提供的JdbcTemplate操作数据库:

Employee.java实体类:

@Data
public class Employee {
    private Integer empno;
    private String ename;
    private String job;
    private Integer mgr;
    private Date hiredate;
    private Double comm;
    private Double sal;
    private Integer deptno;
}

EmployeeDao.java接口

public interface EmployeeDao {
   //根据id查询
    public Employee  queryById(int empno) throws Exception;
   //查询指定页数据
    public List<Employee>  queryByPage(int pageIndex, int pageSize) throws Exception;
   //添加员工
   public void insert(Employee emp) throws Exception;
}

EmployeeDaoImpl.java实现类

@Repository
public class EmployeeDaoImpl implements EmployeeDao {
    //注入JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    @Override
    public Employee queryById(int empno) throws Exception {
        String sql ="select * from emp where empno = ?";
        // queryForObject( xxx.class) 使用的基本数据类型,要求查询的结果只能一列
        //  BeanPropertyRowMapper()  把行记录转换为一个java对象
        return jdbcTemplate.queryForObject(sql,new Object[] {empno},new BeanPropertyRowMapper<Employee>(Employee.class));
    }
    @Override
    public List<Employee> queryByPage(int pageIndex, int pageSize) throws Exception {
        String sql ="select * from emp limit ? , ? ";
        return jdbcTemplate.query(sql,
                            new Object[] {(pageIndex-1)*pageSize,pageSize},
                            new BeanPropertyRowMapper<Employee>(Employee.class) );
        
    }
    @Override
    public void insert(Employee emp) throws Exception {
        String sql ="INSERT INTO `emp` (`empno`,`ename`,`job`,`mgr`,`hiredate`,`sal`,`comm`,`deptno`) VALUES (?,?,?,?,?,?,?,?)";
        //update() 执行增删改sql
        jdbcTemplate.update(sql, emp.getEmpno(),
                                 emp.getEname(),emp.getJob(),
                                 emp.getMgr(),emp.getHiredate(),
                                 emp.getSal(),emp.getComm(),
                                 emp.getDeptno());
    }

 

Springboot原生JDBC操作数据库

上一篇:Springboot JDBC的事务


下一篇:MongoDB入门实操《下篇》