Spring整合JDBC

Posted Dream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring整合JDBC相关的知识,希望对你有一定的参考价值。

1、Spring整合JDBC

(1)导包(共12个):

c3p0连接池、JDBC驱动(4个)

Spring-jdbc、Spring-tx事务(2个)

 

 (2)JDBC模板对象(JDBCTemplate)

public class JDBCDemo {
    public void test() throws PropertyVetoException {
        ComboPooledDataSource comboPooledDataSource=new ComboPooledDataSource();
        comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
        comboPooledDataSource.setJdbcUrl("jdbc:mysql:///stu_mangement");
        comboPooledDataSource.setPassword("root");
        comboPooledDataSource.setUser("root");
        JdbcTemplate jdbcTemplate=new JdbcTemplate();
        jdbcTemplate.setDataSource(comboPooledDataSource);
        String sql="INSERT INTO student VALUES(\'201816\',\'1998-11-11\',\'tx101\',\'19837372534\',\'男\',\'jiayou\',\'892\')";
        jdbcTemplate.update(sql);
    }
    public static void main(String[] args) throws PropertyVetoException {
        JDBCDemo jdbcDemo=new JDBCDemo();
        jdbcDemo.test();
    }
}

需要先创建连接池,获取comboPooledDataSource对象,将该对象给模板对象,最后,利用模板对象执行sql语句。但是,这种方法是手动创建对象的,没有体现Spring的IoC特性。

 

2、连接池、JDBC模板、Dao配置到Spring容器

(1)创建数据库(学生信息):

 (2)创建一个接口,指定实现类的方法:

import java.util.List;
public interface StudentDao {
    void add(Student student);
    void delete(Integer studentno);
    void update(Student student);
    Student getStudentByNum(Integer studentno);
    int getTotalCount();
    List<Student> getAll();
}

(3)创建实现类,实现接口中的方法:

添加学生信息:

public void add(Student student) {
        String sql="INSERT INTO student VALUES(?,?,?,?,?,?,?)";
        jdbcTemplate.update(sql,
                student.getStudentno(),
                student.getBirthday(),
                student.getClassno(),
                student.getPhone(),
                student.getSex(),
                student.getSname(),
                student.getPoint());
    }

根据学生的学号删除学生信息:

    public void delete(Integer studentno){
        String sql="delete from student where studentno=?";
        jdbcTemplate.update(sql,studentno);
    }

修改学生信息:

public void update(Student student) {
        String sql="update student set phone=? where studentno=?";
        jdbcTemplate.update(sql,student.getPhone(),student.getStudentno());
    }
public static void main(String [] args){
            ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//创建容器对象
            StudentDao studentDao  =(StudentDao)applicationContext.getBean("studentDao");
            Student student=new Student();
            student.setStudentno(201811);
            student.setPhone("1234567890");
            studentDao.update(student);
    }

根据学号查询学生信息:

  public Student getStudentByNum(Integer studentno) {
        String sql="select * from student where studentno=?";
        return jdbcTemplate.queryForObject(sql, new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student student=new Student();
                student.setStudentno(resultSet.getInt("studentno"));
                student.setSname(resultSet.getString("sname"));
                return student;
            }
        },
                studentno);//这个studentno是参数传过来的
    }

利用匿名内部类创建一个RowMapper,并实现该内部类里面的方法,获取一个student的对象,通过传递参数(studentno)返回符合条件的Student。

Student{sname=\'jiayou\', studentno=201816, birthday=\'null\', classno=\'null\', phone=\'null\', sex=\'null\', point=null}

获取学生的数量:

   public int getTotalCount() {
        String sql="select count(*) from student";
        Integer count =jdbcTemplate.queryForObject(sql,Integer.class);
        return count;
    }

传递参数的时候需要指明返回的结果的数据类型,用Integer.class。

获取全部学生信息:

public List<Student> getAll() {
        String sql="select * from student";
        List<Student> list=jdbcTemplate.query(sql, new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student student=new Student();
                student.setStudentno(resultSet.getInt("studentno"));
                student.setSname(resultSet.getString("sname"));
                student.setPhone(resultSet.getString("phone"));
                student.setSex(resultSet.getString("sex"));
                student.setPoint(resultSet.getFloat("point"));
                student.setClassno(resultSet.getString("classno"));
                student.setBirthday(resultSet.getString("birthday"));
                return student;
            }
        });
        return list;
    }

与通过学号获取学生的信息不同,获取全部学生的信息的时候不需要传递参数,因此,query方法中参数的数量为2。

(4)配置文件:只有配置好了配置文件后才能获取到对象

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util.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">
<!--将连接池放入Spring容器-->
    <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql:///stu_mangement"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
<!--将JDBCTemplate放入Spring容器-->
    <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
<!--将StudentDao放入Spring容器中-->
    <bean name="studentDao" class="pers.zhb.jdbc.StudentDaoImp">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>
</beans>

通过配置文件,将以前手动创建对象的方式变成了通过配置文件获取对象。在这里用到了属性的注入,要注意基本数据类型和引用数据类型属性的区别。

(5)测试类:

public class Test {
    public static void main(String [] args){
            ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//创建容器对象
            StudentDao studentDao  =(StudentDao)applicationContext.getBean("studentDao");
            List<Student> list =studentDao.getAll();
            System.out.println(list);
    }
}

(6)StudentDaoImp类:

