版权声明:chaizepeng https://blog.csdn.net/chaizepeng/article/details/86693828
通常真正实际开发时,dao层虽然会涉及很多实体,但是可以借助泛型、反射、一些简单工具类来封装一些通用的查询、更新等操作的方法,下面介绍两种方法
第一种:借助元数据类ResultSetMetaData来实现方法的封装,使用Map或者List集合来实现数据的封装(自己感觉使用Map封装数据比实体好),代码如下:
public class BaseDao {
private Connection connection;
public BaseDao() {
connection = getConnection();
}
/**
* 获取数据连接
*/
public Connection getConnection() {
Connection connection = null;
try {
//获取数据源对象
ComboPooledDataSource dataSource = new ComboPooledDataSource("c3p0-config.xml");
//通过数据源获取连接
connection = dataSource.getConnection();
System.out.println(connection);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("获取数据库连接失败!");
}
return connection;
}
/**
* 添、改、删操作
* @param sql sql语句
* @param objects 占位符需传递的参数
* @return
*/
public int update(String sql, Object ...objects) {
int flag = 0;
PreparedStatement pst = null;
try {
pst = connection.prepareStatement(sql);
for (int i = 0 ; i <objects.length ; i++){
pst.setObject(i+1, objects[i]);
}
flag = pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("更新操作失败!");
}finally{
if (pst != null) {
try {
pst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return flag;
}
/**
* 将查询结果集信息封装成一个Map
* @param sql
* @param objects
* @return
*/
public List<Map> getResultMapList(String sql , Object ...objects) {
PreparedStatement pst = null;
ResultSet result = null;
List<Map> list = new ArrayList<>();
try {
pst = connection.prepareStatement(sql);
for (int i = 0 ; i <objects.length ; i++){
pst.setObject(i+1, objects[i]);
}
result = pst.executeQuery();
while(result.next()){
Map<String, Object> map = new HashMap<>();
ResultSetMetaData metaData = result.getMetaData();
int count = metaData.getColumnCount();
for (int i = 0; i < count; i++) {
String label = metaData.getColumnLabel(i+1);
map.put(label, result.getObject(i+1));
}
list.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("查询操作失败!");
}finally{
try {
if (pst != null) {
pst.close();
}
if (result != null) {
result.close();
}
}catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
/**
* 将查询结果集信息封装成一个Map
* @param sql
* @param objects
* @return
*/
public Map getResultMap(String sql , Object ...objects) {
List<Map> list = getResultMapList(sql, objects);
return list != null ? list.get(0) : null;
}
public static void main(String[] args) {
BaseDao dao = new BaseDao();
String sql = "UPDATE USER SET UNAME = ? WHERE ID = ?";
dao.update(sql, "zhangsan" , 6);
String sql2 = "DELETE FROM USER WHERE ID > ?";
dao.update(sql2 , 4);
String sql3 = "INSERT INTO USER (UNAME , PASSWORD) VALUES (? ,?)";
dao.update(sql3 , "樊少皇" , "123456");
String sql4 = "SELECT ID , UNAME , PASSWORD , STATUS FROM USER WHERE ID = ?";
Map map = dao.getResultMap( sql4, 20007);
String sql5 = "SELECT ID , UNAME , PASSWORD , STATUS FROM USER LIMIT ?";
List<Map> resultMapList = dao.getResultMapList(sql5, 10);
System.out.println(resultMapList);
}
}
第二种:直接借助工具类dbutils实现封装,代码如下:
public class BaseDao {
private Connection connection;
private QueryRunner queryRunner;
public BaseDao() {
connection = getConnection();
queryRunner = new QueryRunner();
}
/**
* 获取数据连接
*/
public Connection getConnection() {
Connection connection = null;
try {
//获取数据源对象
ComboPooledDataSource dataSource = new ComboPooledDataSource("c3p0-config.xml");
//通过数据源获取连接
connection = dataSource.getConnection();
System.out.println(connection);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("获取数据库连接失败!");
}
return connection;
}
/**
* 添、改、删操作
* @param sql sql语句
* @param objects 占位符需传递的参数
* @return
*/
public int update(String sql, Object ...objects) {
int flag = 0;
try {
flag = queryRunner.execute(connection, sql, objects);
} catch (SQLException e1) {
e1.printStackTrace();
}
return flag;
}
/**
* 将查询结果集信息封装成一个Map
* @param sql
* @param objects
* @return
*/
public List<Map<String, Object>> getResultMapList(String sql , Object ...objects) {
List<Map<String, Object>> list = null;
try {
list = queryRunner.query(connection, sql, new MapListHandler(), objects);
} catch (SQLException e1) {
e1.printStackTrace();
}
return list;
}
/**
* 将查询结果集信息封装成一个Map
* @param sql
* @param objects
* @return
*/
public Map<String, Object> getResultMap(String sql , Object ...objects) {
Map<String, Object> map = null;
try {
map = queryRunner.query(connection, sql, new MapHandler(), objects);
} catch (SQLException e) {
e.printStackTrace();
}
return map;
}
public static void main(String[] args) {
BaseDao dao = new BaseDao();
String sql = "UPDATE USER SET UNAME = ? WHERE ID = ?";
dao.update(sql, "zhangsan" , 1);
String sql2 = "DELETE FROM USER WHERE ID > ?";
dao.update(sql2 , 4);
String sql3 = "INSERT INTO USER (UNAME , PASSWORD) VALUES (? ,?)";
dao.update(sql3 , "刘德华" , "123456");
String sql4 = "SELECT count(1) count FROM USER ";
Map map = dao.getResultMap( sql4);
System.out.println(map);
String sql5 = "SELECT ID , UNAME , PASSWORD , STATUS FROM USER LIMIT ?";
List<Map<String, Object>> resultMapList = dao.getResultMapList(sql5, 10);
System.out.println(resultMapList);
}
}