class JdbcUtils {
private static DataSource ds =
null;
static{
try{
InputStream in = JdbcUtils.
class.getClassLoader().getResourceAsStream("dbcpconfig.properties"
);
Properties prop =
new Properties();
prop.load(in);
BasicDataSourceFactory factory =
new BasicDataSourceFactory();
ds =
factory.createDataSource(prop);
}catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection()
throws SQLException{
return ds.getConnection();
}
public static void release(Connection conn,Statement st,ResultSet rs){
if(rs!=
null){
try{
rs.close(); //throw new
}
catch (Exception e) {
e.printStackTrace();
}
rs =
null;
}
if(st!=
null){
try{
st.close();
}catch (Exception e) {
e.printStackTrace();
}
st =
null;
}
if(conn!=
null){
try{
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
//String sql = "insert into account(id,name,money) values(?,?,?)" object[]{1,"aaa","10000"};
public static void update(String sql,Object params[])
throws SQLException{
Connection conn =
null;
PreparedStatement st =
null;
ResultSet rs =
null;
try{
conn =
getConnection();
st =
conn.prepareStatement(sql);
for(
int i=0;i<params.length;i++
){
st.setObject(i+1
,params[i]);
}
st.executeUpdate();
}finally{
release(conn, st, rs);
}
}
//
public static Object query(String sql,Object params[],ResultSetHandler handler)
throws SQLException{
Connection conn =
null;
PreparedStatement st =
null;
ResultSet rs =
null;
try{
conn =
getConnection();
st =
conn.prepareStatement(sql);
for(
int i=0;i<params.length;i++
){
st.setObject(i+1
,params[i]);
}
rs =
st.executeQuery();
return handler.handler(rs);
}finally{
release(conn, st, rs);
}
}
}
interface ResultSetHandler{
public Object handler(ResultSet rs);
}
class BeanHandler
implements ResultSetHandler{
private Class clazz;
public BeanHandler(Class clazz){
this.clazz =
clazz;
}
public Object handler(ResultSet rs) {
try{
if(!
rs.next()){
return null;
}
//创建封装结果集的bean
Object bean =
clazz.newInstance();
//得到结果集的元数据,以获取结果集的信息
ResultSetMetaData meta =
rs.getMetaData();
int count =
meta.getColumnCount();
for(
int i=0;i<count;i++
){
String name = meta.getColumnName(i+1);
//获取到结果集每列的列名 id
Object value = rs.getObject(name);
//1
//反射出bean上与列名相应的属性
Field f =
bean.getClass().getDeclaredField(name);
f.setAccessible(true);
f.set(bean, value);
}
return bean;
}catch (Exception e) {
throw new RuntimeException(e);
}
}
}
class BeanListHandler
implements ResultSetHandler{
private Class clazz;
public BeanListHandler(Class clazz){
this.clazz =
clazz;
}
public Object handler(ResultSet rs) {
List list =
new ArrayList();
try{
while(rs.next()){
Object bean =
clazz.newInstance();
ResultSetMetaData meta =
rs.getMetaData();
int count =
meta.getColumnCount();
for(
int i=0;i<count;i++
){
String name = meta.getColumnName(i+1
);
Object value =
rs.getObject(name);
Field f =
bean.getClass().getDeclaredField(name);
f.setAccessible(true);
f.set(bean, value);
}
list.add(bean);
}
}catch (Exception e) {
throw new RuntimeException(e);
}
return list;
}
}
O-R Mapping:即把对象映射到关系型数据库里
常用O-R Mapping映射工具
Hibernate
Ibatis
Commons DbUtils(只是对JDBC简单封装)
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,
并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选
下载并查看commons-dbutils API文档
两个最重要的对象:
org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler
QueryRunner :增删改查
QueryRunner的查询结果集要封装到Handler中去,因此DButils框架的核心是ResultSetHandler,要掌握ResultSetHandler的子类。
ResultSetHandler接口 :
该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
ResultSetHandler 接口的实现类
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
JDBC框架
标签: