封装数据库DML,DQL操作——代码详解

本文详细讲解如何在Java中封装数据库的DML(增删改)和DQL(查询)操作,通过实例代码展示具体实现过程。

一、封装数据库DML操作

public class DB_utils {
    
	static final String URL = "jdbc:mysql://localhost:3306/dep ?serverTimezone=GMT";
	static final String USER = "root";
	static final String PWD = "password";

   - 封装加载驱动方法
	public static Connection getConnection() {
		Connection connection = null;
		try {

			Class.forName("com.mysql.cj.jdbc.Driver");
			connection = DriverManager.getConnection(URL, USER, PWD);

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return connection;
	}
    
    封装DML语句方法,调用该方法只需传sql语句和数组
	public static int execute(String sql,Object[] o) {
		Connection con = null;
		try {

			con = getConnection();
			PreparedStatement ps = con.prepareStatement(sql);
			if (o!=null && o.length>0) {
				for(int x=0;x<o.length;x++) {
					ps.setObject(x+1, o[x]);
				}
				int rows = ps.executeUpdate();
				return rows;
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}



		return 0;
	}
}

测试类:

public class Test {
	public static void main(String[] args) {
        String sql = "insert into student values (?,?)";
        Object[] o = new Object[2];
        o[0] = "001";
        o[1] = "李四";
        
        int rows = DB_utils.execute(sql, o);
        if(rows > 0)
        	System.out.println("成功");
        else
        	System.out.println("失败");
	} 
}

二、封装数据库DQL操作

//封装DQL操作

	
/****
	 * 执行DQL操作的方法,select
	 */
	public static <T> List<T> executeQuery(String sql,Object[] params,Class<T> clz) {
		List<T> list=new ArrayList<>();
		Connection conn=null;
		PreparedStatement pstat=null;
		ResultSet res=null;
		try {
			conn=getConn();
			//预编译sql语句
			pstat=conn.prepareStatement(sql);
			//给sql语句占位符赋值
			if(params!=null&&params.length>0) {
				for(int x=0;x<params.length;x++) {
					pstat.setObject(x+1, params[x]);
				}
			}
			//发送执行sql语句
			res = pstat.executeQuery();
			
			//获得clz对象封装的class文件中无参数构造方法
			Constructor<T>  constractor=clz.getConstructor(null);
			
			//获得ResultSetMetaData对象
			ResultSetMetaData rsmd = res.getMetaData();
			
			//获得虚拟表对应的列的数据
			int count = rsmd.getColumnCount();
			
			//遍历结果集ResultSet,将resultSet结果集转化为对象的集合
			while(res.next()) {
				//1 创建实体类对象对象,使用反射创建实体类对象
				T o=constractor.newInstance(null); 
				
				//2实体类属性赋值
				//2.1给几个属性赋值(有select语句产生虚拟表中列的数目决定)
				for(int x=0;x<count;x++) {
					//获得查询到列的名字(列名和属性名字一样),决定给那个属性赋值
					String columnName = rsmd.getColumnName(x+1);
					//获得属性对应的set方法的名字
					columnName=columnName.toLowerCase();
					String setXxx="set"+columnName.substring(0, 1).toUpperCase()
							+columnName.substring(1);
					
					//获得列对象的java类型,获得属性对应的set方法的参数类型
					String className = rsmd.getColumnClassName(x+1);
					//System.out.println(setXxx+"----"+className);
					
					//将className字符串表示的具体的数据类型转化为对应的Class对象
					Class<?> parameterType = Class.forName(className);
					
					//获得属性对应的公共的set方法setXxx对象
					Method set = clz.getDeclaredMethod(setXxx,parameterType);
					
					//获得数据查询到列对应的值
					Object value = res.getObject(x+1);
					
					//调用set方法完成对象属性赋值
					set.invoke(o, value);
				}
				
				//3 将s对象放入List集合
				list.add(o);
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally {
			try {
				res.close();
				pstat.close();
				conn.close();
			} catch (Exception ex) {
				// TODO: handle exception
				ex.printStackTrace();
			}
		}
		return list;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值