package com.itheima.util;
import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
/**
* 此类是sql语句的辅助类
* @author simon
*
*/
public class DbAssit
{
//在引用此类的时候就会要求传入数据源
private DataSource dataSource;
public DbAssit(DataSource dataSource)
{
this.dataSource = dataSource;
}
//此方法适合增,删,改操作
public void update(String sql,Object[] param)
{
Connection conn = null;
PreparedStatement pst = null;
try
{
conn = dataSource.getConnection();
pst = conn.prepareStatement(sql);
//获取关于 PreparedStatement 对象中每个参数标记的类型和属性信息的对象
ParameterMetaData pm = pst.getParameterMetaData();
//获取sql语句中参数的个数
int pmCount = pm.getParameterCount();
if(pmCount>0)
{
//首先要判断传进来的参数要不为空,并且参数的个数要和sql语句中的占位符个数相同
if(param==null && param.length!= pmCount)
{
throw new RuntimeException();
}
//sql语句的参数和传入的参数个数相同的话,则用prepareStatement去设置占位符的值
for(int i=0;i<pmCount;i++)
{
pst.setObject(i+1, param[i]);
}
}
pst.executeUpdate();
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
closeAll(conn,pst,null);
}
}
//删除,ResultSetHandler rsh这是一个接口
public Object query(String sql,Object[] param,ResultSetHandler rsh)
{
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
try
{
conn = dataSource.getConnection();
pst = conn.prepareStatement(sql);
//获取关于 PreparedStatement 对象中每个参数标记的类型和属性信息的对象
ParameterMetaData pm = pst.getParameterMetaData();
//获取sql语句中参数的个数
int pmCount = pm.getParameterCount();
if(pmCount>0)
{
//首先要判断传进来的参数要不为空,并且参数的个数要和sql语句中的占位符个数相同
if(param==null && param.length!= pmCount)
{
throw new RuntimeException();
}
//sql语句的参数和传入的参数个数相同的话,则用prepareStatement去设置占位符的值
for(int i=0;i<pmCount;i++)
{
pst.setObject(i+1, param[i]);
}
}
rs = pst.executeQuery();
}
catch (SQLException e)
{
e.printStackTrace();
}
//返回用传入的接口调用他们自己的方法,传入结果集,返回一个对象
return rsh.handler(rs);
}
private void closeAll(Connection conn,PreparedStatement ps,ResultSet rs)
{
if(conn!=null)
{
try
{
conn.close();
} catch (SQLException e)
{
e.printStackTrace();
}
conn=null;
}
if(ps!= null)
{
try
{
ps.close();
} catch (SQLException e)
{
e.printStackTrace();
}
ps=null;
}
if(rs!= null)
{
try
{
rs.close();
} catch (SQLException e)
{
e.printStackTrace();
}
rs= null;
}
}
//此方法适合查询操作
}
package com.itheima.util;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
public class BeanHandler implements ResultSetHandler
{
public Class clazz;
public BeanHandler(Class clazz)
{
this.clazz = clazz;
}
public Object handler(ResultSet rs)
{
try
{
if(rs.next())
{
Object instance = clazz.newInstance();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
for(int i=0;i<count;i++)
{
String name = rsmd.getColumnName(i+1);
Object obj = rs.getObject(i+1);
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
field.set(instance, obj);
}
return instance;
}
else
{
return null;
}
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
}
package com.itheima.util;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
public 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 instance = clazz.newInstance();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
for(int i=0;i<count;i++)
{
String name = rsmd.getColumnName(i+1);
Object obj = rs.getObject(i+1);
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
field.set(instance, obj);
}
list.add(instance);
}
return list;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
}
package com.itheima.util;
import java.sql.ResultSet;
public interface ResultSetHandler
{
Object handler(ResultSet obj);
}
下面是测试类
package com.itheima.util;
import java.util.List;
import org.junit.Test;
import com.itheima.util.Account;
public class AccountDao
{
private DbAssit da = new DbAssit(new C3P0Util().getDatasource());
@Test
public void add()
{
String sql = "insert into account(id,name,money) values(?,?,?)";
da.update(sql, new Object[]{8,"ggg",1000});
}
@Test
public void update()
{
String sql = "update account set money = 1000";
da.update(sql, null);
}
@Test
public void delete()
{
String sql = "delete from account where id = ?";
da.update(sql, new Object[]{8});
}
@Test
public void query()
{
String sql = "select * from account";
ResultSetHandler rsh = new BeanListHandler(Account.class);
List<Account> as = (List<Account>) da.query(sql, null,rsh );
for(Account ac :as)
{
System.out.println(ac);
}
}
}