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

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

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

下面咱們來使用 jdbcTemplate 對數據庫進行 crud 操做。mysql

準備工做

1 咱們首先來導入 jar 包,仍是類似的使用 maven 來導入,修改配置文件,須要導入 jar 包的配置:spring

<!-- 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 建立對象,設置數據庫信息。這裏以我本身的爲例:sql

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 操做。app

下面就分別來說下 jdbcTemplate 的 curd 操做。maven

首先先建立一個數據庫命名爲 sampledb, 在數據庫中新增一個表。添加幾條記錄,以下:ide

增長

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

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

能夠看到成功插入了"李雷"這條記錄。

相關文章
相關標籤/搜索