数据访问接口 DAO 关键回顾

本文介绍了一种简单的DAO设计与实现方法,通过五个核心包(dao、db、eneity、mapping及测试包)实现了基本的数据库操作功能。该设计涵盖了数据库连接管理、SQL执行、结果集映射等关键步骤。

通过一个周的学习(大概由于初学的原因,才导致花了这么多时间),大致的将一个初级的DAO 写出来了 当然这里面知识很少甚至没有设计到 框架知识, 我想 如果要设计框架的话 ,还需要进一步学习。为了以后自己的回顾和总结,于是发表在了自己的Blog

一共写了五个包:

1.dao包:一个dao对应了一个数据库的一张表,其里面主要包括了对一张表的操作(增,删、改),原理还是调用下面的包里面的DBManager类的操作方法 如:下面是一个dao

/** * @author Jeelon * DAO 对实体类Users的操作(增 删 改 查) */ package com.Jeelon.dao; import java.util.List; import com.Jeelon.db.DBManager; import com.Jeelon.eneity.Users; import com.Jeelon.mapping.UsersMapping; public class UserDAO { DBManager manager = new DBManager(); /** * @author Jeelon * @param user:传进来的Users实例 * @return boolean 插入是否成功 */ public boolean save(Users user) { String sql = "insert into users (userName,userTrueName,userPassword,userEmail,userTelephont,userAddress,userPostCode,userGrade)" + "values(?,?,?,?,?,?,?,?)"; Object[] args = { user.getUserName(), user.getTureName(), user.getPassWord(), user.getUserEmail(), user.getUserTelephone(), user.getUserAddress(), user.getUserPostCode(), user.getUserGrade() }; return (manager.update(sql, args) == 1); } /** * @author Jeelon * @param user:传进来的Users实例 * @return boolean 修改是否成功 */ public boolean update(Users user) { String sql = "update users set userName=?,userTrueName=?,userPassword=?,userEmail=?,userTelephont=?,userAddress=?,userPostCode=?,userGrade=? where userID=?"; Object args[] = { user.getUserName(), user.getTureName(), user.getPassWord(), user.getUserEmail(), user.getUserTelephone(), user.getUserAddress(), user.getUserPostCode(), user.getUserGrade(), user.getUserID() }; return (manager.update(sql, args) == 1); } /** * @author Jeelon * @param userId :要删除的用户ID * @return 返回一个布尔类型 是否删除成功 */ public boolean del(int userId) { String sql = "delete from users where userID=?"; Object args[] = { userId }; return (manager.update(sql, args) == 1); } /** * @author Jeelon * @param userId :根据传进来的用户ID来查询用户信息 * @return List :返回一个List集合 里面存放Users信息 */ public List<Users> findById(int userId) { String sql = "select " + "userID,userName,userTrueName," + "userPassword,userEmail,userTelephont," + "userAddress,userPostCode,userGrade " + " from users where userID=?"; Object[] args = new Object[]{userId}; List<Users> list = manager.query(sql,new UsersMapping(),args); return list; } public List<Users> findAll() { String sql = "select " + "userID,userName,userTrueName," + "userPassword,userEmail,userTelephont," + "userAddress,userPostCode,userGrade " + " from users"; List<Users> list = manager.query(sql, new UsersMapping(), new Object[0]); return list; } }

2.db包:主要代码皆在此包里面,包括三个类,一个DBManager类,Config接口(主要是连接数据库的参数,为了符合面向接口编程故此定义了连接数据库的参数再此接口中),ResultSetEneityMapping(结果集对应实体的映射)

下面是Congif中的代码:

package com.Jeelon.db; public interface Config { public static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; public static final String URL = "jdbc:sqlserver://localhost:1433;DatabaseName=Shopping"; public static final String NAME = "sa"; public static final String PSW = "630923"; }

通过定义连接数据库接口参数 下面更简介的写下了DBManager:

package com.jeelon.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; public class DBManager { private static Connection connection = null; private static DataSource dataSource; private DBManager(){ } /*public static Connection getConnect() throws ClassNotFoundException,SQLException{ Class.forName(Config.DRIVER); connection = DriverManager.getConnection(Config.URL+Config.DBNAME,"sa",Config.PSW); return connection; }*/ /** * Tomcat连接池获得Connection */ /*public static Connection getConnect(){ try { Context context = new InitialContext(); context = (Context)context.lookup("java:comp/env"); dataSource = (DataSource)context.lookup("jdbc/pool"); connection = dataSource.getConnection(); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return connection; }*/ /**@author 冯旭 * Proxool连接池获得Connection */ public static Connection getConnect(){ try { connection = DriverManager.getConnection("proxool.Jeelon"); } catch (SQLException e) { e.printStackTrace(); } return connection; } }

