Dao层是啥
dao层又称数据访问层,全称为data Access object ,属于一种比较底层,比较基础的操作,具体到对某个表、某个实体的增删改查。
在java项目中,我们通常单独使用一个包来代表dao层,例如:com.xxx.xxx.dao
dao层主要用来对数据库的表进行增删改查,每一个表用一个类来操作。通常还会把dao层细分为两个子层,一个inter包用来做接口,一个impl包用来实现inter包中的各接口。

来我们做个实例
有一个学生表如:

我们在eclipse中写相应的dao层如:
package com.xiaohei.daoimpl;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import com.xiaohei.pojo.Student;
public class StudentDaoImpl {
private Connection conn =null;
private PreparedStatement stmt = null;
private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:thin:@localhost:1521:XE";
private String user;
private String password;
private ArrayList<Student> list;
public StudentDaoImpl(String user, String password) {
super();
this.user = user;
this.password = password;
//执行加载驱动 建立连接 创建statement对象的方法
init(url,user,password);
}
/**
* 初始化数据库连接
* @param url
* @param user
* @param password
*/
private void init(String url, String user, String password) {
//加载驱动
try {
Class.forName(driver);
//建立连接
conn = DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
}
}
/**
* 增加一个学生通过姓名,年龄和金钱
* @param sname 学生姓名,sage 学生年龄,money 钱
* @return i 返回-1表示失败,返回其它值表示成功执行的SQL语句条数
*/
public int insertStu(String sname,int sage,double money) {
try {
//sql语句
String sql = "insert into student values(stu_seq.nextval,?,?,?)";
//创建执行对象
stmt = conn.prepareStatement(sql);
//设置占位符
stmt.setString(1, sname);
stmt.setInt(2, sage);
stmt.setDouble(3, money);
//执行SQL语句
int i = stmt.executeUpdate();
//手动提交
conn.commit();
//处理结果
return i;
}catch(SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return -1;
}
/**
* 删除学生按指定的学号
* @param sno 学生学号
* @return i 返回-1表示失败,返回其它值表示成功执行的SQL语句条数
*/
public int deleteStu(int sno) {
try {
//SQL语句
String sql ="delete student where sno=?";
//stmt对象
stmt= conn.prepareStatement(sql);
//占位符赋值
stmt.setInt(1, sno);
//执行SQL
int i = stmt.executeUpdate();
//手动提交
conn.commit();
//处理结果
return i;
}catch(SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return -1;
}
/**
* update操作:修改学生姓名,年龄和金钱 通过 学生sno
* @param sno 学生学号
* @return
*/
public int updateStu(int sno,String sname,int sage,double money) {
try {
//sql语句
String sql = "update student set sname=?,sage=?,money=? where sno=?";
//stmt对象
stmt=conn.prepareStatement(sql);
//占位符赋值
stmt.setString(1,sname);
stmt.setInt(2,sage);
stmt.setDouble(3,money);
stmt.setInt(4,sno);
//执行sql
int i = stmt.executeUpdate();
//手动提交
conn.commit();
//处理结果
return i;
}catch(SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return -1;
}
/**
* 查询
* @return 返回一个ArrayList<Student>对象
*/
public ArrayList<Student> queryStu(){
list = new ArrayList<>();
try {
//SQL语句
String sql = "select * from student order by sno";
//stmt对象
stmt = conn.prepareStatement(sql);
//占位符赋值
//执行SQL
ResultSet set = stmt.executeQuery();
//处理结果
while(set.next()) {
Student s = new Student();
s.setSno(set.getInt("sno"));
s.setSage(set.getInt("sage"));
s.setSname(set.getString("sname"));
s.setMoney(set.getDouble("money"));
list.add(s);
}
return list;
}catch(SQLException e) {
e.printStackTrace();
}
return list;
}
}
以上代码中,我们看到driver、url、user和password这四个数据,将来很容易变动,我们建议使用一个配置文件properties来保存它们,如果要修改他们,只需要修改配置文件即可。
这样也方便使用专门的一个工具(类)来获取它们。这个我们将在后面的文章中详解。