SpringBoot入門 (四) 數據庫訪問之JdbcTemplate


  本文記錄在SpringBoot中使用JdbcTemplate訪問數據庫。

一 JDBC回顧

  最早是在上學時接觸的使用JDBC訪問數據庫,主要有以下幾個步驟:

1 加載驅動 Class.forName(Driver)

2 獲取數據庫連接 conn = DriverManager.getConnection(url, user,password)

3 創建一個statement對象來訪問操作數據庫 statement = conn.createStatement();

4 執行SQL,訪問操作數據庫 rs = statement.execute(sql)

5 得到結果集,業務處理

6 關閉連接,釋放資源 statement.close(); conn.close();

使用jdbc訪問並操作數據庫時比較麻煩,后來也做了一定的封裝,主要是對statement的創建前和sql執行后進行的封裝。

二 JdbcTemplate使用示例

  目前我們使用的主流的開源的數據庫訪問框架主要有Hibernate,Mybatis,SpringJdbc。SpringJdbc時spring對JDBC封裝后的一個ORM框架,JdbcTemplate就是SpringJdbc對外提供的一個訪問數據庫的接口類,我們通過它可以很容易的實現數據庫的訪問操作。但是需要我們自己根據業務手寫相關的SQl,然后執行。

在spring boot項目中引入依賴,本文練習中使用的時MySql數據庫

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

在application.properties中配置數據庫連接相關信息

#數據庫配置
#連接
spring.datasource.url=jdbc:mysql://localhost:3306/test
#賬號
spring.datasource.username=root
#密碼
spring.datasource.password=123456
#驅動
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

完成以上配后,在啟動springboot項目時,會自動把數據源信息注入到JdbcTemplate中,我們只需要在使用的地方注入JdbcTemplate就可以了

定義要操作數據庫的相關方法接口

public interface UserDao {

    /**
     * 添加用戶
     */
    int insert(UserInfo user);

    /**
     * 根據ID刪除用戶
     */
    int delete(Long id);

    /**
     * 修改用戶
     */
    int update(UserInfo user);

    /**
     * 根據ID查詢用戶
     */
    UserInfo queryById(Long id);

    /**
     * 查詢所有用戶
     * @return
     */
    List<UserInfo> queryAll();

    /**
     * 分頁查詢用戶
     * @param start 開始位置
     * @param size 要查詢的數據條數
     * @return
     */
    List<UserInfo> pagedQuery(int start, int size);

}
接口的實現
@Service
public class UserDaoImpl implements UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public int insert(UserInfo user) {
        String insertSql = "insert into t_user(name, age) values(?, ?)";
        return jdbcTemplate.update(insertSql, user.getName(), user.getAge());
    }

    @Override
    public int delete(Long id) {
        String deleteSql = "delete from t_user where id = ?";
        return jdbcTemplate.update(deleteSql, id);
    }

    @Override
    public int update(UserInfo user) {
        String updateSql = "update t_user set name = ?, age = ? where id = ?";
        return jdbcTemplate.update(updateSql, user.getName(), user.getAge(), user.getId());
    }

    @Override
    public UserInfo queryById(Long id) {
        String sql = "select * from t_user where id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<UserInfo>(UserInfo.class));
    }

    @Override
    public List<UserInfo> queryAll() {
        String sql = "select * from t_user";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper(UserInfo.class));
    }

    @Override
    public List<UserInfo> pagedQuery(int start, int size) {
        String sql = "select * from t_user limit ?, ?";
        return jdbcTemplate.query(sql, new Object[]{start, size}, new BeanPropertyRowMapper(UserInfo.class));
    }
}

可以看到,使用JdbcTemplate時我們完全省去了使用JDBC時的創建連接,釋放資源等操作。不同數據庫的分頁查詢不一樣,MySql中用的limit關鍵字,第一個參數代表獲取數據的起點,第二個是要查詢的數量,如:limit 5,5  我們查詢出來的是第6行到10行 共5條數據

三 測試,使用Junit Test

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootJdbctemplateApplicationTests {

    @Autowired
    private UserDaoImpl userDaoImpl;

    @Test
    public void testInsert(){
        UserInfo user = new UserInfo("kg", 21);
        userDaoImpl.insert(user);
    }

    @Test
    public void testDelete(){
        long id = 2;
        userDaoImpl.delete(id);
    }

    @Test
    public void testUpdate(){
        long id = 1;
        UserInfo user = new UserInfo();
        user.setId(id);
        user.setName("kobe");
        user.setAge(3);
        userDaoImpl.update(user);
    }

    @Test
    public void testQueryById(){
        long id = 1;
        UserInfo user = userDaoImpl.queryById(id);
    }

    @Test
    public void testQueryAll(){
        List<UserInfo> list = userDaoImpl.queryAll();
    }

    @Test
    public void testPagedQuery(){
        List<UserInfo> list = userDaoImpl.pagedQuery(1, 2);
    }
}

在啟動項目時,可以看到在控制台上輸出的日志信息中有以下內容

四 連接池配置

  在我們沒有配置數據庫連接池時,springboot默認給我們提供的Hikari連接池。如果我們像使用其他的,我們可以自己配置,比如我們想使用阿里的Druid連接池,我們需要引入依賴

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

為了測試方便,我這里直接用@Value注解來獲取配置信息

@SpringBootConfiguration
public class DataSourceConfig {

    @Value("${spring.datasource.driver-class-name}")
    private String DRIVER;
    @Value("${spring.datasource.url}")
    private String URL;
    @Value("${spring.datasource.username}")
    private String USER;
    @Value("${spring.datasource.password}")
    private String PASSWORD;

    @Bean
    public JdbcTemplate jdbcTemplate(){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource());
        return jdbcTemplate;
    }

    @Bean
    public DataSource dataSource(){
        System.out.println("初始化數據源start。。。");
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(DRIVER);
        dataSource.setUrl(URL);
        dataSource.setUsername(USER);
        dataSource.setPassword(PASSWORD);
        //連接池的其他的屬性。。。
        dataSource.setMaxActive(5);
        //...
        System.out.println("初始化數據源end。。。");
        return dataSource;
    }

}

 @SpringBootConfiguration 這個注解說明當前類是一個配置類,需要被特殊處理,在掃描時發現有@Bean 注解,會把當前方法返回的類Bean注入的容器中,方法名會別標記為注入的Bean的別名,如上JdbcTemplate使用的DataSource就從默認的Hikari修改為Druid了,啟動項目可以看到控制台日志信息

 


免責聲明!

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



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