java 关于封装jdbc操作接口的一些做法

本文介绍了如何在Java中封装JDBC操作,通过创建抽象基类BaseDao和具体实现类UserDao,实现了数据库查询和更新的通用方法。BaseDao负责连接管理和基本SQL操作,而UserDao则继承BaseDao并定制填充User对象的方法,提高了代码复用性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先建立如下图所示的包结构:
然后首先件里模型model包下的两个类:
package model;

public abstract class Bean {
   
}

下面是User类的代码:
package model;

import java.util.Date;

public class User extends Bean{
private Integer id;
private String name;
private String password;
private String sex;
private String email;
private String pwdQuestion;
private String pwdAnswer;
private Date regDate;
private String lastLoginDate;
private String lastLoginIp;

public Integer getId() {
return id;
}

public void setId(Integer 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 String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getPwdQuestion() {
return pwdQuestion;
}

public void setPwdQuestion(String pwdQuestion) {
this.pwdQuestion = pwdQuestion;
}

public String getPwdAnswer() {
return pwdAnswer;
}

public void setPwdAnswer(String pwdAnswer) {
this.pwdAnswer = pwdAnswer;
}

public Date getRegDate() {
return regDate;
}

public void setRegDate(Date regDate) {
this.regDate = regDate;
}

public String getLastLoginDate() {
return lastLoginDate;
}

public void setLastLoginDate(String lastLoginDate) {
this.lastLoginDate = lastLoginDate;
}

public String getLastLoginIp() {
return lastLoginIp;
}

public void setLastLoginIp(String lastLoginIp) {
this.lastLoginIp = lastLoginIp;
}

}

然后建立dao包,里面的BaseDao代码如下:

package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import java.util.ArrayList;
import model.Bean;

public abstract class BaseDao {
private static String url = "jdbc://localhost:3306/test";
private static String name = "root";
private static String password = "12345";
private static String driverName = "com.mysql.jdbc.Driver";

private Connection getConnection() {
Connection conn = null;
try {
Class.forName(driverName);
conn = DriverManager.getConnection(url, name, password);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
    /**
     * parse ResultSet to Bean's Child
     * @param rt
     * @return
     * Bean
     */
protected abstract Bean fillBean(ResultSet rt);

/**
 * select
 * @param sql
 * @return
 * the result of select operation
 */
public ArrayList select(String sql) {
ArrayList list = new ArrayList();
Connection conn = getConnection();
Statement st = null;
ResultSet rt = null;
try {
st = conn.createStatement();
rt = st.executeQuery(sql);
while (rt.next()) {
list.add(fillBean(rt));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
rt.close();
st.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}

/**
 * update,insert,delete
 * @param sql
 * @return
 * operation columns
 */
public int update(String sql) {
int flag = -1;
Connection conn = getConnection();
Statement st = null;
try {
st = conn.createStatement();
flag = st.executeUpdate(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
conn.rollback();// 如果出现异常,当前操作自动回滚
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} finally {
try {
conn.commit();// 如果操作正常,当前操作提交
st.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return flag;
}

}

下面是UserDao的代码:
package dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import model.Bean;
import model.User;

public class UserDao extends BaseDao{
    private static final String TABLE_NAME="user";
@Override
protected Bean fillBean(ResultSet rt) {
User user=new User();
try {
user.setId(rt.getInt("id"));
user.setName(rt.getString("name"));
user.setPassword(rt.getString("password"));
user.setSex(rt.getString("sex"));
user.setEmail(rt.getString("email"));
user.setPwdQuestion(rt.getString("pwdquestion"));
user.setPwdAnswer(rt.getString("pwdanswer"));
user.setRegDate(rt.getDate("regdate"));
user.setLastLoginDate(rt.getString("lastlogindate"));
user.setLastLoginIp(rt.getString("lastloginip"));
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return user;
}
public ArrayList selectById(String id){
String sql="select * from "+TABLE_NAME+" where id='"+id+"'";
ArrayList list=super.select(sql);
return list;
}

}

这样书写这两个dao的好处是,BaseDao只是加载一些配置信息,公共重复的sql操作,子类中只需要提供解析ResultSet到实体Bean的方法,那么只需要对sql和参数进行有效地封装就好了。虽然做的很粗糙,但是道理上的封装就是这样的。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值