JDBC---DAO模式

JDBC—DAO模式

前言:之前讲的JDBC由于要反复创建连接、关闭资源等,很是麻烦,所以在之前的基础上,我们优化一下,利用接口、实现类和配置文件来实现JDBC,并将查询结果存储到对象中

DAO—DataBaseAccessObject(数据访问对象),是一种面向对象的数据库接口,实际是将JDBC进行封装

特点:
在这里插入图片描述
接下来我们举个实例

【注意:以下代码可能有先后顺序问题】

dao层

package dao;

public interface BaseDao {
    //声明一些会经常使用的方法
    void getConn(String Driver,String url,String username,String passwd);		//创键连接
    void query(String sql,String... params);									//查询
    boolean update(String sql,String... params);								//增删改
    void close();																//关闭资源
}

Impl层

package dao.impl;

import dao.BaseDao;
import java.sql.*;

public class BaseDaoImpl implements BaseDao {				//BaseDao的实现类
    private Connection conn;
    private PreparedStatement ps;
    private ResultSet rs;

    public ResultSet getRs() {
        return rs;
    }

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

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

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

    @Override
    public void close() {
        try {
            if(null!=rs)		//偷懒的写法
                rs.close();
            if(null!=ps)
                ps.close();
            if(null!=conn)
                conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

和 StudentDao类

package dao.impl;

import entity.Student;
import util.Prop;
import java.sql.ResultSet;
import java.sql.SQLException;

public class StudentDao extends BaseDaoImpl {

    //从配置文件中数据库读取信息
    private final String DRIVER = Prop.getValue("DRIVER");
    private final String URL = Prop.getValue("URL");
    private final String USERNAME = Prop.getValue("USERNAME");
    private final String PASSWORD = Prop.getValue("PASSWORD");

    //根据学生ID查询所有信息
    public Student getStudentById(String id){
        String sql = "select * from student where stuId  = ?";
        getConn(DRIVER,URL,USERNAME,PASSWORD);
        query(sql,id);
        ResultSet rs = getRs();
        Student s = new Student();
        try {
            if(rs.next()){
                s.setStuId(rs.getInt("stuID"));
                s.setStuName(rs.getString("stuName"));
                s.setGradeId(rs.getInt("gradeId"));
                s.setStuGender(rs.getString("stuGender"));
                s.setStuAddr(rs.getString("stuAddr"));
                s.setStuPhone(rs.getString("stuPhone"));
                s.setStuIdcard(rs.getString("stuIdcard"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close();
        }
        return s;
    }

    //插入数据
    public void insertInfo(String id,String name,String gradeid,String gender){
        String sql = "insert into student (stuId,stuName,gradeId,stuGender)values(?,?,?,?)";
        getConn(DRIVER,URL,USERNAME,PASSWORD);
        update(sql,id,name,gradeid,gender);
    }

    public static void main(String[] args) {				//测试类
        StudentDao dao = new StudentDao();
        //dao.insertInfo("10","宋慧乔","3","女");
        Student student = dao.getStudentById("10");
        System.out.println(student);
    }

}

entity层

package entity;

public class Student {		//根据表格的字段属性创键实体类
    private int stuId;
    private String stuName;
    private int gradeId;
    private String stuGender;
    private String stuAddr;
    private String stuPhone;
    private String stuIdcard;

    public int getStuId() {
        return stuId;
    }

    public void setStuId(int stuId) {
        this.stuId = stuId;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public int getGradeId() {
        return gradeId;
    }

    public void setGradeId(int gradeId) {
        this.gradeId = gradeId;
    }

    public String getStuGender() {
        return stuGender;
    }

    public void setStuGender(String stuGender) {
        this.stuGender = stuGender;
    }

    public String getStuAddr() {
        return stuAddr;
    }

    public void setStuAddr(String stuAddr) {
        this.stuAddr = stuAddr;
    }

    public String getStuPhone() {
        return stuPhone;
    }

    public void setStuPhone(String stuPhone) {
        this.stuPhone = stuPhone;
    }

    public String getStuIdcard() {
        return stuIdcard;
    }

    public void setStuIdcard(String stuIdcard) {
        this.stuIdcard = stuIdcard;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuId=" + stuId +
                ", stuName='" + stuName + '\'' +
                ", gradeId=" + gradeId +
                ", stuGender='" + stuGender + '\'' +
                ", stuAddr='" + stuAddr + '\'' +
                ", stuPhone='" + stuPhone + '\'' +
                ", stuIdcard='" + stuIdcard + '\'' +
                '}';
    }
}

配置数据库文件
1、创键resoureces文件夹
【注意:在工程目录下创建resources文件夹】
在这里插入图片描述
然后将它设置为资源文件夹
在这里插入图片描述

2、创键db.properties文件
【注意:为什么是properties文件,是因为Java有专门读取properties文件的方法】

配置信息按照key=value形式,进行书写在这里插入图片描述
util层

public class Prop {
    static Properties p = new Properties(); 		//Java专门加载配置文件
    static {
            try {
                p.load(new FileInputStream("resources/db.properties"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    public static String getValue(String key){
        return p.getProperty(key);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43288259/article/details/114536646