JDBC—DAO mode
Foreword : The JDBC mentioned before is very troublesome due to the repeated creation of connections, closing resources, etc., so on the basis of the previous, we optimize it,Use interfaces, implementation classes, and configuration files to implement JDBC, and store query results in objects
DAO—DataBaseAccessObject (data access object) is an object-oriented database interface, which actually encapsulates JDBC
Features:
Next, let’s give an example
[Note: The following codes may have order issues]
dao layers
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 layer
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();
}
}
}
And StudentDao class
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 layer
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 + '\'' +
'}';
}
}
Configure the database file
1. Create a key resoureces folder
[Note: Create a resources folder in the project directory]
and set it as a resource folder
2. Create the key db.properties file
[Note: Why is the properties file, because Java has a special method to read the properties file]
The configuration information is as perkey=valueForm, write the
util layer
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);
}
}