DAO模式(Data Access Object(数据存取对象) )
数据持久化的概念
将程序中的数据在瞬时状态和持久状态间转换的机制即为数据的持久化
JDBC封装
1.提高可读性
2.利于后期维护与修改
3.增强代码的复用性
4.降低代码之间的耦合
5.隔离业务逻辑代码与数据库访问代码
6.隔离不同的数据库的实现
JDBC封装步骤
定义实体类
代码语言:javascript复制public class Pet{
private int id;// 宠物id
private int masterId;// 主人id
private String name;// 昵称
……
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
……
}
对实体类的所有操作抽取成接口
代码语言:javascript复制public interface PetDao{
int save(Pet pet);
int del(Pet pet);
int update(Pet pet);
Pet getByName(String name);
List<Pet> findByName(String name);
List<Pet> findByType(String type);}
创建BaseDAO(待改良)
代码语言:javascript复制public class BaseDao{
private String driver = " com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/epet";
… …
public Connection getConnection() {
… …
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
… …
return conn;
}
public void closeAll(Connection conn, Statement stmt,ResultSet rs) {
if(rs != null) rs.close();
if(stmt != null)stmt.close();
… …
}
public int exceuteUpdate (String preparedSql, Object[] param) {
… …
conn = getConnection();
try {
pstmt = conn.prepareStatement(preparedSql);
if (param != null) {
for (int i = 0; i < param.length; i ) {
//为预编译sql设置参数
pstmt.setObject(i 1, param[i]);
}
}
num = pstmt.executeUpdate();
} … …
}
}
实现类实现接口并继承数据库工具类
代码语言:javascript复制public class PetDaoMySQLImpl2 extends BaseDao implements PetDao{
//更新宠物状态
public int update(Pet pet) {
String sql="update pet set status=0 where id=?";
Object[] param={pet.getId()};
int result=this.exceuteUpdate(sql, param);
return result;
}
//省略实现PetDao的其他方法
}
使用Properties类
添加.properties文件
调用properties方法
代码语言:javascript复制String getProperty(String key)//用指定的键在此属性列表中搜索属性。通过参数key得到其所对应的值
Object setProperty(String key,String value)//调用Hashtable的方法put。通过调用基类的put()方法来设置键-值对
void load(InputStream inStream)//从输入流中读取属性列表 (键和元素对)。通过对指定文件进行装载获取该文件中所有键-值对
void clear()//清除所装载的键-值对,该方法由基类Hashtable提供
改良后的BaseDAO
代码语言:javascript复制public class BaseDao {
//省略变量定义代码……
static{
init();}
public static void init(){
Properties params=new Properties();
String configFile = "database.properties";
InputStream is=BaseDao.class.getClassLoader()
.getResourceAsStream(configFile);
try {
params.load(is);
} catch (IOException e) {//….}
driver=params.getProperty("driver");
url=params.getProperty("url");
user=params.getProperty("user");
password=params.getProperty("password");
} //省略其他方法代码……}
使用实体类传递数据注意点
属性一般使用private修饰
提供public修饰的getter/setter方法
实体类提供无参构造方法,根据业务提供有参构造
实现java.io.Serializable接口,支持序列化机制
如果不实现这个接口,在某些数据持久框架下进行数据持久化会出现问题。hibernate就是这样的