BaseDao工具类
利用元数据对Dao操作进行抽取
Dao操作通用的步骤:
1.写SQL语句
2.获取连接
3.创建stmt
4.执行sql
a)更新executeUpdate
b)查询executeQuery
5.关闭/异常
BaseDao抽取:
父类BaseDao.java
package com.cn.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import com.cn.util.JdbcUtil;
/**
* 通用的dao,自己写的所有的dao都继承此类
* 此类定义2个通用 方法
* 1.更新
* 2.查询
* @author liuzhiyong
*
*/
public class BaseDao {
/**
* 更新的通用的方法
* @param sql 更新的SQL语句(update/insert/delete)
* @param params SQL语句中占位符对应的值(如果没有占位符,则传入null)
*/
public void update(String sql, Object[] params){
Connection conn = null;
PreparedStatement pstmt = null;
try {
//获取连接
conn = JdbcUtil.getConnection();
//创建执行命令的stmt对象
pstmt = conn.prepareStatement(sql);
//通过参数元数据,得到占位参数的个数
int count = pstmt.getParameterMetaData().getParameterCount();
//设置占位符参数的值
if(params != null && params.length>0){
//循环给参数赋值
for(int i=0; i<count; i++){
pstmt.setObject(i+1, params[i]);
}
}
//执行更新
pstmt.executeUpdate();
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
JdbcUtil.close(conn, pstmt, null);
}
}
public <T>List<T> query(String sql, Object[] params, Class<T> clazz){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//创建List集合,存放数据库查询出来的数据
List<T> list = new ArrayList<T>();
//要封装的对象
T t = null;
//获取连接
conn = JdbcUtil.getConnection();
//创建执行命令的stmt对象
pstmt = conn.prepareStatement(sql);
//通过参数元数据,得到占位参数的个数
int paramsCount = pstmt.getParameterMetaData().getParameterCount();
//设置占位符参数的值
if(params!=null && params.length>0){
//循环给参数赋值
for(int i=0; i<paramsCount; i++){
pstmt.setObject(i+1, params[i]);
}
}
//执行查询
rs = pstmt.executeQuery();
//获取结果集元数据
ResultSetMetaData rsMeta = rs.getMetaData();
//获取列的个数
int columnCount = rsMeta.getColumnCount();
//遍历结果集,迭代每一行
while(rs.next()){
//创建要封装的T对象
t = clazz.newInstance();
//遍历每一行的每一列
for(int i=0; i<columnCount; i++){
//获取每一列的名称
String columnName = rsMeta.getColumnName(i+1);
//获取该行对应列名称的值
Object objectValue = rs.getObject(columnName);
//利用BeanUtils将属性拷贝到对象中
BeanUtils.copyProperty(t, columnName, objectValue);//注意日期类型的数据保存,需要注册日期类型注册前
}
//将封装完毕的t对象存入list集合中
list.add(t);
}
return list;
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
JdbcUtil.close(conn, pstmt, rs);
}
}
}
子类继承BaseDao.java
package com.cn.dao.impl;
import java.util.List;
import com.cn.dao.BaseDao;
import com.cn.entity.User;
public class UserDao extends BaseDao{
/**
* 删除
* @param id
*/
public void delete(int id){
String sql = "delete from users where id = ?";
Object[] params = {id};
super.update(sql, params);//调用父类BaseDao中的方法
}
/**
* 插入
* @param user
*/
public void save(User user){
String sql = "insert into users(name, password) values(?, ?)";
Object[] params = {user.getName(), user.getPassword()};
super.update(sql, params);//调用父类BaseDao中的方法
}
/**
*
* @param user
*/
public void update(User user){
String sql = "update users set name=?, password=? where id=?";
Object[] params = {user.getName(), user.getPassword(), user.getId()};
super.update(sql, params);//调用父类BaseDao中的方法
}
/**
* 查询所有
* @param params
* @return
*/
public List<User> query(){
String sql = "select * from users";
List<User> list = super.query(sql, null, User.class);
return list;
}
/**
* 根据主键查询
* @param id
* @return
*/
public User findById(int id){
String sql = "select * from users where id = ?";
List<User> list = super.query(sql, new Object[]{id}, User.class);
return (list!=null&&list.size()>0)?list.get(0):null;
}
}
User.java
package com.cn.entity;
public class User {
private int id;
private String name;
private String password;
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password
+ "]";
}
}
测试
package com.cn.test;
import java.util.List;
import org.junit.Test;
import com.cn.dao.impl.UserDao;
import com.cn.entity.User;
public class UserTest {
UserDao dao = new UserDao();
/**
* 测试更新
* @throws Exception
*/
@Test
public void testUpdate() throws Exception {
/**
* 删除
*/
// dao.delete(4);
/**
* 保存
*/
// dao.save(new User());
// User user = new User();
// user.setName("刘先森");
// user.setPassword("666666");
// dao.save(user);
/**
* 更新
*/
User user2 = new User();
user2.setId(8);
user2.setName("mary");
user2.setPassword("mary");
dao.update(user2);
}
/**
* 查询所有
* @throws Exception
*/
@Test
public void testQuery() throws Exception {
List<User> list = dao.query();
for(User user : list){
System.out.println(user.toString());
}
}
/**
* 根据id主键查询
* @throws Exception
*/
@Test
public void testFindById() throws Exception {
User user = dao.findById(3);
System.out.println(user.toString());
}
}
BaseDao工具类相关推荐
- JDBC初学者的basedao工具类
package com.obtk.util;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pre ...
- JAVA高效率 (秒级) 将千万条数据导入数据库 (已封装工具类)【详解】【一看就懂】
该gif做了加速处理,便于观看~ 今天在将一个500w+条数据的文件导入至数据库时,遇到一个异常,相信做大数据应该都有遇到.500w条数据说多不多,说少也不少.既然问题出现了,那么就一定要解决. 异 ...
- java druid jdbc例子_JDBC【使用Druid连接数据库,DBUtils工具类的使用】
Druid连接数据库,DBUtils工具类的使用 1.在maven中添加Druid依赖 com.alibaba druid 1.2.0 2.封装Druid连接方法 import com.alibaba ...
- jdbc dao 工具类mysql_Java基于JDBC实现事务,银行转账及货物进出库功能示例
本文实例讲述了Java基于JDBC实现事务,银行转账及货物进出库功能.分享给大家供大家参考,具体如下: 1. 转账业务 转账必须执行2个sql语句(update更新)都成功的情况下,提交事务,如果有一 ...
- dbutils java_Dbutils工具类的使用
一.什么是Dbutils? Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能.来源百度百科 ...
- java list resultset_Java工具类 通过ResultSet对象返回对应的实体List集合
自从学了JDBC用多了像一下这种代码: ResultSet rs = this.executeQuery(sql, objs); List list = new Array(); if(rs.next ...
- java中常用的工具类
1. 常用零散工具类 1.1[DateUtil.java]日期处理的工具类 /*** 时间日期处理工具* String -> Date* Date -> String* 以及生成含有日期的 ...
- NC6 用户账号密码加密工具类
RBAC用户密码工具类: package nc.vo.uap.rbac.util;import java.util.Collection; import java.util.regex.Matcher ...
- java日期转化工具类
package com.rest.ful.utils;import java.text.DateFormat; import java.text.ParseException; import java ...
最新文章
- 计算机网络——IP地址与MAC地址
- 如何在ASP.NET Core中自定义Azure Storage File Provider
- POJ 1852 Ants 分析
- idea关闭当前项目
- 微信小程序轮播中的current_开源 | 微信接龙小程序 wechatsolita 开源
- mybatis--常见的错误
- ArcPad 10 的安装部署
- UnionID与OpenID的区别【转自微信官方文档】
- Gif 录制工具:Screen2Gif
- 企业研发人员配备比例_高新企业科技人员占比是什么要求
- andriod studio git
- 服务器修复oxc0000098,修复oxc0000098的方法
- 「数据结构 | 链表」单链表、双向链表节点操作演示动画
- 轻型货车悬架系统的设计(设计说明书+CAD图纸+开题报告+任务书+答辩相关材料)
- vue项目模拟后台数据
- linux中获取几天前或者几天后的日期
- 御坂坂的C++学习之路(3)-----函数-----stdarg.h
- Linux内核源码介绍
- 【C语言程序设计】从键盘上输入某年某月(包括闰年),编程输出该年的该月拥有的天数。
- 计算机工程本科旧金山找工,2020年旧金山大学本科热门专业
热门文章
- MySQL笔记(黑马一)
- 考试 mysql 数据库设计_基于MySQL的在线考试系统数据库设计
- 7N60-ASEMI高压MOS管7N60
- bbs jsp mysql_BBS 一个比较简单的用jsp+servlet+mysql做的bbs论坛 Jsp/ 265万源代码下载- www.pudn.com...
- 如何用OBS直播?关键的步骤能不能简化一下
- 前端自动化测试——百度搜索功能实战演示
- ------什么是作用域
- 手机射频电路中常见的射频电路
- 認識系統服務 daemons
- 临沂计算机公司排名2015,临沂有哪些大企业 临沂百强企业排名2015