JdbcTemplate查询(Spring框架中的工具类)

来源:互联网 发布:wampserver mac版 编辑:程序博客网 时间:2024/05/17 07:17

JdbcTemplate是由Spring框架提供的一个工具类,他对Jdbc API提供了很好的封装,可以用来完全替代JDBC API

1、导入包
spring.jar
commons-logging.jar

修改JdbcUtils.java增加getDataSource()

package cn.itcast.jdbc;import java.io.InputStream;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;public final class JdbcUtils {    private static DataSource myDataSource = null;    private JdbcUtils() {    }    static {        try {            Properties prop = new Properties();            InputStream is = JdbcUtils.class.getClassLoader()                    .getResourceAsStream("dbcpconfig.properties");            prop.load(is);            myDataSource = BasicDataSourceFactory.createDataSource(prop); // 屏蔽了创建数据源的过程        } catch (Exception e) {            throw new ExceptionInInitializerError(e);        }    }    public static Connection getConnection() throws SQLException {        // return DriverManager.getConnection(url, user, password);        return myDataSource.getConnection(); // 取连接    }    public static DataSource getDataSource(){        return myDataSource;    }    public static void free(ResultSet rs, Statement st, Connection conn) {        try {            if (rs != null)                rs.close();        } catch (SQLException e) {            e.printStackTrace();        } finally {            try {                if (st != null)                    st.close();            } catch (SQLException e) {                e.printStackTrace();            } finally {                try {                    if (conn != null)                        conn.close();                } catch (Exception e) {                    e.printStackTrace();                }            }        }    }}

2、使用JdbcTemplate 查询

static User findUser1(String name) {        JdbcTemplate jdbc = new JdbcTemplate(JdbcUtils.getDataSource());        String sql = "select id,name,money,birthday from user where name=?";        Object[] args = new Object[] { name };        Object user = jdbc.queryForObject(sql, args, new RowMapper() {   //匿名内部类的方式            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {                User user = new User();                user.setId(rs.getInt("id"));                user.setName(rs.getString("name"));                user.setMoney(rs.getFloat("money"));                user.setBirthday(rs.getDate("birthday"));                return user;            }        });        return (User) user;    }

3、改进上一步

spring提供了自带的映射器,

static User findUser(String name) {        JdbcTemplate jdbc = new JdbcTemplate(JdbcUtils.getDataSource());        String sql = "select id,name,money,birthday from user where name=?";        Object[] args = new Object[] { name };        Object user = jdbc.queryForObject(sql, args,new BeanPropertyRowMapper(User.class));//需要一个class的参数,queryForObject方法返回一个结果        return (User) user;    }

在这个例子要注意变量的命名:

  • sql语句中的命名与User.class中的命名相同,或
  • 严格遵守数据库(单词之间以下划线分割)与java(驼峰法)的命名规范,spring会自动转换,或
  • 可以使用别名

4、使用JdbcTemplate 查询多个记录

static List<User> findUsers(int id) {        JdbcTemplate jdbc = new JdbcTemplate(JdbcUtils.getDataSource());        String sql = "select id,name,money,birthday from user where id<?";        Object[] args = new Object[] { id};        List<User> users = jdbc.query(sql, args,new BeanPropertyRowMapper<User>(User.class));  //query方法返回的就是一个list        return  users;    }

5、其他查询
JdbcTemplate有很多其他的查询方法,如
queryForInt
queryForObejct
queryForList
等等
没有queryForString,如果需要返回String类型,可以用queryForObejct 然后转型

0 0
原创粉丝点击