Dao编程模型
DAO:Data Access Object-即数据访问对象
我们现在使用的数据库都是关系型的,讲究的数据与数据之间的关联(RelationShip)
我们所使用的编程语言(Java)是面向对象的编程语言,讲究的是万事万物皆对象(Object)
JDBC处理数据库连接的实现方式是:在Java程序中编写SQL并执行,以实现与数据库进行对象并操作数据的目
的
问题就来了:SQL并不是以对象的角度在看待问题的
所以就产生了一种理念冲突,我们也将这种思想理念上的冲突称为阻抗不匹配,如果想解决这种模型不匹纺
ORM相关的编程模型来处理
ORM:Object-Relation-Mapping
类----表
属性----字段
对象----记录
Dao编程模型可以让你以操作对象的方式去完成对数据库中数据操作
Dao编程模型中有几个要素需要我们实现
- 一个DAO工厂类;
- 一个DAO接口;
- 一个实现DAO接口的具体类;
- 数据传递对象(有些时候叫做值对象即VO ).
数据传递对象又有几种分类
PO:持久化的对象,与数据表对应比较完整一种数据对象抽象
VO:值对象,与页面显示所有的值对应的一种数据对象抽象
DTO:数据传输对象,负责在程序内部的各层之间进行数据传递的数据对象抽象
POJO:简单数据对象,可以比较灵活的定义,一个POJO持久化以后就是PO;直接用它传递、传递过程中就是
DTO;直接用来对应表示层就是VO;
代码展示
这篇文章用到了上一篇文章:JDBC封装思想中的代码(jdbcSqlFactory),由于篇幅过长,不在本文展示
执行前数据库表内容
注:表名为country
创建country类(象征数据库中的表)
package jdbc.pojo;
public class country {
private int cid;
private String cname;
private String location;
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
@Override
public String toString() {
return "cid:"+this.cid+", cname:"+cname+",location"+location;
}
}
定义Dao接口
package jdbc.dao;
import java.util.List;
public interface IDao <T,PK>{
//增加
public void save(T pojo);
//删除
public void cancel(PK pk);
//修改
public void modify(T pojo);
//按条件查询
public List<T> queryBycondition(T pojo);
//查询一个
public T queryOne(PK pk);
}
定义用于country操作的接口(继承Dao接口)
package jdbc.dao;
import jdbc.pojo.country;
public interface ICountryDao extends IDao<country,Integer>{
}
country的Dao的实现
package jdbc.impl;
import jdbc.dao.ICountryDao;
import jdbc.pojo.country;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import jdbc.util.jdbcSqlFactory;
public class CountryDaoImpl implements ICountryDao {
private jdbcSqlFactory sqlFactory=new jdbcSqlFactory();
@Override
public void save(country pojo) {
String insertSql="insert into country values (null,?,?)";
sqlFactory.prepareUpdate(insertSql,pojo.getCname(),pojo.getLocation());
}
@Override
public void cancel(Integer integer) {
}
@Override
public void modify(country pojo) {
}
@Override
public List<country> queryBycondition(country pojo) {
List<country> countries=new ArrayList<>();
String querySql="select * from country where 1=1 ";
if (pojo!=null){
if (pojo.getCid()!=0){
querySql+="and cid="+pojo.getCid();
}
if (pojo.getCname()!=null&&!"".equals(pojo.getCname())){
querySql+="and cname like '%"+pojo.getCname()+"%'";
}
if (pojo.getLocation()!=null&&!"".equals(pojo.getLocation())){
querySql+="and location like '%"+pojo.getLocation()+"%'";
}
}
List<Map<String,Object>> table=sqlFactory.executeQuery(querySql);
for (Map<String,Object> row: table){
country cou=new country();
cou.setCid(Integer.valueOf(row.get("cid")+""));
cou.setCname(String.valueOf(row.get("cname")));
cou.setLocation(String.valueOf(row.get("location")));
countries.add(cou);
}
return countries;
}
@Override
public country queryOne(Integer integer) {
return null;
}
}
测试功能
import jdbc.util.jdbcSqlFactory;
import jdbc.pool.ConnectionPool;
import jdbc.pojo.country;
import jdbc.impl.CountryDaoImpl;
import jdbc.dao.ICountryDao;
public class daotest {
public static void main(String[] args){
country coun=new country();
coun.setCname("song");
coun.setLocation("do not konw");
CountryDaoImpl countryDao=new CountryDaoImpl();
countryDao.save(coun);
}
}
执行后数据库表内容:
最后,本文中country的Dao实现代码只实现了两个方法(增加、按条件查询),后续代码,下一篇文章更新。