封装方式:
一层封装:封装一个通用类,方法包括了增删改查,参数是SQL语句。
例如:
//通用的数据库操作类
public class CommonData {
public int insert(String sql,Object[] values) {
return 0;
}
public int update(String sql,Object[] values) {
return 0;
}
public int delete(String sql,Object[] values) {
return 0;
}
}
优点:只要写一个类就可以对所有表进行增删改查的操作。
缺点:把SQL语句暴露在业务层,如果表结构发生了改变,需要修改SQL语句,业务层就要改大量的SQL语句。可 维护性差。
二层封装:将SQL语句封装在类中,为每个表编写一个数据库增删改查的方法的类
优点:SQL语句封装,维护性好
缺点:要写很多的数据库处理类
Dao概念
Database Access Object 数据库访问对象,当要对数据库表操作时,面向的是Dao对象,Dao类中提供了增删改查 方法
vo概念
Value Object 封装了值的对象。属于实体对象。 VO类的结构尽量与数据库表的结构相同,就可以抽象一个VO对象 就抽象为表中的一条记录。
配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/sql0120?characterEncoding=utf8
user=root
password=root
User类
package com.oracle.vo;
public class User {
private int userid;
private String loginname;
private String userpwd;
private String realname;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getLoginname() {
return loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
public String getUserpwd() {
return userpwd;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
}
转换器 Convert接口
import java.sql.ResultSet;
/**
* 转换器
*将结果集填充到vo对象中
*/
public interface Convert<T> {
public T convert(ResultSet rs);
}
通用数据库操作类
package com.oracle.dao;
import com.oracle.vo.User;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
//通用数据库操作类
public class CommonDate {
//属性
Connection con;
PreparedStatement stmt;
ResultSet rs;
static String driver;
static String url;
static String user;
static String password;
//第一层封装
static {
//读配置文件
ResourceBundle bundle=ResourceBundle.getBundle("db");
driver=bundle.getString("driver");
url=bundle.getString("url");
user=bundle.getString("user");
password=bundle.getString("password");
//重复用到的内容,写在静态游离块中
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public int insert(String sql,Object[] values){
getConnection();
int result=0;
//预编译:带问号
try {
stmt=con.prepareStatement(sql);
//设置预编译参数值
for(int i=0;i<values.length;i++){
stmt.setObject(i+1,values[i]);
}
//执行
result=stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
public int update(String sql,Object[] values){
//调用insert
return insert(sql,values);
}
public int delete(String sql,Object[] values){
return insert(sql,values);
}
//按条件查询
public <T> List<T> select(String sql, Object[] values,Convert<T> convert){
List<T> list =new ArrayList<T>();
getConnection();
try {
stmt=con.prepareStatement(sql);
for(int i=0;i<values.length;i++){
stmt.setObject(i+1,values[i]);
}
rs= stmt.executeQuery();
//遍历结果集
while(rs.next()){
T t=convert.convert(rs);
list.add(t);
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//封装方法:获得连接
public Connection getConnection(){
try {
con= DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
public static void main(String[] args) {
//向学生表插入一条数据
String sql="insert into T_Users(userid,loginname,userpwd,realname) values(?,?,?,?)";
Object[] values=new Object[]{2,"liubei","liubei","刘备"};
CommonDate cdate=new CommonDate();
//受影响的行数
System.out.println(cdate.insert(sql,values));
/*
//修改userid是2的用户,改成andy,tiger,‘安迪’;
String sql="update T_Users set loginname=? userpwd=? realname=? where userid=?";
Object[] values=new Object[]{"andy","tiger","安迪",2};
CommonDate cdate=new CommonDate();
System.out.println(cdate.update(sql,values));
//删除userid是3的用户
String sql="delete from T_Users userid=?";
Object[] values=new Object[]{3};
CommonDate cdate=new CommonDate();
System.out.println(cdate.update(sql,values));
*/
//显示所有人的信息
List<User> list =cdate.select("select * from T_Users",new Object[]{},new UserConvert());
for(User s:list){
System.out.println(s.getUserid());
System.out.println(s.getLoginname());
System.out.println(s.getUserpwd());
System.out.println(s.getRealname());
}
}
}
class UserConvert implements Convert<User>{
@Override
public User convert(ResultSet rs) {
User s=new User();
try {
s.setUserid(rs.getInt("userid"));
s.setRealname(rs.getString("loginname"));
s.setRealname(rs.getString("userpwd"));
s.setRealname(rs.getString("realname"));
} catch (SQLException e) {
e.printStackTrace();
}
return s;
}
}
本文探讨了一层封装的通用数据库操作类优缺点,并介绍了二层封装的改进方法,通过Dao和Vo实现更好的可维护性。还涉及配置文件管理和示例代码,展示了如何使用Convert接口进行数据转换。
556

被折叠的 条评论
为什么被折叠?



