封装BaseDao

BaseDao自己要封装一个类,这个类对数据库的数据进行增删改查,在这个类中需要写两个方法,一个是增删改,一个是查。

src/com/qf/utils/JdbcUtil

package com.qf.utils;

import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcUtil {
    private static String url = null;
    private static String user = null;
    private static String password = null;
    static{
        try {
            Properties properties = new Properties();
            properties.load(new FileInputStream("src/db.properties"));
            //数据都在properties对象中
            String diver = properties.getProperty("driver");
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            Class.forName(diver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection () {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url,user,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }








    public static void close(Connection connection){
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void close(Connection connection, Statement statement){
        try {
            statement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void close(ResultSet resultSet,Connection connection, Statement statement){
        try {
            resultSet.close();
            statement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

src/com/qf/utils/BaseDao

package com.qf.utils;

import org.apache.commons.beanutils.BeanUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/*
只有两个方法:
1.增删改
2.查
 */
public class BaseDao {
    /**
     * 增删改
     * @param sql   需要传入sql语句
     * @param parameters    对sql语句的?进行赋值
     * @return  受影响的行数
     */
    //String sql = "insert into work(name, age , info )values(?,?,?)";
    //Object[] objs = {"煮鸡蛋", 23,"csxddw"};
    //baseDao.update(sql,objs);
    
    
    
    public int update (String sql,Object[] parameters) {
        //1.获取数据库的连接的对象  从另外一个工具类中去获取的
        Connection connection = JdbcUtil.getConnection();
        //2.获取预处理的搬运工对象去预处理sql语句
        PreparedStatement preparedStatement = null;
        try {
            preparedStatement = connection.prepareStatement(sql);


            //3.现在要对sql语句的参数进行赋值,你知道有几个参数吗?
            //因为参数不确定
            //获取参数的个数  靠参数元数据
            int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
            System.out.println(parameterCount);
            //4.循环进行赋值
            //String sql = "insert into work (name,age,info)values(?,?,?)";
            //Object[] objs = {"gongdian",123,"qweqwewqe"};  3
            if(parameters != null && parameters.length == parameterCount ){
                //if条件 保证代码的健壮性
                for (int i = 1; i <= parameterCount ; i++) {
                    //i = 1      setObject(1, "gongdian")
                    //i = 2      setObject(2,12)
                    //i = 3      setObject(3,"qweqwewqe")
                    preparedStatement.setObject(i,parameters[i - 1]);
                }
            }
            //5.执行sql语句
            int i = preparedStatement.executeUpdate();
            return i;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.close(connection,preparedStatement);
        }
        return 0;

    }
    
    
    
    
    
    //查询的方法  咱们需要关注什么? 查询的数据是要赋值给一个实体类对象的

    /**
     *
     * @param sql
     * @param parameters
     * @param cls   查询出来的数据赋值给一个对象
     * @param <T>
     * @return
     */
    //super.query("select * from work where id = ?", null ,Work.class)
    public  <T> List<T> query(String sql, Object[] parameters, Class<T> cls){
        //1.连接数据库的对象 获取
        Connection connection = JdbcUtil.getConnection();
        //2.获取预处理的搬运工的对象

        PreparedStatement preparedStatement = null;
        ResultSet resultSet =null;
        try {
            preparedStatement = connection.prepareStatement(sql);

            //3.获取参数的个数
            int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
            //4.对?进行赋值
            if (parameters != null && parameters.length == parameterCount){
                for (int i = 1; i <= parameterCount ; i++) {
                    preparedStatement.setObject(i,parameters[i - 1]);
                }
            }
            //5,执行sql语句
            resultSet = preparedStatement.executeQuery();

            //6.创建一个空的集合
            List<T> list = new ArrayList<>();


            //7.获取结果集元数据,通过元数据获取字段的个数和字段的名字
            ResultSetMetaData metaData = resultSet.getMetaData();
            //8.通过元数据的对象  获取字段的个数
            int columnCount = metaData.getColumnCount();
            /**
             * id   name    a ge  info       《=
             * 1     狗蛋    12   大数据       《=
             * 2     嘻嘻    13   去问我去饿
             * 3     大话    14   全俄文全额
             */


            //9.遍历数据
            while(resultSet.next()){//往下遍历每一行的数据的
                //10.通过Class对象获取所对应的类对象
                //Work.class-> Work work = new Work()
                //Person.class-> Person person = new Person();
                T t = cls.getConstructor(null).newInstance(null);

                for (int i = 1; i <=columnCount ; i++) {//获取字段的
                    //11.获取列(字段)的名字
                    String columnName = metaData.getColumnName(i);
                    //System.out.println(columnName);
                    //12.通过字段获取值
                    Object value = resultSet.getObject(columnName);
//                    System.out.println(value);
                    //13.获取数据库的数据之后,将数据赋值给一个对象,得有类
                    //BeanUtils.setProperty(对象,属性,值)
                    BeanUtils.setProperty(t,columnName,value);
                }
                //14.每次while循环一次 存到集合中
                list.add(t);
            }
            return list.size() != 0 ? list : null;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //15.关闭资源
            JdbcUtil.close(resultSet,preparedStatement,connection);

    }
        return  null;
    }

}

src/com/qf/a_mysql/WorkDao

package com.qf.a_mysql;

import com.qf.entity.Work;
import com.qf.utils.BaseDao;

import java.util.List;
import java.util.function.Consumer;

public class WorkDao extends BaseDao {
    public void insert() {
        String sql = "insert into work(name,age,info)values(?,?,?)";
        Object[] objs = {"老玩玩",20,"xixihh"};
        super.update(sql,objs);
    }

    public void delete () {
        String sql = "delete from work where id = ?";
        Object[] objs = {4};
        super.update(sql,objs);
    }

    public void select(){
        String sql = "select * from work";
        List<Work> query = super.query(sql, null, Work.class);
        query.forEach((work)-> System.out.println(work));

        //Work.class
        //会将Work实例化,从数据库取出来数据,赋值给这个work对象
    }


}

src/com/qf/a_mysql/Demo1

package com.qf.a_mysql;

import com.qf.utils.BaseDao;
import com.qf.utils.JdbcUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Demo1 {
    public static void main(String[] args) throws SQLException {
        WorkDao workDao = new WorkDao();
       workDao.insert();
//        workDao.delete();
//        workDao.select();




    }
}

src/com/qf/entity/Work

package com.qf.entity;


public class Work {
    private Integer id;
    private String name ;
    private Integer age;
    private String info;

    public Work() {
    }

    public Work(Integer id, String name, Integer age, String info) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.info = info;
    }

    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 Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return "Work{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", info='" + info + '\'' +
                '}';
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值