Dao操作的抽取,BaseDao
Dao操作通用的步骤:
0. 写SQL语句
1. 获取连接
2. 创建stmt
3. 执行sql
a) 更新
b) 查询
4. 关闭/异常
代码:
BaseDao
/**
* 通用的dao,自己写的所有的dao都继承此类;
* 此类定义了2个通用的方法:
* 1. 更新
* 2. 查询
* @author Jie.Yuan
*
*/
public class BaseDao { // 初始化参数
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs; /**
* 更新的通用方法
* @param sql 更新的sql语句(update/insert/delete)
* @param paramsValue sql语句中占位符对应的值(如果没有占位符,传入null)
*/
public void update(String sql,Object[] paramsValue){ try {
// 获取连接
con = JdbcUtil.getConnection();
// 创建执行命令的stmt对象
pstmt = con.prepareStatement(sql);
// 参数元数据: 得到占位符参数的个数
int count = pstmt.getParameterMetaData().getParameterCount(); // 设置占位符参数的值
if (paramsValue != null && paramsValue.length > 0) {
// 循环给参数赋值
for(int i=0;i<count;i++) {
pstmt.setObject(i+1, paramsValue[i]);
}
}
// 执行更新
pstmt.executeUpdate(); } catch (Exception e) {
throw new RuntimeException(e);
} finally {
JdbcUtil.closeAll(con, pstmt, null);
}
} /**
* 查询的通用方法
* @param sql
* @param paramsValue
*/
public <T> List<T> query(String sql, Object[] paramsValue,Class<T> clazz){ try {
// 返回的集合
List<T> list = new ArrayList<T>();
// 对象
T t = null; // 1. 获取连接
con = JdbcUtil.getConnection();
// 2. 创建stmt对象
pstmt = con.prepareStatement(sql);
// 3. 获取占位符参数的个数, 并设置每个参数的值
int count = pstmt.getParameterMetaData().getParameterCount();
if (paramsValue != null && paramsValue.length > 0) {
for (int i=0; i<paramsValue.length; i++) {
pstmt.setObject(i+1, paramsValue[i]);
}
}
// 4. 执行查询
rs = pstmt.executeQuery();
// 5. 获取结果集元数据
ResultSetMetaData rsmd = rs.getMetaData();
// ---> 获取列的个数
int columnCount = rsmd.getColumnCount(); // 6. 遍历rs
while (rs.next()) {
// 要封装的对象
t = clazz.newInstance(); // 7. 遍历每一行的每一列, 封装数据
for (int i=0; i<columnCount; i++) {
// 获取每一列的列名称
String columnName = rsmd.getColumnName(i + 1);
// 获取每一列的列名称, 对应的值
Object value = rs.getObject(columnName);
// 封装: 设置到t对象的属性中 【BeanUtils组件】
BeanUtils.copyProperty(t, columnName, value);
} // 把封装完毕的对象,添加到list集合中
list.add(t);
} return list;
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
JdbcUtil.closeAll(con, pstmt, rs);
}
}
}
AdminDao:
public class AdminDao extends BaseDao {
// 删除
public void delete(int id) {
String sql = "delete from admin where id=?";
Object[] paramsValue = {id};
super.update(sql, paramsValue);
}
// 插入
public void save(Admin admin) {
String sql = "insert into admin (userName,pwd) values (?,?)";
Object[] paramsValue = {admin.getUserName(),admin.getPwd()};
super.update(sql, paramsValue);
}
// 查询全部
public List<Admin> getAll(){
String sql = "select * from admin";
List<Admin> list = super.query(sql, null, Admin.class);
return list;
}
// 根据条件查询(主键)
public Admin findById(int id){
String sql = "select * from admin where id=?";
List<Admin> list = super.query(sql, new Object[]{id}, Admin.class);
return (list!=null&&list.size()>0) ? list.get(0) : null;
}
}
Dao操作的抽取,BaseDao的更多相关文章
- 案例50-crm练习dao层的抽取BaseDao
1 抽取BaseDao 2 BaseDao设计思路 3 BaseDao接口书写 package www.test.dao; import java.io.Serializable; import ja ...
- Dao操作的抽取
package com.loaderman.demo.c_jdbc; public class Admin { private int id; private String userName; pri ...
- 使用HibernateDaoSupport抽取BaseDao
在开发采用Struts2+Spring+hibernate这三大框架的项目时,我们需要一个抽取一个BaseDao.这个Dao里面CRUD都给封装好,后续的其他Dao直接用它的功能就可以 ...
- Dao层抽取BaseDao公共方法
设计IBseDao接口,定义公共的CRUD方法. // IBaseDao 接口,定义公共的CRUD方法 public interface IBaseDao<T> { public void ...
- Javaee的Dao层的抽取
有时候我们在实现不同功能的时候回看到很多的Dao层的增加.修改.删除.查找都很相似,修改我们将他们提取BaseDao 一.提取前 1. 提取前的LinkDao层: public interface L ...
- Hibernate抽取BaseDao
package com.cky.dao; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate. ...
- ssm框架整合抽取BaseDao接口
import java.io.Serializable; import java.util.List; /** * DAO基础操作模板 * * @param <T> 泛型 */ publi ...
- Java通过代理类实现数据库DAO操作
下面的所有代码示例都取自李兴华的<Java Web开发实战经典>的随书源码,因为觉得设计得很好,所以将代码摘录下来作成笔记. 首先,我们在一个java文件中定义要存储的结构类型: impo ...
- 中阶 d03.5 (正篇)完整的Dao 操作数据库
1.目录结构: util---JDBCUtil.java(工具包,整合建立链接和释放资源的方法) dao---UserDao.java(接口,定义方法) impl---UserDaoImpl.java ...
随机推荐
- c#基础语言编程-多态
语言中的多态性是为了使程序有扩展性,为实现多态性,在程序中体现为接口.抽象类.父类.具体类. 接口就是一种规范,解决了多重继承的问题,类似一种规范,告诉我要做什么,具有什么能力,在接口中定义写行为属性 ...
- Unity 读取、写入自定义路径文件,调用System.Windows.Forms
调用System.Windows.Forms DLL 首先在Unity新建Plugins文件夹添加System.Windows.Forms.dll 然后代码中添加引用 using System; us ...
- C#将数据以XML格式写入Excel
本文转载:http://www.cnblogs.com/eflylab/archive/2008/09/21/1295580.html c#将数据导入Excel另类方法 今天公司突然给个Excel模版 ...
- [Reactive Programming] RxJS dynamic behavior
This lesson helps you think in Reactive programming by explaining why it is a beneficial paradigm fo ...
- 每天一句 linux命令
1. :进入系统根目录 命令: cd / 2. cd .. 返回上一级目录 3. 例3:跳转到指定目录 命令: cd /opt/soft
- shell入门之流程控制语句 分类: 学习笔记 linux ubuntu 2015-07-10 16:38 89人阅读 评论(0) 收藏
1.case 脚本: #!/bin/bash #a test about case case $1 in "lenve") echo "input lenve" ...
- Dreamweaver cs6安装破解
Dreamweaver 是前端开发的必备软件.目前最新版本为CS6,与CS5相比多了对HTML5.CSS3.jquery的关联支持,可以更方便的在Dreamweaver中编写前端代码. 安装准备: 1 ...
- PRD产品需求文档概要
PRD概念 PRM就是Product Requirements Document的简称,也就是产品需求模型.一般来说一个产品会伴随有市场需求文档(Market Requirements Documen ...
- python s12 day3
python s12 day3 深浅拷贝 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- n进制转为十进制
主程序代码 - #include <stdio.h> #include <string.h> main() { long t1; int i, n, t, t3; ]; pri ...