zoukankan      html  css  js  c++  java
  • 34 jdbc工具封装

    java是一门面向对象的语言,对于重复的代码,我们能封装就封装,在32节中,我们写了student表的的dao层,能用,但有很多重复代码,比如加载驱动,获取Connection对象等,我们可以将它们封装到一个类中。

    同样地,我们创建一个Util包用来存放封装的工具,创建一个JdbcUtil类用来封装我们的jdbc相关的重复代码。

    properties配置文件

    我们将加载jdbc的关键数据:driver 驱动器类全地址,url,username数据库登录用户名,password对应密码 封装在一个文件中,起名db.properties 放在src目录下。

    注意:文件中的内容应为:属性=属性名形式,多个属性直接回车换行隔开,不适用引号,不留空格。如下:

    JdbcUtil类设计思路

    • 声明配置文件对应的四个变量
    • 静态块加载 读取db.properties文件给上面四个变量赋值,加载驱动面
    • 创建下满几个方法:
      • getConnection()  获取Connection对象
      • getStatement()  获取Statement对象,只用在查询上(如果用在增删改无法避免sql注入)
      • getPreparedStatement() 获取PreparedStatement对象,用在增删改上
      • executeDML()  执行SQL语句的方法
      • closeAll() 关闭资源的方法

    需要注意的知识点

    获取db.properties文件中的属性

    • 使用Properties类配合配置文件的输入流获取属性
    • 动态获取文件流:当前类名.class.getResourceAsStream(相对地址);
    • 获取属性:Properties对象.getProperty(属性名)

    完整代码

    package com.xiaohei.tools;
    
    import java.io.IOException;
    import java.io.InputStream;
    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.Properties;
    
    public class JdbcUtil {
    	//声明jdbc参数
    	private static String driver = null;
    	private static String url = null;
    	private static String username = null;
    	private static String password = null;
    	
    	static {
    		//创建properties对象获取属性问价的内容
    		Properties p = new Properties();
    		//获取属性文件的读取流对象(动态获取资源)
    		InputStream is = JdbcUtil.class.getResourceAsStream("/db.propreties");
    		try {
    			//加载配置文件
    			p.load(is);
    			driver = p.getProperty("driver");
    			url = p.getProperty("url");
    			username = p.getProperty("username");
    			password = p.getProperty("password");
    			
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		//加载驱动
    		try {
    			Class.forName(driver);
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	//获取conn
    	public static Connection getConnection() {
    		Connection conn =null;
    		try {
    			 conn = DriverManager.getConnection(url,username,password);
    			 conn.setAutoCommit(false);
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return conn;
    	}
    	//获取statement
    	public static Statement getStatement(Connection conn) {
    		
    		Statement stmt = null;
    		try {
    			stmt = conn.createStatement();
    			return stmt;
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return stmt;
    	}
    	//获取PreparedStatement
    	public static PreparedStatement getPreparedStatement(Connection conn,String sql) {
    		PreparedStatement stmt = null;
    		try {
    			stmt  = conn.prepareStatement(sql);
    			return stmt;
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return null;
    		
    	}
    	
    	//DML方法
    	public static int executeDML(String sql,Object...objs) {
    		//创建连接对象
    		Connection conn = getConnection();
    		//创建ps对象
    		PreparedStatement ps = JdbcUtil.getPreparedStatement(conn,sql);
    		//给占位符赋值
    		for(int i=0;i<objs.length;i++) {
    			try {
    				ps.setObject(i+1, objs[i]);
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		//执行SQL命令
    		int i = -1;
    		try {
    			i = ps.executeUpdate();
    			//手动提交
    			conn.commit();
    		} catch (SQLException e) {
    			try {
    				conn.rollback();
    			} catch (SQLException e1) {
    				e1.printStackTrace();
    			}
    			e.printStackTrace();
    		}
    		//关闭资源
    		JdbcUtil.closeAll(null,ps,conn);
    		//返回结果
    		return i;
    	}
    		
    		
    		
    	
    
    	public static void closeAll(ResultSet rs, PreparedStatement ps, Connection conn) {
    		try {
    			if(rs!=null) {
    				rs.close();
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		try {
    			ps.close();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		try {
    			conn.close();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

      

    StudentDaoImpl的修改

    代码:

    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;
    import com.xiaohei.tools.JdbcUtil;
    
    public class StudentDaoImpl {
    	private ArrayList<Student> list;
    	public StudentDaoImpl() {
    
    	}
    	
    	/**
    	 * 增加一个学生通过姓名,年龄和金钱
    	 * @param sname 学生姓名,sage 学生年龄,money 钱
    	 * @return i 返回-1表示失败,返回其它值表示成功执行的SQL语句条数
    	 */
    	public int insertStu(String sname,int sage,double money) {
    		//sql语句
    		String sql = "insert into student values(stu_seq.nextval,?,?,?)";
    		//执行SQL语句
    		int i = JdbcUtil.executeDML(sql, sname,sage,money);
    		//处理结果
    		return i;
    	}
    	
    	/**
    	 * 删除学生按指定的学号
    	 * @param sno 学生学号
    	 * @return i 返回-1表示失败,返回其它值表示成功执行的SQL语句条数
    	 */
    	public int deleteStu(int sno) {
    		//sql
    		String sql = "delete from student where sno =?";
    		//执行SQL
    		int i = JdbcUtil.executeDML(sql, sno);
    		//处理结果
    		return i;
    	}
        
    	/**
    	 * update操作:修改学生姓名,年龄和金钱 通过 学生sno
    	 * @param sno 学生学号
    	 * @return
    	 */
    	public int updateStu(int sno,String sname,int sage,double money) {
    		//sql语句
    		String sql = "update student set sname=?,sage=?,money=? where sno=?";
    		int i = JdbcUtil.executeDML(sql,sname,sage,money,sno);
    		//处理结果
    		return i;
    	}
    	
    	/**
    	 * 查询
    	 * @return 返回一个ArrayList<Student>对象
    	 */
    	public ArrayList<Student> queryStu(){
    		list = new ArrayList<>(); 
    		Connection conn = null;
    		try {
    			conn = JdbcUtil.getConnection();
    			//SQL语句
    			String sql = "select * from student order by sno";
    			//stmt
    			Statement stmt = JdbcUtil.getStatement(conn);
    			ResultSet set = stmt.executeQuery(sql);
    			//处理结果
    			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;
    	}
    }
    

      

  • 相关阅读:
    Hander
    N皇后问题--递归回溯
    NYOJ-571 整数划分(三)
    递归--递推之组合数
    深搜最基础题---全排列And组合数
    递归---NYOJ-176 整数划分(二)和NYOJ-279队花的烦恼二
    递归---NYOJ-90整数划分(一)
    线段树---HDU2795Billboard
    输入输出外挂
    线段树---HDU1394Minimum Inversion Number
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/12322378.html
Copyright © 2011-2022 走看看