DAO(Data Access Object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。
在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。
J2EE开发人员使用数据访问对象(DAO)设计模式把底层的数据访问逻辑和高层的商务逻辑分开,使DAO模式能够更加专注于编写数据访问代码。DAO模式的好处是可以简化大量的代码编写和增加程序的可移植性。
一个典型的DAO实现有下列几个组件:
- VO(value object)类:值对象,即POJO,普通JAVABEAN 或者是传输对象(TO),
是一个包含属性与表中字段完全对应的类,在该类中提供了setter和getter方法来设置并获取该类中的属性。 - DAO接口:定义了所有的用户操作,如添加记录、修改、删除、查找(CRUD)等,不过是接口,定义的都是抽象方法,需要实现类去具体实现这些方法。
- DAO实现类:实现了DAO接口,并实现了DAO接口中所有抽象方法,在DAO实现类中通过数据库连接类操作数据库。
- DAO工厂类:在没有DAO工厂类的情况下,必须通过创建DAO实现类的实例来完成数据库操作。这里就必须知道具体的子类,对于后期的修改非常不便。使用DAO工厂类就能解决这个问题,可以通过该DAO工厂类的一个静态方法来获得实现类的实例。这里如果需要替换DAO实现类,只需要修改DAO工厂类中的方法代码,而不必修改所有的操作数据库代码。
- 数据库连接类 :主要是连接数据库并获得对象,通过使用数据库连接类,可以大大简便开发,在需要进行数据库连接时,只需创建该类的实例,并调用其中的方法就可以获得数据库连接对象,不必再进行重复的操作。
一个简单的DAO模式实例:
在编写代码之前,首先要配置好mysql数据库。可参见 http://jingyan.baidu.com/article/597035521d5de28fc00740e6.html
该项目共四个包,每个包都有一个类或一个接口。
Package:bean ——Student类
1 package bean; 2 public class Student{ 3 private int id; 4 private String name; 5 6 public void setId(int id){ 7 this.id = id; } 8 9 public int getId(){ 10 return id;} 11 12 public void setName(String name){ 13 this.name = name; } 14 15 public String getName(){ 16 return name; } 17 }
Package:connection ——DataBaseConnection类
1 package connection; 2 3 import java.sql.*; 4 5 public class DataBaseConnection{ 6 private final String DBDriver ="com.mysql.jdbc.Driver"; 7 private final String DBURL ="jdbc:mysql://localhost:3306/student"; 8 private final String DBUSER ="root"; 9 private final String DBPASSWORD =""; 10 private Connection conn = null; 11 //构造器 12 public DataBaseConnection(){ 13 try{ 14 Class.forName(DBDriver); 15 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); 16 } 17 catch(Exception e){ } 18 } 19 20 //获得连接 21 public Connection getConnection(){ 22 return this.conn; } 23 24 //关闭连接 25 public void close() throws SQLException{ 26 this.conn.close(); } 27 }
Package:dao ——StudentDAO类
1 package dao; 2 import bean.*; 3 import java.util.*; 4 public interface StudentDAO{ 5 public void insert(Student s); 6 public void update(Student s); 7 public void delete(int id); 8 public Student findById(int id); 9 public List<Student> findAll(); 10 }
Package:daoIMP ——StudentDAOIMP类
1 package daoIMP; 2 import bean.Student; 3 import dao.StudentDAO; 4 import java.sql.*; 5 import java.util.ArrayList; 6 import java.util.List; 7 import connection.DataBaseConnection; 8 9 public class StudentDAOIMP implements StudentDAO{ 10 // 添加操作 11 public void insert(Student s){ 12 String sql = "INSERT INTO student (id, name) values (?,?)"; 13 PreparedStatement pstmt = null; 14 DataBaseConnection conn = null; 15 //针对数据库的具体操作 16 try{ 17 conn = new DataBaseConnection(); 18 19 pstmt = conn.getConnection().prepareStatement(sql); 20 pstmt.setInt(1,s.getId()); 21 pstmt.setString(2,s.getName()); 22 pstmt.executeUpdate(); 23 pstmt.close(); 24 conn.close(); 25 } 26 catch(Exception e){ } 27 } 28 29 public void update(Student s){ 30 String sql = "UPDATE student SET name =? Where id = ? "; 31 PreparedStatement pstmt = null; 32 DataBaseConnection conn = null; 33 //针对数据库的具体操作 34 try{ 35 conn = new DataBaseConnection(); 36 pstmt = conn.getConnection().prepareStatement(sql); 37 pstmt.setString(1,s.getName()); 38 pstmt.setInt(2,s.getId()); 39 pstmt.executeUpdate(); 40 pstmt.close(); 41 conn.close(); 42 } 43 catch(Exception e){ } 44 } 45 46 public void delete(int id){ 47 String sql = "DELETE FROM student WHERE id = ? "; 48 PreparedStatement pstmt = null; 49 DataBaseConnection conn = null; 50 try{ 51 conn = new DataBaseConnection(); 52 pstmt = conn.getConnection().prepareStatement(sql); 53 pstmt.setInt(1, id); 54 pstmt.executeUpdate(); 55 pstmt.close(); 56 conn.close(); 57 } 58 catch(Exception e) { } 59 } 60 61 public List<Student> findAll(){ 62 List<Student> all = new ArrayList<Student>(); 63 Student student = null; 64 String sql = "SELECT id,name FROM student "; 65 PreparedStatement pstmt = null; 66 DataBaseConnection conn = null; 67 try{ 68 conn = new DataBaseConnection(); 69 pstmt = conn.getConnection().prepareStatement(sql); 70 ResultSet rs = pstmt.executeQuery(); 71 while(rs.next()){ 72 student = new Student(); 73 student.setId(rs.getInt(1)); 74 student.setName(rs.getString(2)); 75 all.add(student); 76 } 77 rs.close(); 78 pstmt.close(); 79 conn.close(); 80 } 81 catch(Exception e) { } 82 return all; 83 } 84 85 public Student findById(int id){ 86 Student student = null; 87 String sql = "SELECT id, name FROM student Where id = ? "; 88 PreparedStatement pstmt = null; 89 DataBaseConnection conn = null; 90 //针对数据库的具体操作 91 try{ 92 conn = new DataBaseConnection(); 93 pstmt = conn.getConnection().prepareStatement(sql); 94 pstmt.setInt(1, id); 95 ResultSet rs = pstmt.executeQuery(); 96 if(rs.next()){ 97 student = new Student(); 98 student.setId(rs.getInt(1)); 99 student.setName(rs.getString(2)); 100 } 101 rs.close(); 102 pstmt.close(); 103 conn.close(); 104 } 105 catch(Exception e){ } 106 return student; 107 } 108 }
然后编写测试类,同样存放一个包中。
Package:test ——Test类
1 package main; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import bean.Student; 7 import daoIMP.StudentDAOIMP; 8 9 public class Test { 10 11 public static void main(String[] args) { 12 StudentDAOIMP sd = new StudentDAOIMP(); 13 List<Student> li = new ArrayList<Student>(); 14 li = sd.findAll(); 15 for(Student stu : li){ 16 System.out.println(stu.getName()); 17 } 18 } 19 }
最后将运行结果和数据库student表进行比对即可。