文章目录
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文件内的关键字即可,减少了程序代码的修改,使程序更加灵活多变