javaWeb_JDBC_dao模式设计

Posted 德墨特尔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaWeb_JDBC_dao模式设计相关的知识,希望对你有一定的参考价值。


JDBC_DAO模式设计

1.什么是DAO?
DAO:data access Object,表示数据访问对象,访问数据信息的类,其中包含着对这一个对象在数据库中存储的时候的CRUD的操作。而不包含任何
业务逻辑相关的信息。Dao可以被子类继承或者是使用。


2.使用Dao模式的好处
在编写了dao模式以后,就使得代码变得模块化,更有利于代码的维护和升级。


3.如何编写dao模式的代码(即编写dao模式的可能存在方法)

//insert,update,delete操作都可以包含在其中
void update(String sql,Object... args);

//Query操作:查询一条相关的记录
<T> T get(Class<T> class,String sql,Object... args);

//Query操作:查询多条相关的记录,返回一组对象的某一个集合
<T> List<T> get(Class<T> class,String sql,Object... args);

//返回某一条记录的某一个字段值或者是某一个统计的值
<E> E getForValues(String sql,Object... args);


4.代码实现[*****]

(1).所需要的相关jar包
commons-beanutils-1.8.0.jar
commons-logging-1.2.jar
mysql-connector-java-5.1.38-bin.jar

(2).创建实体对象student
public class Student {
//id
private int id;
//姓名
private String studentName;
//年龄
private int age;
//籍贯
private String nativePlace;


public Student(){

}

public Student(int id,String studentName,int age,String nativePalace){
this.id = id;
this.studentName = studentName;
this.age = age;
this.nativePlace = nativePalace;
}
//省略getXxx()以及SetXxx()以及toString()

}

(3)操作的工具类:给出getConnection和释放资源的方法

public class JDBCTools {

/**
* 释放数据库资源的方法
*
* @param resultSet
* @param statement
* @param connection
*/
public static void releaseDB(ResultSet resultSet, Statement statement,
Connection connection) {

if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

}

/**
* 获取数据库连接的方法
*
*/
public static Connection getConnection() throws IOException,
ClassNotFoundException, SQLException {
// 0. 读取 jdbc.properties
/**
* 1). 属性文件对应 Java 中的 Properties 类 2). 可以使用类加载器加载 bin 目录(类路径下)的文件
*/
Properties properties = new Properties();
InputStream inStream = BeanUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(inStream);

// 1. 准备获取连接的 4 个字符串: user, password, jdbcUrl, driverClass
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String jdbcUrl = properties.getProperty("jdbcUrl");
String driverClass = properties.getProperty("driverClass");

// 2. 加载驱动: Class.forName(driverClass)
Class.forName(driverClass);

// 3. 调用
// DriverManager.getConnection(jdbcUrl, user, password)
// 获取数据库连接
Connection connection = DriverManager.getConnection(jdbcUrl, user,password);
return connection;
}


(4).DAO类

public class DAO {

//insert,update,delete操作都可以包含在其中
public void update(String sql,Object... args){
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = (Connection) JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);

for(int i = 0 ;i<args.length;i++){
preparedStatement.setObject(i+1, args[i]);
}

preparedStatement.executeUpdate();

} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCTools.releaseDB(null, preparedStatement, connection);
}

}




//Query操作:查询一条相关的记录
public <T> T get(Class<T> clazz,String sql,Object ... args){
List<T> result = getForList(clazz, sql, args);
if(result.size() > 0){
return result.get(0);
}

return null;
}





//Query操作:查询多条相关的记录,返回一组对象的某一个集合
public <T> List<T> getForList(Class<T> clazz,String sql,Object ... args){
List<T> list = new ArrayList<T>();

Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;

try {
//1. 得到结果集
connection = (Connection) JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);

for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}

resultSet = preparedStatement.executeQuery();

//2. 处理结果集, 得到 Map 的 List, 其中一个 Map 对象
//就是一条记录. Map 的 key 为 reusltSet 中列的别名, Map 的 value
//为列的值.
List<Map<String, Object>> values = handleResultSetToMapList(resultSet);

//3. 把 Map 的 List 转为 clazz 对应的 List
//其中 Map 的 key 即为 clazz 对应的对象的 propertyName,
//而 Map 的 value 即为 clazz 对应的对象的 propertyValue
list = transfterMapListToBeanList(clazz, values);

} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(resultSet, preparedStatement, connection);
}
return list;
}


/**
* 获取结果集的 ColumnLabel 对应的 List
*
* @param rs
* @return
* @throws SQLException
*/
private List<String> getColumnLabels(ResultSet rs) throws SQLException {
List<String> labels = new ArrayList<>();

ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 0; i < rsmd.getColumnCount(); i++) {
labels.add(rsmd.getColumnLabel(i + 1));
}

return labels;
}


/**
* 处理结果集, 得到 Map 的一个 List, 其中一个 Map 对象对应一条记录
*
* @param resultSet
* @return
* @throws SQLException
*/
public List<Map<String, Object>> handleResultSetToMapList(
ResultSet resultSet) throws SQLException {
// 5. 准备一个 List<Map<String, Object>>:
// 键: 存放列的别名, 值: 存放列的值. 其中一个 Map 对象对应着一条记录
List<Map<String, Object>> values = new ArrayList<>();

List<String> columnLabels = getColumnLabels(resultSet);
Map<String, Object> map = null;

// 7. 处理 ResultSet, 使用 while 循环
while (resultSet.next()) {
map = new HashMap<>();

for (String columnLabel : columnLabels) {
Object value = resultSet.getObject(columnLabel);
map.put(columnLabel, value);
}

// 11. 把一条记录的一个 Map 对象放入 5 准备的 List 中
values.add(map);
}
return values;
}


public <T> List<T> transfterMapListToBeanList(Class<T> clazz,
List<Map<String, Object>> values) throws InstantiationException,
IllegalAccessException, InvocationTargetException {

List<T> result = new ArrayList<>();

T bean = null;

if (values.size() > 0) {
for (Map<String, Object> m : values) {
bean = clazz.newInstance();
for (Map.Entry<String, Object> entry : m.entrySet()) {
String propertyName = entry.getKey();
Object value = entry.getValue();

BeanUtils.setProperty(bean, propertyName, value);
}
// 13. 把 Object 对象放入到 list 中.
result.add(bean);
}
}

return result;
}

//返回某一条记录的某一个字段值或者是某一个统计的值
@SuppressWarnings("unchecked")
public <E> E getForValues(String sql,Object... args){
//1.得到结果集,结果集应该只有一行或者是一列
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;

try {
//1. 得到结果集
connection = (Connection) JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);

for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}

resultSet = preparedStatement.executeQuery();

if(resultSet.next()){
return (E) resultSet.getObject(1);
}

}catch (Exception e) {
e.printStackTrace();
}finally{
JDBCTools.releaseDB(null, preparedStatement, connection);
}

return null;
}

}


(5).测试类
public static void main(String[] args) {
DAO dao = new DAO();
String sql ="select * from student where studentName=?";
Student st = dao.get(Student.class, sql, "李四");
System.out.println(st);
System.out.println("------------------");
String sql1 = "select * from student";
List<Student> lt= dao.getForList(Student.class, sql1);
System.out.println(lt.toString());
System.out.println("----------");
String sql2 = "select nativePlace from student where studentName=?";
String place = dao.getForValues(sql2, "李四");
System.out.println("李四原籍:"+ place);
}

//输出结果
Student [id=2, studentName=李四, age=15, nativePlace=宋朝]
------------------
[Student [id=2, studentName=李四, age=15, nativePlace=宋朝], Student [id=5, studentName=王五, age=18, nativePlace=中国云南]]
----------
李四原籍:宋朝

 































































































































































































































































































以上是关于javaWeb_JDBC_dao模式设计的主要内容,如果未能解决你的问题,请参考以下文章

C#设计模式--桥接模式

23种设计模式总结

设计模式 设计模式概述

Java设计模式-创建型设计模式-原型模式

iOS中都有啥设计模式?各个设计模式的作用

设计模式