spring 學習(四): spring 的 jdbcTemplate 操作


spring 學習(四): spring 的 jdbcTemplate 操作

spring 針對 javaee 的每一層,都提供了相應的解決技術,jdbcTemplate 的主要操作在 dao 層。

下面我們來使用 jdbcTemplate 對數據庫進行 crud 操作。

准備工作

1 我們首先來導入 jar 包,還是相似的使用 maven 來導入,修改配置文件,需要導入 jar 包的配置:

		<!-- jdbcTemplate 使用的 jar 包 -->
		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
		<!-- 數據庫驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.12</version>
        </dependency>

2 創建對象,設置數據庫信息。這里以我自己的為例:

DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///sampledb");
        dataSource.setUsername("root");
        dataSource.setPassword("");

3 創建 jdbcTemplate 對象,設置數據源:

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

4 調用 jdbcTemplate 對象里面的方法來實現curd 操作。

下面就分別來講下 jdbcTemplate 的 curd 操作。

首先先創建一個數據庫命名為 sampledb, 在數據庫中新增一個表。添加幾條記錄,如下:

增加

//1.添加操作
    @Test
    public void add(){
        //設置數據庫信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///sampledb");
        dataSource.setUsername("root");
        dataSource.setPassword("");

        //創建jdbcTemplate對象,設置數據源
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        //調用jdbcTemplate對象里面的方法實現操作
        //創建sql 語句
        String sql = "insert into user values(?,?)";
        int rows = jdbcTemplate.update(sql, "lucy", "250");
        System.out.println(rows);
    }

修改

//2.修改操作
    @Test
    public void update(){
        //設置數據庫信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///sampledb");
        dataSource.setUsername("root");
        dataSource.setPassword("");

        //創建jdbcTemplate對象,設置數據源
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        //調用jdbcTemplate對象里面的方法實現操作
        //創建sql 語句
        String sql = "update user set password=? where username=?";
        int rows = jdbcTemplate.update(sql, "1314", "lucy");
        System.out.println(rows);
    }

刪除

//3.刪除操作
    @Test
    public void delete(){
        //設置數據庫信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///sampledb");
        dataSource.setUsername("root");
        dataSource.setPassword("");

        //創建jdbcTemplate對象,設置數據源
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        //調用jdbcTemplate對象里面的方法實現操作
        //創建sql 語句
        String sql = "DELETE FROM USER WHERE username=?";
        int rows = jdbcTemplate.update(sql, "lucy");
        System.out.println(rows);
    }

這里的增刪改操作都是使用 jdbcTemplate.update() 方法。

查詢

查詢返回某一個值

使用 queryForObject(String sql, Class<T> requiredType) 方法。

(1)第一個參數是 sql 語句。

(2)第二個參數返回類型的 class。

舉個栗子:

//查詢操作
    @Test
    public void query(){
        //設置數據庫信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///sampledb");
        dataSource.setUsername("root");
        dataSource.setPassword("");

        //創建jdbcTemplate對象,設置數據源
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        //調用jdbcTemplate對象里面的方法實現操作
        //查詢方法得到記錄數
        String sql = "select count(*) from user";
        //調用 jdbcTemplate的方法
        int count = jdbcTemplate.queryForObject(sql, Integer.class);
        System.out.println(count);
    }

將從 user 表中查詢所有的記錄數量。

jdbc實現

為了方便理解,我們使用 jdbc 來實現查詢某個返回對象的操作。

還是舉個栗子,查詢 user 表下的所有返回對象。

新建 User.java 文件,對數據庫中的 username 和 password 實現封裝操作:

package cn.itcast.jdbc;

public class User {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

使用 jdbc 實現查詢返回 User 對象操作:

 //jdbc 實現代碼
    @Test
    public void testJDBC() throws SQLException {
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;
        //加載驅動
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //創建連接
            conn = DriverManager.getConnection("jdbc:mysql:///sampledb", "root" , "");
            //編寫 sql 語句
            String sql = "select * from user where username=?";
            //預編譯 sql
            psmt = conn.prepareStatement(sql);
            //設置參數值
            psmt.setString(1, "lucy");
            //執行 sql
            rs = psmt.executeQuery();
            //遍歷結果集
            while (rs.next()){
                //得到返回值
                String username = rs.getString("username");
                String password = rs.getString("password");
                //放到 user 對象里
                User user = new User();
                user.setUsername(username);
                user.setPassword(password);

                System.out.println(user);
            }
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            rs.close();
            conn.close();
            psmt.close();
        }
    }