DBManager主要获得数据库连接 以上是从Proxool连接池中获得连接

JdbcTemplate类主要是定义了操作数据库的共同方法,以便dao的调用

package com.jeelon.db; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.Vector; public class JdbcTemplate { private Connection connection = null; private PreparedStatement psta = null; ResultSet result = null; /** * 用来执行 insert delete update 语句 * @author Jeelon * * @param sql 要执行的sql语句 * @param values 参数 * @return 受影响的行数 */ public int update(String sql, Object... values) { int row = 0; try { connection = DBManager.getConnect(); psta = connection.prepareStatement(sql); for (int i = 0; i < values.length; i++) { psta.setObject(i + 1, values[i]); } row = psta.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { this.close(); } return row; } /** * 用来执行查询sql语句 * @param sql 要查询的sql语句 * @param mapping 映射实体对象 * @param values sql参数列表 * @return 返回一个集合 里面存放实体对象 */ public List Query(String sql,ResultMappingEntity mapping,Object...values){ List bookInfo = new Vector(); try { connection = DBManager.getConnect(); psta = connection.prepareStatement(sql); for (int i = 0; i < values.length; i++) { psta.setObject(i + 1, values[i]); } result = psta.executeQuery(); while(result.next()){ bookInfo.add(mapping.mapping(result)); } } catch (SQLException e) { e.printStackTrace(); }finally{ this.close(); } return bookInfo; } /** * 得到某个表符合条件的全部数据条数 * @param sql sql语句 * @return 得到某个表符合条件的全部数据条数 */ public int getPageCount(String sql){ int rowCount = 0 ; try { connection = DBManager.getConnect(); psta = connection.prepareStatement(sql); result = psta.executeQuery(); if(result.next()){ rowCount = result.getInt(1); } } catch (SQLException e) { e.printStackTrace(); }finally{ this.close(); } return rowCount; } /** * @author Jeelon * @param sql 根据sql查询用户信息 * @param password 用户密码 * @return 布尔类型 表示验证登录信息是否正确 */ public boolean isLoginSucceed(String sql ,String password, Object...values){ boolean isSuccss = false ; String customerName = null ; try { connection = DBManager.getConnect(); psta = connection.prepareStatement(sql); for(int i = 0; i < values.length; i++){ psta.setObject(i+1, values[i]); } result = psta.executeQuery(); if(result.next()){ customerName = result.getString(1).trim(); if(customerName.equals(password)){ isSuccss = true ; }else{ isSuccss = false ; } }else{ isSuccss = false; } } catch (SQLException e) { e.printStackTrace(); }finally{ this.close(); } return isSuccss; } /** * 关闭资源 */ public void close() { try { if (result != null) { result.close(); result = null; } if (psta != null) { psta.close(); psta = null; } if (connection != null) { connection.close(); connection = null; } } catch (Exception e) { e.printStackTrace(); } } }

之后是ResultSetEneityMapping 将得到的结果集 转化为实体(对应数据库表数据)

/** * @author Jeeon * 接口 把结果集转换为对应的实体类 */ package com.Jeelon.db; import java.sql.ResultSet; import java.sql.SQLException; public interface ResultSetEneityMapping { public Object mapping(ResultSet result) throws SQLException; }

3.eneity包(实体类) 里面存放实体类对应数据库表中的数据 由于只是个例子 代码很简单 多是又IDE自动生成 在此就不打算列出 里面主要包括定义私有字段,三个构造方法,一个是无参 一个是有参但无主键的够着方法, 一个是带全参的构造方法 还有就是equals方法 ToString方法,get set 访问器。

4.mapping包:其中一个dao对应一个mapping类 主要是用于实现ResultSetEneityMapping 接口 将得到结果集转换为对应实体

下面列出一个:

/** * @author Jeelon * 实现ResultSetEneityMapping接口 */ package com.Jeelon.mapping; import java.sql.ResultSet; import java.sql.SQLException; import com.Jeelon.db.ResultSetEneityMapping; import com.Jeelon.eneity.Users; public class UsersMapping implements ResultSetEneityMapping{ public Object mapping(ResultSet result) throws SQLException { int i = 1 ; Users user = new Users( result.getInt(i ++),result.getString(i ++),result.getString(i ++), result.getString(i ++),result.getString(i ++),result.getString(i ++), result.getString(i ++),result.getString(i ++),result.getInt(i ++)); return user; } }

5.写了一个测试包,用于对写下的dao进行测试 。主要是对dao的调用 由于代码较为简单 再次也不列出

我认为 要更好的完善的DAO 还需要涉及到更新的只是 就我个人而言 就如云工厂 旺旺老师说 加上框架 DAO 就可以进一步完善 由于本人学习的知识比较肤浅 ,期望读者不吝赐教才好!同时 很多错误希望不吝指出,谢谢!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值