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
然后转型