JDBC的封装,Dao概念,vo概念

本文探讨了一层封装的通用数据库操作类优缺点,并介绍了二层封装的改进方法,通过Dao和Vo实现更好的可维护性。还涉及配置文件管理和示例代码,展示了如何使用Convert接口进行数据转换。

封装方式:

一层封装:封装一个通用类,方法包括了增删改查,参数是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;
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aigo-2021

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值