public class StudentDaoImp implements StudentDao{
    private JdbcTemplate jdbcTemplate;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public void add(Student student) {
        String sql="INSERT INTO student VALUES(?,?,?,?,?,?,?)";
        jdbcTemplate.update(sql,
                student.getStudentno(),
                student.getBirthday(),
                student.getClassno(),
                student.getPhone(),
                student.getSex(),
                student.getSname(),
                student.getPoint());
    }

    @Override
    public void delete(Integer studentno){
        String sql="delete from student where studentno=?";
        jdbcTemplate.update(sql,studentno);
    }

    @Override
    public void update(Student student) {
        String sql="update student set phone=? where studentno=?";
        jdbcTemplate.update(sql,student.getPhone(),student.getStudentno());
    }

    @Override
    public Student getStudentByNum(Integer studentno) {
        String sql="select * from student where studentno=?";
        return jdbcTemplate.queryForObject(sql, new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student student=new Student();
                student.setStudentno(resultSet.getInt("studentno"));
                student.setSname(resultSet.getString("sname"));
                return student;
            }
        },
                studentno);//这个studentno是参数传过来的
    }

    @Override
    public int getTotalCount() {
        String sql="select count(*) from student";
        Integer count =jdbcTemplate.queryForObject(sql,Integer.class);
        return count;
    }

    @Override
    public List<Student> getAll() {
        String sql="select * from student";
        List<Student> list=jdbcTemplate.query(sql, new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student student=new Student();
                student.setStudentno(resultSet.getInt("studentno"));
                student.setSname(resultSet.getString("sname"));
                student.setPhone(resultSet.getString("phone"));
                student.setSex(resultSet.getString("sex"));
                student.setPoint(resultSet.getFloat("point"));
                student.setClassno(resultSet.getString("classno"));
                student.setBirthday(resultSet.getString("birthday"));
                return student;
            }
        });
        return list;
    }
}

另外一种方法:不需要手动书写JDBC模板对象,直接从父类中获取即可:

public class StudentDaoImp extends JdbcDaoSupport implements StudentDao{
    @Override
    public void add(Student student) {
        String sql="INSERT INTO student VALUES(?,?,?,?,?,?,?)";
        super.getJdbcTemplate().update(sql,
                student.getStudentno(),
                student.getBirthday(),
                student.getClassno(),
                student.getPhone(),
                student.getSex(),
                student.getSname(),
                student.getPoint());
    }

    @Override
    public void delete(Integer studentno){
        String sql="delete from student where studentno=?";
        super.getJdbcTemplate().update(sql,studentno);
    }

    @Override
    public void update(Student student) {
        String sql="update student set phone=? where studentno=?";
        super.getJdbcTemplate().update(sql,student.getPhone(),student.getStudentno());
    }

    @Override
    public Student getStudentByNum(Integer studentno) {
        String sql="select * from student where studentno=?";
        return super.getJdbcTemplate().queryForObject(sql, new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student student=new Student();
                student.setStudentno(resultSet.getInt("studentno"));
                student.setSname(resultSet.getString("sname"));
                return student;
            }
        },
                studentno);//这个studentno是参数传过来的
    }

    @Override
    public int getTotalCount() {
        String sql="select count(*) from student";
        Integer count =super.getJdbcTemplate().queryForObject(sql,Integer.class);
        return count;
    }

    @Override
    public List<Student> getAll() {
        String sql="select * from student";
        List<Student> list=super.getJdbcTemplate().query(sql, new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student student=new Student();
                student.setStudentno(resultSet.getInt("studentno"));
                student.setSname(resultSet.getString("sname"));
                student.setPhone(resultSet.getString("phone"));
                student.setSex(resultSet.getString("sex"));
                student.setPoint(resultSet.getFloat("point"));
                student.setClassno(resultSet.getString("classno"));
                student.setBirthday(resultSet.getString("birthday"));
                return student;
            }
        });
        return list;
    }
}

此时的配置文件少了一个继承关系:

<!--将连接池放入Spring容器-->
    <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql:///stu_mangement"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
<!--将StudentDao放入Spring容器中-->
    <bean name="studentDao" class="pers.zhb.jdbc.StudentDaoImp">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

因为JDBCDaoSupport是根据连接池创建的JDBC模板,不需要再手动获取了。

 

3、配置文件有关JDBC的优化

(1)创建db.properties配置文件:

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///stu_mangement
jdbc.user=root
jdbc.password=root

(2)在spring的配置文件中读取db.properties配置文件的数据:

<!--指定要读取的配置文件的位置-->
    <context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!--将连接池放入Spring容器-->
    <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClass}"></property>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
<!--将StudentDao放入Spring容器中-->
    <bean name="studentDao" class="pers.zhb.jdbc.StudentDaoImp">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

这种方式虽然创建了两个配置文件看上去比较繁琐,但是,这种方式是有利于后期的维护的:方便对JDBC有关参数的修改。

 

以上是关于Spring整合JDBC的主要内容,如果未能解决你的问题,请参考以下文章

JAVAEE框架整合技术之spring03-SpringJdbcTemplate模板技术和事务处理

spring整合JDBC

Spring整合JDBC以及AOP管理事务

Spring整合JDBC以及AOP管理事务

Spring整合JDBC以及AOP管理事务

JAVAEE——spring03:spring整合JDBC和aop事务