使用 jdbcTemplate 實現查詢返回對象操作

將使用到 queryForObject(String sql, RowMapper<T> rowMapper, Object... args) 方法。

  • 第一個參數是 SQL 語句
  • 第二個參數是 RowMapper,是接口,需要自己封裝
  • 第三一參數是可變參數

還是舉個栗子:

//查詢返回對象
    @Test
    public void testObject(){
        //設置數據庫信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///sampledb");
        dataSource.setUsername("root");
        dataSource.setPassword("");

        //創建jdbcTemplate對象,設置數據源
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        //寫 SQL 語句,根據 username 查詢
        String sql = "select * from user where username=?";
        //調用 jdbcTemplate的方法實現
        //第二個參數是接口 rowMapper, 需要自己寫類實現接口,自己做數據封裝
        User user = jdbcTemplate.queryForObject(sql, new MyRowMapper(), "lucy");
        System.out.println(user);
    }

RowMapper 封裝的接口類:

class MyRowMapper implements RowMapper<User> {

    @Override
    public User mapRow(ResultSet rs, int num) throws SQLException {
        //1 從結果集里面把數據得到
        String username = rs.getString("username");
        String password = rs.getString("password");

        //2 把得到數據封裝到對象里面
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);

        return user;
    }
}

查詢返回列表

使用 query(String sql, RowMapper<T> rowMapper, Object... args):List<T> 方法。

  • 第一個參數:SQL 語句
  • 第二個參數:RowMapper 接口,自己寫類實現數據封裝
  • 第三個參數:可變參數

舉個栗子:

  //查閱返回列表
    @Test
    public void testList(){
        //設置數據庫信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///sampledb");
        dataSource.setUsername("root");
        dataSource.setPassword("");

        //創建jdbcTemplate對象,設置數據源
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        //寫 SQL 語句,根據 username 查詢
        String sql = "select * from user";
        //調用 jdbcTemplate的方法實現
        //第二個參數是接口 rowMapper, 需要自己寫類實現接口,自己做數據封裝
        List<User> list = jdbcTemplate.query(sql, new MyRowMapper());
        System.out.println(list);
    }
}

spring 配置連接池和 dao 層使用 jdbcTemplate

上述的方法雖然能實現數據庫的 crud 操作,但未免太過繁瑣,我們更希望能以更簡單的方式來實現數據的 crud 操作,spring 為我們提供了通過配置 xml 文件的方式來實現上述操作。

spring 配置 c3p0連接池

首先我們導入相應的 jar 包,還是相似的,利用 maven 來導入:

        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>mchange-commons-java</artifactId>
            <version>0.2.15</version>
        </dependency>

然后創建 spring 配置文件,配置連接池:

<!-- 配置c3p0連接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 注入屬性值 -->
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql:///sampledb"></property>
        <property name="user" value="root"></property>
        <property name="password" value=""></property>
    </bean>

dao 使用 jdbctemplate

(1)創建 UserDao.java 和 UserService.java 文件

UserDao.java:

package cn.itcast.c3p0;

import org.springframework.jdbc.core.JdbcTemplate;

public class UserDao {

    //得到 jdbcTemplate 對象
    private JdbcTemplate jdbcTemplate;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void add(){
        String sql = "insert into user values(?,?)";
        jdbcTemplate.update(sql, "李雷", "520");
    }
}

UserService.java:

package cn.itcast.c3p0;

public class UserService {
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void add(){
        userDao.add();
    }
}

(2)將代碼放在配置文件中進行配置:

 <!-- 創建 jdbcTemplate對象 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!-- 把 dataSource 傳遞到模板對象里面 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 創建service 和 dao 對象,在 service 注入 dao 對象 -->
    <bean id="userDao" class="cn.itcast.c3p0.UserDao">
        <!-- 注入 jdbcTemplate對象 -->
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>
    <bean id="userService" class="cn.itcast.c3p0.UserService">
        <!-- 注入 dao 對象 -->
        <property name="userDao" ref="userDao"></property>
    </bean>

(3)創建測試文件 TestService.java:

package cn.itcast.c3p0;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestService {
    @Test
    public void testDemo(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService service = (UserService) context.getBean("userService");
        service.add();
    }
}

運行測試文件,我們在數據庫中查看結果:

可以看到成功插入了"李雷"這條記錄。


免責聲明!

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



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