JDBC—总结(2).Dao模式

2 篇文章 0 订阅

1.Dao模式

把java对数据库操作封装起来的一个较固定的套路。

2.Dao的组成部分

dao接口:定义所有的dao操作(CURD)

dao实现类:实现DAO接口中的操作
vo类:(value object)实例代表表中的一条记录,只有属性,没有操作;
工厂类:用来创建dao对象;(少量对象可以没有)

3.Dao模式流程

1.vo

package com.vo;

import java.sql.Date;

public class Dept1 {
	
	private int id;
	
	private String name;
	
	private String location;

	public Dept1(String name, String location) {
		super();
		this.name = name;
		this.location = location;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getLocation() {
		return location;
	}

	public void setLocation(String location) {
		this.location = location;
	}

}


2.dao接口

//BaseDao类,可以用来把对数据库各个表的操作封装起来,使代码更简便,也更好用。

public class BaseDao {

		public void execute(String sql,Object...args){
			Connection conn=this.getConn();
			PreparedStatement ps=null;
			try {
				ps=conn.prepareStatement(sql);
				for(int i=0;i<args.length;i++){
					ps.setObject(i+1,args[i]);
				}
				ps.execute();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				this.close(ps);
				this.close(conn);
			}
		}
		
		public List<Tbbook> select(String sql,Object...args){
			List<Tbbook> list=new ArrayList<Tbbook>();
			Connection conn=this.getConn();
			PreparedStatement ps=null;
			ResultSet rs=null;
			try {
				ps=conn.prepareStatement(sql);
				for(int i=0;i<args.length;i++){
					ps.setObject(i+1,args[i]);
				}
				rs=ps.executeQuery();
				while(rs.next()){
					Tbbook book=new Tbbook();
					book.setBookid(rs.getInt("bookid"));
					book.setBookname(rs.getString("bookname"));
					book.setPrice(rs.getInt("price"));
					book.setPublisher(rs.getString("publisher"));
					list.add(book);
					System.out.println();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				this.close(ps);
				this.close(conn);
			}
			return list;
		}
		
			public Connection getConn(){
				Connection conn=null;
				try {
					conn=DriverManager.getConnection("jdbc:mysql://localhost/test","root","zx199710170019");
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return conn;
			}
		
		public void close(AutoCloseable auto){
			
			if(auto!=null){
				try {
					auto.close();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	
}
TbbookDaoImpl : 实现了BaseDao,TbbookDao。因为有BaseDao所以这里的代码很简便,封装起来了。

其中的save()是可以用来插入任意表的记录。以后学多了就更简单了,结合上反射,注释,

对数据的操作就很方便了。

public class TbbookDaoImpl extends BaseDao implements TbbookDao {

	@Override
	public void insert(Tbbook b) {
		
		this.execute("insert into Tbbook values(null,?,?,?)", b.getBookname(),b.getPrice(),b.getPublisher());
		
	}

	@Override
	public void delete(int bookid) {
		
		this.execute("delete from Tbbook where bookid=?", bookid);
		
	}

	@Override
	public void update(Tbbook b) {
		
		this.execute("update Tbbook set bookname=?,price=?,publisher=?", b.getBookname(),b.getPrice(),b.getPublisher());
		
	}
	
	@Override
	public List<Tbbook> getBookByPage(int pageNum, int pageCount) {
		List<Tbbook> list=this.select("select bookid,bookname,price,publisher from tbbook limit ?,?", (pageNum-1)*pageCount,pageCount);
		return list;
	}

	@Override
	public Tbbook getBookById(int id) {
		List<Tbbook> list=this.select("select bookid,bookname,price,publisher from tbbook where bookid=?",id);
		if(!list.isEmpty()){
			return list.get(0);	
		}
		return null;	
	}

	@Override
	public List<Tbbook> getAll() {
		List<Tbbook> list=this.select("select bookid,bookname,price,publisher from tbbook order by bookid");
		return list;
	}
	
	
	private Connection getConnection() {
		Connection conn=null;
		try {
			conn = DriverManager.getConnection("jdbc:mysql://localhost/test","root","zx199710170019");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
	
	public void save(Object o)  {
		Class c=o.getClass();
		Field[] field=c.getDeclaredFields();
		Connection conn=this.getConnection();
		String sql="insert into "+c.getSimpleName()+"(";
		String sql1=") values(";
		for(Field f:field) {
			if(f.isAnnotationPresent(PrimaryKey.class)) {
				if(f.getAnnotation(PrimaryKey.class).value()) {
					sql+=f.getName()+",";
					sql1+="null,";
				}
				else {
					sql+=f.getName()+",";
					sql1+="?,";
				}
			}
			else if(f.isAnnotationPresent(Property.class)) {
					if(f.getAnnotation(Property.class).value().equals("")) {
						sql+=f.getName()+",";
						sql1+="?,";
						}
					else {
						sql+=f.getAnnotation(Property.class).value()+",";
						sql1+="?,";
					}
					}
		}
		sql=sql.replaceAll("\\,$","");
		sql1=sql1.replaceAll("\\,$","");
		sql+=sql1;
		sql+=")";
		PreparedStatement ps=null;
		try {
			ps=conn.prepareStatement(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		for(int i=1;i<field.length;i++) {
			Field f=field[i];
			f.setAccessible(true);
			try {
				try {
					ps.setObject(i,f.get(o));
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} 
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		try {
			ps.execute();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			ps.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			conn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(sql);
	}
TbbookDaoTest :实现类

public class TbbookDaoTest {

	public static void main(String[] args) {
		TbbookDaoImpl tb=new TbbookDaoImpl();
//		Tbbook book=new Tbbook("白夜行",99,"日本出版社");
		List<Tbbook> list=tb.getBookByPage(2, 2);
		System.out.println(list);		
		Tbbook book=tb.getBookById(250);
		System.out.println(book.toString());
		List<Tbbook> list1=tb.getAll();
		System.out.println(list1);
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值