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;
    	}
    }
    

      

  • 相关阅读:
    hdu 1269 迷宫城堡 (并查集)
    hdu 1272 小希的迷宫 (深搜)
    hdu 1026 Ignatius and the Princess I (深搜)
    hdu 1099 Lottery
    hdu 1068 Girls and Boys (二分匹配)
    几个基础数位DP(hdu 2089,hdu 3555,uestc 1307 windy 数)
    hdu 1072 Nightmare (广搜)
    hdu 1398 Square Coins (母函数)
    hdu 1253 胜利大逃亡 (深搜)
    hdu 1115 Lifting the Stone (求重心)
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/12322378.html
Copyright © 2011-2022 走看看