DAO(Data Access Object)
What: DAO是一个访问数据的类,包好了对数据的CRUD,而不包含业务相关的功能
Why: 实现了功能的模块化,降低耦合度
How: 编写一个类,包含了使用JDBC,以及CRUD函数。
在DAO组成部分上,大部分人有自己的见解,但大部分人都支持这两种:
①参照:https://blog.csdn.net/zonzereal/article/details/79099181
DAO接口
DAO实现类
实体类
数据库连接和关闭工具类
②参照:https://blog.csdn.net/wuyueyuljh/article/details/7561863
(1)数据库连接类;
数据库连接类的主要功能是连接数据库并获得连接对象,以及关闭数据库。通过数据库连接类可以大大的简化开发,在需要进行数据库连接时,只需常见该类的实例,并调用其中的方法就可以获得数据库连接对象和关闭数据库,不必再进行重复操作。
(2)VO类:
VO类是一个包含属性和表中字段完全对应的类,并在该类中提供setter和getter方法来设置并获取该类中的属性。
(3)DAO接口:
DAO接口中定义了所有的用户操作,如添加记录、删除记录及查询记录等。不过因为是借口,所以仅仅是定义,需要子类实现。
(4)DAO实现类:
DAO实现类实现了DAO接口,并实现了接口中定义的所有方法。
(5)DAO工厂类:
在没有DAO工厂类的情况下,必须通过创建DAO实现类的实例才能完成数据库操作。这时就必须知道具体的子类,对于后期的修改非常不方便。
使用DAO工厂类,可以比较方便地对代码进行管理,而且可以很好地解决后期修改的问题,通过该DAO工厂类的一个静态方法来获取DAO实现类实例。这时如果要替换DAO实现类,只需要修改该Dao工厂类中的方法代码,而不必邀修改所有的操作数据库代码。
例子:
+++++ 数据库连接和关闭工具类+++++
package util;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
static private DataSource ds=new ComboPooledDataSource();
public static DataSource getDataSource() {
return ds;
}
static public Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
//其实这个写的有个失误,我选择抛出异常,结果在之后的接口实现类中,遇到了很大的麻烦,我需要不厌其烦的进行异常处理;
+++++实体类(JavaBean)+++++
package cn.njit.orm;
public class Products {
private int pid;
private String pname;
private double price;
private int categoryId;
public Products() {
}
public Products(int pid,String pname,double price,int categoryId) {
super();
this.pid=pid;
this.pname=pname;
this.price=price;
this.categoryId=categoryId;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getCategoryId() {
return categoryId;
}
public void setCategoryId(int categoryId) {
this.categoryId = categoryId;
}
public String toString() {
return pname+"-"+price;
}
}
+++++ DAO接口+++++
package cn.njit.dao;
import java.util.List;
import cn.njit.entity.PageBean;
import cn.njit.orm.Products;
/***
* 产品DAO接口
* @author Liu
*
*/
public interface IProductsDao {
int addProducts(Products p);//增加一个Products对象
int deleteProducts(int id);//删除一个Products对象
int modifyProducts(Products p);//修改一个Products对象
int countAll();//查看一共有多少条记录
Products queryById(int id);//根据pid查询产品
PageBean<Products> queryAll();//查询所有产品,返回一个界面
List<Products> queryByName(String name); //模糊查询
List<Products> queryByPrice(double priceBegin,double priceEnd);//价格查询
}
+++++ DAO实现类++++
package cn.njit.dao;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import cn.njit.entity.PageBean;
import cn.njit.orm.Products;
import util.C3P0Utils;
/***
* 产品dao实现类
* @author Liu
*
*/
public class ProductsDaoImpl implements IProductsDao {
private QueryRunner qr=new QueryRunner(C3P0Utils.getDataSource());
@Override
public int addProducts(Products p) {
String sql="insert into products(pname,price,category_id) values(?,?,?)";
int cnt = 0;
try {
cnt = qr.update(sql,p.getPname(),p.getPrice(),p.getCategoryId());
} catch (SQLException e) {
System.out.println("======");
e.printStackTrace();
}
return cnt;
}
@Override
public int deleteProducts(int id) {
String sql="delete from products where pid='"+id+"'";
int cnt = 0;
try {
cnt=qr.update(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return cnt;
}
@Override
public int modifyProducts(Products p) {
if(null!=queryById(p.getPid())) {
String sql="Update products set pname=?,price=?,category_id=? where pid='"+p.getPid()+"'";
Object[] o= {p.getPname(),p.getPrice(),p.getCategoryId()};
int cnt = 0;
try {
cnt = qr.update(sql,o);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
cnt=-1;
}
return cnt;
}else {
System.out.println("没有这个记录");
return 0;
}
}
@Override
public Products queryById(int id) {
String sql="select * from products where pid=?";
BeanHandler<Products> blh=new BeanHandler<Products>(Products.class);
try {
Products p=qr.query(sql, blh,id);
return p;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
@Override
public List<Products> queryByName(String name) {
String sql="select * from products where pname like (?)";
BeanListHandler<Products> bhl=new BeanListHandler<Products>(Products.class);
try {
List<Products> list=qr.query(sql, bhl,"%"+name+"%");
return list;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
@Override
public List<Products> queryByPrice(double priceBegin, double priceEnd) {
String sql="select * from products where price>? and price<?";
Object[] o= {priceBegin,priceEnd};
BeanListHandler<Products> blh=new BeanListHandler<Products>(Products.class);
try {
List<Products> list=qr.query(sql, blh,o);
return list;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
@Override
public PageBean<Products> queryAll() {
PageBean<Products> page=new PageBean<Products>();
page.setPageSize(5);
String sql="select * from products";
BeanListHandler<Products> bh=new BeanListHandler<Products>(Products.class);
int total=countAll();
try {
List<Products> ps=qr.query(sql, bh);
page.setData(ps);
page.setTotal(total);
page.setPageSize(5);
page.setPageNumber(1);
return page;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
@Override
public int countAll() {
ScalarHandler<Long> sh=new ScalarHandler<Long>();
String sql="select count(1) from products";
try {
Long cnt=qr.query(sql, sh);
return cnt.intValue();
} catch (SQLException e) {
e.printStackTrace();
return -1;
}
}
}
测试类:
package cn.njit.dao;
import java.util.Arrays;
import cn.njit.entity.PageBean;
import cn.njit.orm.Products;
/****
* dao测试类
* @author Liu
*
*/
public class TestDao {
public static void main(String[] args) {
IProductsDao dao = new ProductsDaoImpl();
testaddProducts(dao);
}
static void testaddProducts(IProductsDao dao) {
Products p = new Products();
p.setCategoryId(1);
p.setPname("榔头");
p.setPrice(2500);
int cnt = dao.addProducts(p);
if (cnt > 0) {
System.out.println("增加产品成功");
} else {
System.out.println("增加产品失败");
}
}
static void testdeleteProducts(IProductsDao dao) {
int cnt=dao.deleteProducts(1003);
if (cnt > 0) {
System.out.println("删除产品成功");
} else {
System.out.println("删除产品失败");
}
}
static void testqueryById(IProductsDao dao) {
System.out.println(dao.queryById(1002));
}
static void testmodifyProducts(IProductsDao dao) {
Products p2=new Products();
p2.setPid(1003);
p2.setCategoryId(5);
p2.setPname("锤子");
p2.setPrice(2500);
System.out.println(dao.modifyProducts(p2));
}
static void testPageBean(IProductsDao dao) {
PageBean<Products> page=dao.queryAll();
int count = 0;
for(Products product:page.getData()) {
count++;
System.out.println(count + "\t" + product.toString());
}
System.out.println("第" + page.getPageNumber() + "页;共" + page.getPageCount() + "页。");
}
static void testqueryByName(IProductsDao dao) {
String name="i";
System.out.println(Arrays.toString(dao.queryByName(name).toArray()));
}
static void testqueryByPrice(IProductsDao dao) {
System.out.println(Arrays.toString(dao.queryByPrice(1000, 6000).toArray()));
}
}