利用元数据对Dao操作进行抽取
Dao操作通用的步骤:
1.写SQL语句
2.获取连接
3.创建stmt
4.执行sql
a)更新executeUpdate
b)查询executeQuery
5.关闭/异常
BaseDao抽取:
commons-beanutils-1.8.3.jar点击打开链接 和 commons-logging-1.1.3.jar点击打开链接
父类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;标签:BaseDao,public,params,User,sql,工具,id,user From: https://blog.51cto.com/u_15769923/5974370
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());
}
}