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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM