java web dao_javaWeb_JDBC_dao模式设计

本文介绍了Java Web中的DAO(Data Access Object)模式,详细阐述了DAO的作用、好处,以及如何编写DAO模式的代码,包括增删改查等基本操作。同时,提供了实体对象、数据库操作工具类和DAO类的示例代码,展示了如何通过DAO模式进行数据库交互。
摘要由CSDN通过智能技术生成

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 get(Class class,String sql,Object... args);

//Query操作:查询多条相关的记录,返回一组对象的某一个集合

List get(Class class,String sql,Object... args);

//返回某一条记录的某一个字段值或者是某一个统计的值

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

preparedStatement.setObject(i+1, args[i]);

}

preparedStatement.executeUpdate();

} catch (Exception e) {

e.printStackTrace();

}finally{

JDBCTools.releaseDB(null, preparedStatement, connection);

}

}

//Query操作:查询一条相关的记录

public T get(Class clazz,String sql,Object ... args){

List result = getForList(clazz, sql, args);

if(result.size() > 0){

return result.get(0);

}

return null;

}

//Query操作:查询多条相关的记录,返回一组对象的某一个集合

public List getForList(Class clazz,String sql,Object ... args){

List list = new ArrayList();

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> 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 getColumnLabels(ResultSet rs) throws SQLException {

List 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> handleResultSetToMapList(

ResultSet resultSet) throws SQLException {

// 5. 准备一个 List>:

// 键: 存放列的别名, 值: 存放列的值. 其中一个 Map 对象对应着一条记录

List> values = new ArrayList<>();

List columnLabels = getColumnLabels(resultSet);

Map 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 List transfterMapListToBeanList(Class clazz,

List> values) throws InstantiationException,

IllegalAccessException, InvocationTargetException {

List result = new ArrayList<>();

T bean = null;

if (values.size() > 0) {

for (Map m : values) {

bean = clazz.newInstance();

for (Map.Entry 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 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 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=中国云南]]

----------

李四原籍:宋朝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值