简单的DAO设计模式
这两天学习到了DAO(Data Access Object 数据存取对象)设计模式。想谈谈自己的感受,刚开始接触是感觉有点难,觉得自己逻辑理不清,主要是以前学的知识比较零散没有很好的把它们结合起来运用。我个人比较喜欢有挑战的东西,比如项目,在学iOS阶段做了个项目感觉那段时间自己的思维和逻辑提升很快。我个人认为遇到困难不要怕,而应该感到高兴,因为只有遇到了困难才知道自己的不足,当困难解决的时候你必定会收获不少,困难解决时一阵欣喜必会涌上心头。也许是很久没遇到逻辑性很强的东西了,所以刚接触到DAO模式感觉还是有点懵,但是当我花时间好好梳理的时候,其实发现也并没有想象的那么难,虽然也遇到了困难,但是困难解决时感觉一阵欣喜涌上心头。DAO模式主要是分层原理,主要有数据库访问层、DAO层(主要是转换器的作用)、服务层、客户层(用户的操作等功能);每一层各司其职互不干涉,当维护或者新增功能时会比较方便,不需要更改很多的代码,只需要实现公共的接口方法,如果需要实现特有的方法,就定义一个接口继承公共的接口在里面定义特有的方法然后实现即可。这是我个人对DAO模式的理解,如果有不恰当的地方希望大神不要喷,希望多指教。
下面是简单DAO模式的代码
定义一个公共的接口实现增、删、改
public interface BaseDao { public int executeUpdate(String sql,Object[] prame);
}
定义一个用户类,里面实现了封装,会了序列化,还实现了Serializable接口,这是一个特殊的接口,里面没有方法,只是标记作用,在数据库建表就靠自己了。
public class master implements Serializable { /**
*
*/
private static final long serialVersionUID = 1L;
private int id;
private String loginid;
private String passWord;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLoginid() {
return loginid;
}
public void setLoginid(String loginid) {
this.loginid = loginid;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
用户
用户特有的方法:只实现了登录功能用到查找的方法,其他没实现,所以上面的接口方法并没有用到,只是为了更好的理解而已
public interface MaterDao { /**
* 根据对象进行查询*/
public master findMaster(master master);
}
服务层的公共接口类对它的实现
public interface MasterServer {
//用于访问Dao的实现类
public boolean login(master ma);
}
public class MasterServerImpl implements MasterServer{ @Override
public boolean login(master ma) {
boolean isLoginid=false;
MaterDao md=new MasterDaoMysqlImpl();
master ma2=md.findMaster(ma);
// System.out.println(ma2);
if(null!=ma2){
isLoginid=true;
}
return isLoginid;
}
}
服务公共接口的实现
访问数据库的帮助类,里面实现了访问数据库和关闭
public class Dbutils { //帮助类
private static String driverClass="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql:///day02";
private static String user="root";
private static String password="root"; static{
//加载驱动
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获得connection对象
public static Connection getConn() throws SQLException{ return DriverManager.getConnection(url, user, password);
}
//关闭资源
public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
if(null!=rs){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(null!=stmt){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(null!=conn){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
访问数据库的帮助类
用户DAO的实现,主要是访问数据库
public class MasterDaoMysqlImpl extends BaseDaoImpl implements MaterDao{ @Override
public master findMaster(master master) { Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
master ma2=null;
String sql="SELECT * FROM master WHERE loginid=? AND passWord=?"; try {
conn=Dbutils.getConn();
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,master.getLoginid());
pstmt.setString(2,master.getPassWord());
rs=pstmt.executeQuery(); if(rs.next()){
ma2=new master();
ma2.setId(rs.getInt("id"));
ma2.setLoginid(rs.getString("loginid"));
ma2.setPassWord(rs.getString("passWord"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
Dbutils.closeAll(rs, pstmt, conn);
}
return ma2;
}
}
用户Dao的实现
最后就可以实现用户的登录功能,用一个测试类
public class TestMaster { @Test
public void testLoginid(){
Scanner scanner = new Scanner(System.in,"UTF-8"); // 1.输入用户名
System.out.println("请输入用户名:");
String loginid = scanner.next(); // 2.输入密码
System.out.println("请输入密码:");
String password = scanner.next(); MasterServer ms=new MasterServerImpl(); master ma=new master();
ma.setLoginid(loginid);
ma.setPassWord(password);
boolean isLoginid=ms.login(ma); if(isLoginid){
System.out.println("登录成功!");
}else{
System.out.println("账号或密码错误!");
}
}
}
测试用户登录类
这只是本人这两天对DAO模式的理解,其实理解并不深刻,希望大家多多指教。