使用元数据简化jdbc代码
一 简化的原因
在daoImp层中,在写增删改查的时候,每次都要重写一次封装数据库对象,创建连接对象,定义sql语句,释放资源,在这些方法中,我们可以提取共同点,并把不同的定义sql语句并处理sql语句,当成参数传给一个方法,并用循环的方式输出也是个很好的操作
二 简化的实现
1.建框架---提取共同的部分并形成一个方法
// 建框架----更新的操作是增、删 、改
public static void udpate(String sql, Object[] params) {
Connection con = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
con = DBManager_c3p0.getConnection();
st = con.prepareStatement(sql);
for(int i =1;i<params.length;i++){
st.setObject(i+1, params[i]);
}
st.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBManager.release(con, st, rs);
}
}
//查询
public static Object find(String sql,Object[] params,ResultSetHandler rsh)throws Exception{
Connection con=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
con=DBManager.getConnection();
st=con.prepareStatement(sql);
for(int i=0;i<params.length;i++){
st.setObject(i+1,params[i]);
}
st.executeQuery();
//对结果集的处理(框架的开发者不知道如何处理)
//调用程序员传过来的对结果集进行处理的方法即可
return rsh.handler(rs);
}finally{
DBManager.release(con, st, rs);
}
注:
实例化:
public class User {
private Integer id;
private String name;
private String email;
private Date birthday;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
接口类:
//结果集处理器的接口
public interface ResultSetHandler {
public Object handler(ResultSet rs);
}
接口实现类:
public class MyResultHandler implements ResultSetHandler {
@Override
public Object handler(ResultSet rs) {
// TODO Auto-generated method stub
User user = new User();
try {
if(rs.next()){
user.setId(rs.getInt(1));
user.setName(rs.getString(2));
user.setEmail(rs.getString(3));
user.setBirthday(rs.getDate(4));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
2.daoImpl层中使用框架特别简单,就几句话
(1)insert方法的实现
public void insert() {
String sql = "insert into users(name,password,email) values(?,?,?)";
Object[] params = { "xxx", "111", "lkfjl@.com" };
DBManager.udpate(sql, params);
}
(2)delete方法的实现
public void delete() {
String sql = "delete from users where id=?";
Object[] params = { 4 };
DBManager.udpate(sql, params);
}
(3)update方法的实现
public void update() {
String sql = "update users set name=?,password=? where id=?";
Object[] params = { "sdgdd", "111", 5 };
DBManager.udpate(sql, params);
}
(4)查询方法的实现
//查询
public void find() throws Exception{
String sql="select * from users where id=?";
Object[] params={5};
//MyResultHandler rsh=new MyResultHandler();
BeanResultHandler rsh=new BeanResultHandler(User.class );
User user=(User) DBManager.find(sql, params, rsh);
System.out.println(user.getId()+" "+user.getName());
}
//查询所有
public List findAll() throws Exception{
List list=null;
String sql="select * from users";
Object[] params={};
BeanListHandler rsh=new BeanListHandler(User.class);
list=(List) DBManager.find(sql, params, rsh);
return list;
}
3.建立一个类去测试
UserDaoImpl obj = new UserDaoImpl();
obj.insert();