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来保存它们,如果要修改他们,只需要修改配置文件即可。

这样也方便使用专门的一个工具(类)来获取它们。这个我们将在后面的文章中详解。

posted @ 2020-02-17 09:47  Scorpicat  阅读(5820)  评论(0编辑  收藏  举报