Java JDBC(二)DAO模式

DAO模式

DAO模式介绍

Data Access Object(数据存取对象)
位于业务逻辑和持久化数据之间
实现对持久化数据的访问

DAO起着转换器的作用,将数据在
实体类和数据库记录之间进行转换

DAO模式的组成

在这里插入图片描述

代码实现例子:

1、新建一个BaseDAO接口

里面把需要用到的方法名称先设置好
代码如下:

public interface BaseDAO {
    
    
    void getConn(String driver,String url,String user,String pwd);
    void query(String sql,String... params);
    boolean update(String sql,String... params);
    void close();
}

2、创建BaseDAO接口的实现类BaseDAOImpl

把BaseDAO接口内的每个方法具体实现完善出来
代码如下:

public class BaseDAOImpl implements BaseDAO {
    
    
    private Connection conn;
    private PreparedStatement pst;
    private ResultSet rs;

    public ResultSet getRs() {
    
    
        return rs;
    }

    @Override
    public void getConn(String driver, String url, String user, String pwd) {
    
    
        try {
    
    
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
    
    
            e.printStackTrace();
        }
        try {
    
    
            conn = DriverManager.getConnection(url,user,pwd);
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }
    }

    @Override
    public void query(String sql, String... params) {
    
    
        try {
    
    
            pst=conn.prepareStatement(sql);
            for (int i = 0; params!=null && i < params.length; i++) {
    
    
                pst.setObject(i+1,params[i]);
            }
            rs=pst.executeQuery();
        }
        catch (SQLException e) {
    
    
            e.printStackTrace();
        }


    }

    @Override
    public boolean update(String sql, String... params) {
    
    
        int num=0;
        try {
    
    
            pst=conn.prepareStatement(sql);
            for (int i = 0; params!=null && i < params.length; i++) {
    
    
                pst.setObject(i+1,params[i]);
            }
            num=pst.executeUpdate();
        }
        catch (SQLException e) {
    
    
            e.printStackTrace();
        }
        return num>0;
    }

    @Override
    public void close() {
    
    
        try {
    
    
            if (rs!=null)
            rs.close();
            if (pst!=null)
                pst.close();
            if (conn!=null)
                conn.close();
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }
    }
}

3、新建properties文件

在project内新建一个resources文件夹,并新建一个文件名为db.properties的文件,在idea的Project Structrue中设置为资源文件夹(很重要,一定不能忘记设置!!!)
在这里插入图片描述
在db.properties文件中将关键字写入进去,对应提前设置好的mysql表内容

在这里插入图片描述

4、创建Properties类

创建一个Properties类的方法来实现对源文件内容的读取
用static方法的好处是可以优先生成对象

public class Prop {
    
    
    static Properties p=new Properties();
    static {
    
    
        try {
    
    
            p.load(new FileInputStream("resources/db.properties"));
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
    public static String getValue(String key){
    
    
       return p.getProperty(key);
    }
}

5、创建一个student类

用来存储数据
代码如下:

public class Student {
    
    
    private int stu_id;
    private String stu_name;
    private int grade_id;
    private String gender;
    private String address;
    private String phone;
    private String idCard;

    @Override
    public String toString() {
    
    
        return "Student{" +
                "stu_id=" + stu_id +
                ", stu_name='" + stu_name + '\'' +
                ", grade_id=" + grade_id +
                ", gender='" + gender + '\'' +
                ", address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                ", idCard='" + idCard + '\'' +
                '}';
    }

    public int getStu_id() {
    
    
        return stu_id;
    }

    public void setStu_id(int stu_id) {
    
    
        this.stu_id = stu_id;
    }

    public String getStu_name() {
    
    
        return stu_name;
    }

    public void setStu_name(String stu_name) {
    
    
        this.stu_name = stu_name;
    }

    public int getGrade_id() {
    
    
        return grade_id;
    }

    public void setGrade_id(int grade_id) {
    
    
        this.grade_id = grade_id;
    }

    public String getGender() {
    
    
        return gender;
    }

    public void setGender(String gender) {
    
    
        this.gender = gender;
    }

    public String getAddress() {
    
    
        return address;
    }

    public void setAddress(String address) {
    
    
        this.address = address;
    }

    public String getPhone() {
    
    
        return phone;
    }

    public void setPhone(String phone) {
    
    
        this.phone = phone;
    }

    public String getIdCard() {
    
    
        return idCard;
    }

    public void setIdCard(String idCard) {
    
    
        this.idCard = idCard;
    }
}

6、创建一个studentDao类

作为main方法,具体实施对数据库的增删改查功能
具体代码如下:

public class StudentDao extends BaseDAOImpl {
    
     //假装这里已经做了接口
    private final String Driver= Prop.getValue("driver");
    private final String url=Prop.getValue("url");
    private final String user=Prop.getValue("user");
    private final String pwd=Prop.getValue("pwd");
    //根据学生id查询所有信息
    public Student getStudentById(String id){
    
    
        String sql="select * from student where stu_id=?";
        getConn(Driver,url,user,pwd);
        query(sql,id);
        ResultSet rs=getRs();
        //Data Access Object
        Student s=new Student();
        try {
    
    
            if (rs.next()){
    
    
                s.setStu_id(rs.getInt("stu_id"));
                s.setStu_name(rs.getString("stu_name"));
                s.setGrade_id(rs.getInt("grade_id"));
                s.setGender(rs.getString("gender"));
                s.setAddress(rs.getString("address"));
                s.setPhone(rs.getString("phone"));
                s.setIdCard(rs.getString("idCard"));
            }
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            close();
        }
        return s;
    }
    public void insertInto(String stu_id,String stu_name,String grade_id,String gender){
    
    
        String sql1="insert into student(stu_id,stu_name,grade_id,gender) values(?,?,?,?)";
        getConn(Driver,url,user,pwd);
        update(sql1,stu_id,stu_name,grade_id,gender);
    }

    public static void main(String[] args) {
    
    
        StudentDao dao=new StudentDao();
//        dao.insertInto("14","虚竹","3","男");
//        Student student=dao.getStudentById("14");
//        System.out.println(student);


        Student student1=dao.getStudentById("14");
        System.out.println(student1);
    }
}

7、总结

使用properties文件的方法优点在于灵活多变,在需要对数据库地址进行变更或者访问多个数据库时,只需要修改properties文件内的关键字即可,减少了程序代码的修改,使程序更加灵活多变

猜你喜欢

转载自blog.csdn.net/giantleech/article/details/114539242