DAO层中需要编写CRUD代码,可分为两类,
其中增删改可归类为update,
查询可归类为query。
可以根据这两类来进一步优化们的代码,
抽象出来一个BaseDao类
让具体应用的Dao类来继承这个类。
package com.cht.dao;
import com.cht.utils.Conn;
import org.apache.commons.beanutils.BeanUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class BaseDao {
//准备工作
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
/*更新类,参数介绍:
void:增删改通常不需要返回值。
sql:具体进行操作的增删改的sql语句。
Parameters:用来存放占位符。*/
public void Update(String sql, Object[] Parameters) {
// 获取数据库链接。
conn = Conn.getConnection();
try {
//预编译传递过来的sql语句。pstmt防sql注入
pstmt = conn.prepareStatement(sql);
//计算pstmt中元数据的个数
int count = pstmt.getParameterMetaData().getParameterCount();
//把传递过来的占位符逐一赋值,setObject下标从1开始,数组下标从0开始,因此注意 i+1
for (int i = 0 ; i < count ; i++) {
pstmt.setObject(i+1,Parameters[i]);
}
//执行sql语句
pstmt.executeUpdate();
} catch (Exception e) {
throw new RuntimeException();
}finally {
//关闭资源
Conn.CloseAll(conn,pstmt);
}
}
/*
<T>代表此方法持有一个类型T,表示此方法是泛型方法,
T 代表此方法的返回值类型为类型T
Class<T>代表类泛型T的具体类型
查询结果可能是一个或者多个因此用List作为返回值类型。
*/
public <T> List<T> Query(String sql, Object[] Parameters,Class<T> clazz) {
conn = Conn.getConnection();
try{
pstmt = conn.prepareStatement(sql);
//判断占位符数组中是否有数据。
if (Parameters != null && Parameters.length > 0 ) {
//把传递过来的占位符逐一赋值.
for (int i = 0 ; i < Parameters.length ; i++) {
pstmt.setObject(i+1,Parameters[i]);
}
}
//将查询结果放入结果集
rs = pstmt.executeQuery();
//获取结果集中元数据的个数
int count = rs.getMetaData().getColumnCount();
//用于存放查询出来的结果,作为返回值。
List<T> list = new ArrayList <>();
//把结果集中的数据赋给t,相当于User user
T t = null;
while (rs.next()) {
//通过反射机制,利用传递过来的字节码对象,创建实例。
t = clazz.newInstance();
//对该实例属性进行逐一赋值,需要用到BeanUtils的jar文件
for (int i = 0 ;i < count ; i++) {
//获取元数据中第i个字段的名称,可以是Id,Username...
String name = rs.getMetaData().getColumnName(i);
//获取对应字段的值
Object value = rs.getObject(name);
//通过BeanUtils对t进行赋值。
//比如:User(t)的Id(name)为001(value)
BeanUtils.copyProperty(t,name,value);
}
//将t添加到list集合中
list.add(t);
}
return list;
}catch(Exception e){
throw new RuntimeException();
}finally {
//关闭资源
Conn.CloseAll(conn,pstmt,rs);
}
}
}
编写好BaseDao之后就可以进行具体应用了
加注释的地方是extends BaseDao之前的代码。
通过BaseDao可以提高代码复用率。
注意:在挑食过程中出现了
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
这个异常,再引入WEB-INF/lib/commons-logging-1.1.3.jar
之后就可以了。错误是找不到对应的类。
import com.cht.bean.User;
import com.cht.dao.BaseDao;
import com.cht.dao.USERDao;
import com.cht.utils.Conn;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class USERDaoimpl extends BaseDao implements USERDao{
public List QueryAll() {
// Connection conn = null;
// PreparedStatement pstmt = null;
// ResultSet rs = null;
// List<User> list = new ArrayList<User>();
// try {
// conn = Conn.getConnection();
// String sql = "select * from user";
// pstmt = conn.prepareStatement(sql);
// rs = pstmt.executeQuery();
// while (rs.next()) {
// User user = new User();
// user.setId(rs.getInt(1));
// user.setUsername(rs.getString(2));
// user.setPassword(rs.getString(3));
// list.add(user);
//
// }
// return list ;
// } catch (Exception e) {
// throw new RuntimeException();
// }finally {
// Conn.CloseAll(conn,pstmt,rs);
// }
String sql = "select * from user";
return super.Query(sql,null , User.class);
}
public User QueryById(int id ) {
// Connection conn = null;
// PreparedStatement pstmt = null;
// ResultSet rs = null;
//
// try {
// conn = Conn.getConnection();
// String sql = "select * from user where id=?";
// pstmt = conn.prepareStatement(sql);
// pstmt.setInt(1,id);
// rs = pstmt.executeQuery();
// User user = null;
// if (rs.next()) {
// user = new User();
// user.setId(rs.getInt(1));
// user.setUsername(rs.getString(2));
// user.setPassword(rs.getString(3));
// }
// return user ;
// } catch (Exception e) {
// throw new RuntimeException();
// }finally {
// Conn.CloseAll(conn,pstmt,rs);
// }
String sql = "select * from user where id = ?";
Object Parameters[] = {id};
return super.Query(sql,Parameters , User.class).get(0);
}
public void insert(User user) {
// Connection connection = null;
// PreparedStatement pstmt = null;
// try {
// connection = Conn.getConnection();
// String sql = "insert into user(id,username,password) values (?,?,?)";
// pstmt = connection.prepareStatement(sql);
// pstmt.setInt(1,user.getId());
// pstmt.setString(2,user.getUsername());
// pstmt.setString(3,user.getPassword());
// int count = pstmt.executeUpdate();
// System.out.println("共有"+count+"条记录添加");
// } catch (Exception e) {
// throw new RuntimeException();
// }finally {
// Conn.CloseAll(connection,pstmt);
// }
Object [] Parameters = {user.getId(),user.getUsername(),user.getPassword()};
String sql = "insert into user(id,username,password) values (?,?,?)";
super.Update(sql,Parameters);
}
public void update(int id,String username,String password) {
// Connection connection = null;
// PreparedStatement pstmt = null;
// try {
// connection = Conn.getConnection();
// String sql = "UPDATE USER SET username = ?,password = ? WHERE id = ?";
// pstmt = connection.prepareStatement(sql);
// pstmt.setString(1,"chihaotian");
// pstmt.setString(2,"CHT");
// pstmt.setInt(3,id);
// int count = pstmt.executeUpdate();
// System.out.println("共有"+count+"条记录更新!");
// } catch (Exception e) {
// throw new RuntimeException();
// }finally {
// Conn.CloseAll(connection,pstmt);
// }
Object [] Parameters = {username,password,id};
String sql = "UPDATE USER SET username = ?,password = ? WHERE id = ?";
super.Update(sql,Parameters);
}
public void delete(int id) {
// Connection connection = null;
// PreparedStatement pstmt = null;
// try {
// connection = Conn.getConnection();
// String sql = "DELETE from USER WHERE id = ?";
// pstmt = connection.prepareStatement(sql);
// pstmt.setInt(1,id);
// int count = pstmt.executeUpdate();
// System.out.println("共有"+count+"条记录删除!");
// } catch (Exception e) {
// throw new RuntimeException();
// }finally {
// Conn.CloseAll(connection,pstmt);
// }
Object [] a = {id};
String sql = "DELETE from USER WHERE id = ?";
super.Update(sql,a);
}
public boolean isUser(String username,String password) {
boolean flag = false;
Connection connection = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
String sql = "select * FROM user where username =? AND password = ?";
connection = Conn.getConnection();
pstmt = connection.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
rs = pstmt.executeQuery();
if (rs.next()) {
flag = true ;
}else{
flag = false;
}
return flag;
} catch (Exception e) {
throw new RuntimeException();
}finally {
Conn.CloseAll(connection,pstmt,rs);
}
}
}