概念
一般的信息系统的开发架构如下
- 客户层:客户端浏览器
- 显示层:利用jsp和Servlet进行页面显示
- 业务层:对数据层的原子性DAO操作进行整合
- 数据层:对数据库进行原子操作,例如增删改查等等
- 数据库
DAO就是Data Access Object的简称,主要就是对数据进行操作,对应上面的层级实时数据层。 在数据操作过程中,主要是以面向接口编程为主。一般将DAO划分为下面几个部分:
- VO(Value Object):JAVABean,主要由属性和属性的getter/setter方法组成,命名一般于表名一致,属性也与表中的属性一致
- DatabaseConnection:用于打开和关闭数据库的类
- DAO接口:用于声明数据库的操作,定义数据库的原子性操作,例如增删改查等,命名如UserDao,有时在前面加上I如IUserDao表示是一个接口
- DAOImpl:实现DAO接口的类:但是不负责数据库的打开和关闭,命名如UserDaoImpl
- DAOProxy:也是实现DAO接口,主要完成数据库的打开和关闭,命名如UserService或者UserDaoProxy
- DAOFactory:工厂类,通过getInstance()取得DAO的实例化对象,命名为XxxFactory,如UserDaoFactory
DAO开发
项目结构如下图
User.java
import java.sql.Date;
public class User {
String name;
Date birthday;
int sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
}
db-config.properties
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/tian?characterEncoding=utf-8
user=root
password=123456
DBConnection.java
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
public class DBConnection {
private static String driverClass = null;
private static String url = null;
private static String user = null;
private static String password = null;
private Connection conn = null;
static {
InputStream inputStream = DBConnection.class.getClassLoader().getResourceAsStream("db-config.properties");
Properties properties = new Properties();
try {
properties.load(inputStream);
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
} catch (IOException e) {
throw new ExceptionInInitializerError("Load 'SqlConfig.properties' Error!!!");
}
}
public DBConnection() throws Exception{
try {
Class.forName(driverClass);
this.conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
throw e;
}
}
public Connection getConnection(){
return this.conn;
}
public void close() throws Exception{
if (this.conn!=null) {
try {
this.conn.close();
} catch (Exception e) {
throw e;
}
}
}
}
UserDao.java
import java.util.List;
import pojo.User;
public interface UserDao {
/**
* 加入一个用户
* @param user 要添加的对象
* @return 是否增加成功的标记
* @throws Exception 如果有异常将直接抛出
*/
public boolean addUser(User user) throws Exception;
/**
* 列出所有的用户
* @return 所有的用户
* @throws Exception 失败将抛出异常
*/
public List<User> listAll() throws Exception;
}
UserDaoImpl.java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.List;
import pojo.User;
public class UserDaoImpl implements UserDao{
private Connection conn = null;
private PreparedStatement pstmt;
public UserDaoImpl(Connection conn) {
this.conn = conn;
}
@Override
public boolean addUser(User user) throws Exception {
boolean flag = false;
String sql = "insert into user(xxx,xxx,xxx) values(?,?,?)";
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setString(1, user.getName());
this.pstmt.setDate(2, user.getBirthday());
this.pstmt.setInt(3, user.getSex());
if (this.pstmt.executeUpdate()>0) {
flag = true;
}
//关闭
this.pstmt.close();
return flag;
}
@Override
public List<User> listAll() throws Exception {
//实现....
return null;
}
}
UserService.java
import java.util.List;
import dao.UserDao;
import dao.UserDaoImpl;
import db.DBConnection;
import pojo.User;
public class UserService implements UserDao{
private DBConnection dbconn = null;
private UserDao dao = null;
public UserService () throws Exception{
this.dbconn = new DBConnection();
//用dao来代理daoimpl
this.dao = new UserDaoImpl(this.dbconn.getConnection());
}
@Override
public boolean addUser(User user) throws Exception {
boolean flage = false;
//业务逻辑,如先检查是否存在同名用户,直接返回false拒绝出现同名用户
flage = this.addUser(user);
//关闭数据库连接
this.dbconn.close();
return flage;
}
@Override
public List<User> listAll() throws Exception {
//业务逻辑....
List<User> list = this.dao.listAll();
//关闭数据库连接
this.dbconn.close();
return list;
}
}
DAOFactory.java
import dao.UserDao;
import service.UserService;
public class DAOFactory {
public static UserDao getUserDaoInstance() throws Exception{
return new UserService();
}
}
UserDaoTest.java
这里使用junit做测试
import java.sql.Date;
import java.util.List;
import org.junit.Test;
import factory.DAOFactory;
import pojo.User;
public class UserDaoTest {
@Test
public void addUser(){
User user = new User();
user.setName("name");
user.setBirthday(new Date(1996, 4, 11));
user.setSex(0);
try {
DAOFactory.getUserDaoInstance().addUser(user);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void listAllUser(){
List<User> list;
try {
list = DAOFactory.getUserDaoInstance().listAll();
for (User user : list) {
System.out.println(user.toString());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}