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);
}
}