32 Dao层和impl层
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来保存它们,如果要修改他们,只需要修改配置文件即可。
这样也方便使用专门的一个工具(类)来获取它们。这个我们将在后面的文章中详解。