数据访问接口 DAO 关键回顾

通过一个周的学习(大概由于初学的原因,才导致花了这么多时间),大致的将一个初级的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 就可以进一步完善  由于本人学习的知识比较肤浅 ,期望读者不吝赐教才好!同时 很多错误希望不吝指出,谢谢!

 

你可能感兴趣的:(数据访问接口 DAO 关键回顾)