zoukankan      html  css  js  c++  java
  • Spring的JDBC模板

    Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。它针对JavaEE三层中的每一层都提供了不同的解决技术,在dao层,Spring提供了JDBC模板的技术,可对数据库进行CRUD操作。Spring提供了很多持久层技术的模板类简化了编程,如下图: 

    Spring框架对不同的持久层技术做了封装,如对传统的JDBC使用JdbcTemplate进行了封装,对Hibernate框架使用HibernateTemplate进行了封装。JdbcTemplate对JDBC进行了简单封装,使用类似于dbutils,但是使用并没有dbutils方便,只是提供了一种实现的方式而已。下面来演示使用JdbcTemplate模板类实现CRUD操作。

    使用JdbcTemplate模板类实现CRUD操作

    首先创建数据库和表,如下:

    create database spring_lee;
    use spring_lee;
    
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `username` varchar(100) DEFAULT NULL,
      `password` varchar(100) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    使用JdbcTemplate模板类还须导入jar包,先引入JdbcTemplate的jar包: 

    但我们要知道spring-jdbc-4.2.4.RELEASE.jar包才是最主要的。除此之外还须导入MySQL数据库驱动的jar包。

    添加操作

    在src目录下创建一个cn.itcast.jdbcTemplate包,并在该包下编写一个JdbcTemplateDemo1单元测试类。现在要编写一个add方法来测试添加操作。

    public class JdbcTemplateDemo1 {
    
        // 1.添加操作
        @Test
        public void add() {
            // 1.设置数据库相关信息(JDBC模板依赖连接池获得数据库连接,所以必须先构造连接池)
            DriverManagerDataSource dataSource = new DriverManagerDataSource(); // 数据源
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql:///spring_lee");
            dataSource.setUsername("root");
            dataSource.setPassword("yezi");
    
            // 2.做添加的操作
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            String sql = "insert into user values(?,?)";
            int rows = jdbcTemplate.update(sql, "liayun", "lee");
            System.out.println(rows);
        }
    
    }

    注意:JDBC模板依赖连接池获得数据库连接,所以必须先构造连接池,然后再创建JdbcTemplate模板类对象。而且还须用到JdbcTemplate模板类的update方法: 

    这个方法中有两个参数:

    • 第一个参数是sql语句。
    • 第二个参数是传递的参数值,Object类型的可变参数。

    修改操作

    现在要在单元测试类中编写一个update方法来测试修改操作。

    public class JdbcTemplateDemo1 {
    
        // 2.修改操作
        @Test
        public void update() {
            // 1.设置数据库相关信息
            DriverManagerDataSource dataSource = new DriverManagerDataSource(); // 数据源
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql:///spring_lee");
            dataSource.setUsername("root");
            dataSource.setPassword("yezi");
    
            // 实现修改操作
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            String sql = "update user set password=? where username=?";
            int rows = jdbcTemplate.update(sql, "9999", "liayun");
            System.out.println(rows);
        }
    
    }

    删除操作

    现在要在单元测试类中编写一个delete方法来测试删除操作。

    public class JdbcTemplateDemo1 {
    
        // 3.删除操作
        @Test
        public void delete() {
            // 1.设置数据库相关信息
            DriverManagerDataSource dataSource = new DriverManagerDataSource(); // 数据源
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql:///spring_lee");
            dataSource.setUsername("root");
            dataSource.setPassword("yezi");
    
            // 实现删除操作
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            String sql = "delete from user where username=?";
            int rows = jdbcTemplate.update(sql, "liayun");
            System.out.println(rows);
        }
    
    }

    查询操作

    查询表中的记录数

    现在要在单元测试类中编写一个testCount方法来测试查询表中记录数的操作。

    public class JdbcTemplateDemo1 {
    
        // 查询表记录数
        @Test
        public void testCount() {
            // 1.设置数据库相关信息
            DriverManagerDataSource dataSource = new DriverManagerDataSource(); // 数据源
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql:///spring_lee");
            dataSource.setUsername("root");
            dataSource.setPassword("yezi");
    
            // 2.创建JdbcTemplate模板类的对象
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            // 3.sql语句
            String sql = "select count(*) from user";
            // 4.调用JdbcTemplate模板类里面的方法
            // 返回int类型
            int count = jdbcTemplate.queryForObject(sql, Integer.class);
            System.out.println(count);
        }

    在查询表中记录数的操作时,用到了JdbcTemplate模板类里面的queryForObject方法,如下: 

    这个方法中有两个参数:

    • 第一个参数:sql语句
    • 第二个参数:返回类型的class

    查询返回对象

    使用JdbcTemplate模板类进行查询操作的时候,还是比较麻烦的。前面我也说过JdbcTemplate对JDBC进行了简单封装,使用类似于dbutils,但是使用并没有dbutils方便,只是提供了一种实现的方式而已。为何这么说呢?因为在dbutils里面帮我们编写好了一些实现类,使用这些实现类可以封装结果,这些实现类都实现了接口ResultSetHandler;使用JdbcTemplate模板类进行查询操作返回数据结果的时候,虽然在JdbcTemplate模板类中有个接口,但是并没有提供实现类,故还需要自己编写实现类来封装结果。

     首先在cn.itcast.jdbcTemplate包下编写一个User类。

    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 + "]";
        }
    
    }

    接下来,就来讲如何使用JdbcTemplate模板类进行查询操作并返回一个User类的对象。其中就要用到JdbcTemplate模板类里面的queryForObject方法:

     

    这个方法有3个参数:

    • 第一个参数:sql语句
    • 第二个参数:RowMapper接口 
      1. 之前使用dbutils进行查询时,返回结果有ResultSetHandler接口,但是在dbutils里面有其对应的实现类。
      2. 使用JdbcTemplate模板类的时候,虽然提供了RowMapper接口,但是这个接口没有实现类,需要自己进行实现,然后进行数据封装。
    • 第三个参数:可变参数

    现在要在JdbcTemplateDemo2单元测试类中编写一个testObject方法来测试查询时返回一个User类对象的操作。

    public class JdbcTemplateDemo2 {
    
        // 1.查询返回对象
        @Test
        public void testObject() {
    
            // 1.设置数据库相关信息
            DriverManagerDataSource dataSource = new DriverManagerDataSource(); // 数据源
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql:///spring_lee");
            dataSource.setUsername("root");
            dataSource.setPassword("yezi");
    
            // 2.创建JdbcTemplate对象
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            // 3.sql语句
            String sql = "select * from user where username=?";
    
            // 4.调用方法执行
            // 第二个参数是接口,RowMapper,要自己创建一个类实现这个接口,在里面进行封装
            User user = jdbcTemplate.queryForObject(sql, new MyRowMapper(), "mary");
            System.out.println(user);
    
        }
    
    }

    注意,还要编写RowMapper接口的一个实现类。在以上JdbcTemplateDemo2.java源代码文件中编写RowMapper接口的一个MyRowMapper实现类。

    / T:表示要将数据封装到哪个类的对象中
    class MyRowMapper implements RowMapper<User> {
    
        // 实现接口里面的方法,在方法中实现数据封装
        // 第一个参数:返回的结果集,第二个参数是当前的行数(即第几行)
        @Override
        public User mapRow(ResultSet rs, int rows) throws SQLException {
            // 从结果集得到数据
            String username = rs.getString("username");
            String password = rs.getString("password");
    
            // 封装到对象里面
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            return user;
        }
    
    }

    查询返回List集合

    现在要在JdbcTemplateDemo2单元测试类中编写一个testList方法来测试查询时返回List集合的操作。

    public class JdbcTemplateDemo2 {
    
        // 2.返回List集合
        @Test
        public void testList() {
    
            // 1.设置数据库相关信息
            DriverManagerDataSource dataSource = new DriverManagerDataSource(); // 数据源
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql:///spring_lee");
            dataSource.setUsername("root");
            dataSource.setPassword("yezi");
    
            // 2.查询操作
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            String sql = "select * from user";
    
            List<User> list = jdbcTemplate.query(sql, new MyRowMapper());
            System.out.println(list);
    
        }
    
    }

    在进行查询并返回List集合的操作时,须用到JdbcTemplate模板类里面的query方法:

    Spring配置连接池

    在实际开发中,一般都会用Spring配置C3P0连接池,所以下面我就来重点介绍在Spring中如何配置C3P0连接池。 
    首先引入Spring的配置文件,主要是引入约束:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
    
    </beans>

    接着导入Spring的基本jar包,除此之外,还要导入C3P0的jar包: 

    试想要是以前在Web项目中配置C3P0连接池,势必会写这样的代码:

    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    dataSource.setDriverClass(driverClass);
    dataSource.setJdbcUrl(jdbcUrl);
    dataSource.setUser(user);
    dataSource.setPassword(password);

    而现在我们就可以在Spring配置文件(bean2.xml)中配置C3P0连接池了,即在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:///spring_lee"></property>
        <property name="user" value="root"></property>
        <property name="password" value="yezi"></property>
    </bean>

    现在举例来演示如何在Spring中配置C3P0连接池了。创建一个UserService类和一个UserDao类,然后在UserService类里面调用UserDao类的方法,在UserDao类中使用JdbcTemplate模板类进行数据库CRUD操作,并且用上C3P0连接池。 
    先在src目录下创建一个cn.itcast.c3p0包,并在该包下编写一个UserDao类。

    public class UserDao {
    
        // 在Dao里面要得到JdbcTemplate对象
        private JdbcTemplate jdbcTemplate;
        public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        // 添加操作,使用JdbcTemplate模板来实现添加
        public void add() {
            String sql = "insert into user values(?,?)";
            jdbcTemplate.update(sql, "李阿昀", "lee");
        }
    }

    再在该包下编写一个UserService类,并在UserService类里面调用UserDao类的add方法。

    public class UserService {
    
        private UserDao userDao;
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        public void add() {
            userDao.add();
        }
    }

    那么Spring核心配置文件就应该像下面这样配置:

    <!-- 配置service和dao以及它们的注入 -->
    <bean id="userService" class="cn.itcast.c3p0.UserService">
        <property name="userDao" ref="userDao"></property>
    </bean>
    <bean id="userDao" class="cn.itcast.c3p0.UserDao">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>
    
    <!-- 配置JdbcTemplate模板类的对象 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!-- 注入dataSource,因为在其源代码中dataSource属性有其对应的set方法,故可直接注入 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    从上面的配置可看出:UserDao中注入了JdbcTemplate对象,JdbcTemplate对象里面又注入了dataSource。 
    最后再在该包下编写一个TestDemo单元测试类。

    public class TestDemo {
    
        @Test
        public void testBook() {
            ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
            UserService userService = (UserService) context.getBean("userService");
            userService.add();
        }
    }
  • 相关阅读:
    Jersey的异常处理
    REST响应处理
    jersey REST的接口简述
    Firebird 同一字段的多行合并为一行
    Firebird/InterBase内置函数使用说明
    发布FireBird数据库所需要DLL文件
    unidac连接FireBird数据库
    打开与关闭Linux防火墙
    Linux FTP 命令
    Linux 命令修改系统时间
  • 原文地址:https://www.cnblogs.com/qinjf/p/9053924.html
Copyright © 2011-2022 走看看