在进行数据库连接时,我们往往进行的是数据库的连接,关闭操作,执行sql语句书写在Dao层中操作
现对数据库操作进行封装,通过动态参数进行传递对象,
通过自建泛型实现返回类的接收,现程序如下:
/************************************************************ Copyright (C), 1988-1999, Huawei Tech. Co., Ltd. FileName:JDBCUtil.java Author: Light Version : version 1.0 Date: 2018/7/12 Description: jdbc链接数据库的封装// 模块描述 Version: 通过模块化实现jdbc连接数据库操作,减少开发代码关于数据库操作的编写量// 版本信息 Function List: // 主要函数及其功能 1.getConnection 进行数据库的链接 2.close 进行数据库的关闭 3.executeUpdate 执行数据的增删改 4.executeQuery执行数据的查询 History: // 历史修改记录 <author> <time> <version > <desc> David 96/10/12 1.0 build this moudle ***********************************************************/ public class JDBCUtil { //链接地址,设置编码可用且为utf-8 public static String URL="jdbc:mysql://192.168.80.131:3306/db1?useUnicode=true&characterEncoding=utf8"; //数据库用户名 public static String USER="root"; //数据库密码 public static String PWD="123456"; /* *进行数据库的链接 */ public static Connection getConnection(){ Connection con=null; try { //加载驱动 Class.forName("com.mysql.jdbc.Driver"); //创建链接 con=DriverManager.getConnection(URL, USER, PWD); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //返回连接 return con; } /* *数据库关闭 */ public static void Close(Connection con,PreparedStatement pstmt,ResultSet rs){ try { //判断是否被操作 if(rs!=null) rs.close(); if(pstmt!=null) pstmt.close(); if(con!=null) con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* *创建数据库执行操作,返回受影响的行数 *@param String sql *@param Object params *@return int result */ public static int executeUpdate(String sql,Object... params){ //创建链接 Connection con=getConnection(); PreparedStatement pstmt=null; int result=0; try { //预编译sql语句,防止sql注入 pstmt=con.prepareStatement(sql); //传递参数,如果参数存在 if(params!=null){ //进行循环传参 for(int i=0;i<params.length;i++){ pstmt.setObject(i+1, params[i]); } } //执行sql语句,返回受影响行数 result=pstmt.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ Close(con,pstmt,null); } return result; } /* *进行数据的查询,通过自建泛型RowMap,进行数据类型的定义 *@param String sql *@param RowMap T *@param Object params *@return list<T> */ public static <T> List<T> executeQuery(String sql,RowMap<T> rowMap,Object... params){ //创建泛型List List<T> list=new ArrayList<>(); //创建链接 Connection con=getConnection(); PreparedStatement pstmt=null; ResultSet rs=null; try { //绑定sql语句 pstmt=con.prepareStatement(sql); //循环穿参 if(params!=null){ for(int i=0;i<params.length;i++){ pstmt.setObject(i+1, params[i]); } } //执行语句,用结果集接收 rs=pstmt.executeQuery(); while(rs.next()){ //利用自建泛型实现数组的添加 T t=rowMap.rowMapping(rs); list.add(t); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ Close(con,pstmt,rs); } return list; } //使用示例函数 public static int update(){ return executeUpdate("insert into student(name,age,sex) values(?,?,?)","姓名",12,"男");
}
}
自定义自建泛型
import java.sql.ResultSet; //自建泛型,实现rowMappping返回T类型 public interface RowMap<T> { public T rowMapping(ResultSet rs); }