zoukankan      html  css  js  c++  java
  • 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来保存它们,如果要修改他们,只需要修改配置文件即可。

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

  • 相关阅读:
    openssl-1.0.2s window下编译,生成dll
    webrtc中Native层视频解码器的创建过程
    webrtc收发音视频(createoffer的使用)
    webrtc中 video/audioTrack 架构解析
    让自己的vs工程能够使用webrtc库
    如何修改webrtc的工程(vs 2017)
    webrtc在windows下的编译
    ffserver在windows下的编译
    网络学习笔记(三):HTTP缓存
    Vue2.0源码阅读笔记(四):nextTick
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/12320428.html
Copyright © 2011-2022 走看看