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