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