JDBC总结及封装

本文总结了JDBC的概述,详细介绍了JDBC连接MySQL数据库的步骤,包括增删改查操作,并探讨了如何封装JDBC,利用属性文件、线程、连接池和反射等技术提高数据库操作的效率和便捷性。

JDBC 总结

JDBC概述

JDBC(Java DataBase Connectivity):java连接数据库技术,是一项由sun(java创始公司)发布的用于java连接数据库的通用标准,这套标准由一系列的接口(Connection,Statement,ResultSet等)构成,旨在屏蔽不同数据库之间的差异,使得开发者无需关注不同数据库系统之间的差异,简化java连接数据库的步骤。

JDBC操作数据库步骤(以mysql为例)

JDBC增删改操作
  1. 加载驱动(jdk4不在需要写,系统自动添加)
    Class.forName("com.mysql.jdbc.Driver");

  2. 获取连接

    -- mydb 是 mysql 下的一个数据库实例
    -- root是登入用户 
    -- 123456是登入密码
    Connection cn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","123456");
    
  3. 获取预处理对象

    //插入语句
    String sql = " insert into student values(1,'jok','男')";
    PreparedStatement ps =cn.prepareStatement(sql);
    
  4. 执行sql

    int i = ps.executeUpdate();
    
  5. 处理结果

    if(i>0) System.out.println("插入成功");
    
  6. 关闭资源

    ps.close();
    cn,close();
    
JDBC查询操作
//准备sql语句
String sql = "select * from emp where eno=?";
//获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb", "root", "123456");
//对SQL语句预处理(编译)并获取预处理对象
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1, 1001);
//执行查询
ResultSet rs = ps.executeQuery();
if(rs.next()){
    int no = rs.getInt("eno");
    String name = rs.getString("ename");
    BigDecimal sal = rs.getBigDecimal("sal");
    Date date = rs.getDate("hiredate");//java.sql.Date
    int dno = rs.getInt("dno");
    System.out.println(no+"/"+name+"/"+sal+"/"+date+"/"+dno);
}else{
    System.out.println("未查询到数据");
}
//关闭资源
rs.close();
ps.close();
conn.close();

JDBC的封装

封装了数据库的增删改查操作,其中运用到了属性文件、线程、连接池、反射等知识。

属性文件:

## mysql 
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mydb
user=root
password=123456
maxActive=10
minIdle=1
maxWait=10000
/**
 * 数据库工具类,包含一些操作数据库简便方法
 * 1.获取连接
 * 2.关闭资源
 * @author Administrator
 *
 */
public class DButils {
	public static  String driverClass;
	public static  String url;
	public static  String user;
	public static  String password;
	
	public static int maxActive;
	public static int mixIdle;
	public static long maxWait;
	
	private static DruidDataSource dataSource;
	
	static{
		init();
	}

	public static Connection getConn() {
		//判断连接池是否为空或者关闭,是就初始化
		if(dataSource == null || dataSource.isClosed())
		{
			init();
		}
		try {
			return dataSource.getConnection();
		} catch (SQLException e) {
		
			e.printStackTrace();
		}
		return null;
	}

	//初始化
	private static synchronized void init() {
		try {
			Properties prop = new  Properties();
			prop.load(new FileInputStream("src/jdbc.properties"));
			driverClass = prop.getProperty("driverClass");
			url = prop.getProperty("url");
			user = prop.getProperty("user");
			password = prop.getProperty("password");
			maxActive = Integer.parseInt( prop.getProperty("maxActive"));
			
			mixIdle = Integer.parseInt(prop.getProperty("minIdle"));
			maxWait = Long.parseLong(prop.getProperty("maxWait"));
			
			//创建数据源并配置
			dataSource = new DruidDataSource();
			dataSource.setDriverClassName(driverClass);
			dataSource.setUrl(url);
			dataSource.setUsername(user);
			dataSource.setPassword(password);
			dataSource.setMaxActive(maxActive);
			dataSource.setMinIdle(mixIdle);
			dataSource.setMaxWait(maxWait);
			
			
		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}	
	}
	
	//关闭连接池
	public static synchronized void closePool(){
		if(dataSource != null)
			dataSource.close();
	}
	/**
	 * 封装通用增删改操作
	 * @param url
	 * @return
	 */
	public static int exeUpdate(String sql,Connection conn,Object... params){
		
		PreparedStatement ps=null;
		int in=0;
		try {
	
			//编译sql语句获取预处理对象
			ps = conn.prepareStatement(sql);
			
			if(Objects.nonNull(params)){
				
				for(int i = 0;i< params.length;i++){
					
					ps.setObject(i+1, params[i]);
				}
			}
			in = ps.executeUpdate();
		
		} catch (SQLException e) {
		
			e.printStackTrace();
		}finally{
			//关闭资源
			close(null,ps,null);
		}
		return in;
		
	}
	
	/**
	 * 封装通用的查询集合操作,对于任何形式的查询,都能返回一个对象集合
	 * @param t 需要返回的数据类型
	 * @param sql 目标查询语句
	 * @param params 执行查询所需的参数
	 * @return 返回包含了指定对象的集合
	 */
	public  static <T> List<T> selectList(Class<T> t,String sql,Object... params){
				//声明空集合
				List<T> data = new ArrayList<>();
				//获取查询结果信息
				List<Map<String,Object>> list = getDataPair(sql, params);
				//判断集合是否为空
				if(list.isEmpty()){
					return data;
				}
				//遍历集合
				for(Map<String, Object> map : list)
				{
					//得到一个T类型对象
					T obj = parseMapToObj(map,t);
					//把得到的对象添加到集合data中
					data.add(obj);
				}
				return data;
	}

	/**
	 * 封装通用查询对象操作,对于任何形式的查询,都能返回一个确定的对象
	 * @param t 需要返回的数据类型
	 * @param sql 目标查询语句
	 * @param params 执行查询所需的参数
	 * @return 返回包含了指定对象
	 */
	public static <T> T selectOne(Class<T> t,String sql,Object... params){
		List<Map<String,Object>> list = getDataPair(sql, params);
		//判断集合不为空
		if(!list.isEmpty())
		{
			//得到一个map集合
			Map<String,Object> map = list.get(0);
			//把map集合里的数据转换成一个对象
			T obj = parseMapToObj(map,t);
			return obj;
		}
		return null;
	}

	/**
	 * 解析指定查询语句,并将获取的数据<列名,列值>以集合形式返回
	 * @param sql 查询语句
	 * @param params  参数列表
	 * @return
	 */
	private static List<Map<String,Object>> getDataPair(String sql,Object... params){
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;	
		List<Map<String,Object>> list = new ArrayList<>();
		try {
			conn = getConn();
			ps = conn.prepareStatement(sql);
			if(Objects.nonNull(params)){
				for(int i = 0;i<params.length;i++){
					ps.setObject(i+1, params[i]);
				}
			}
			
			rs = ps.executeQuery();
			//获取结果集源数据
			ResultSetMetaData rsmd = rs.getMetaData();
			//获取列总数,列名,标签名,列值,等相关数据存储到map集合
			int count = rsmd.getColumnCount();
			while(rs.next()){
				//对结果集每遍历一次,获取一条数据(即一个map对象)
				Map<String,Object> map = new HashMap<>();
				//遍历每一列
				for (int i = 1; i <= count; i++) {
					//获取列名称
					String columName = rsmd.getColumnName(i);
					//获取标签名(列别名)
					String columnLabel = rsmd.getColumnLabel(i);
					//获取列值
					Object value = rs.getObject(columnLabel);
					//当列值不为null是才将数据存入集合
					if(Objects.nonNull(value)){
						//将数据存入Map
						map.put(columName, value);
					}
				
				}
				//将map集合存入List
				list.add(map);
			}
			
		} catch (SQLException e) {
			
			e.printStackTrace();
		}finally{
			DButils.close(rs, ps, conn);
		}
		return list;
	}
	/**
	*把一个Map集合转换成一个对象
	*/
	private static <T> T parseMapToObj(Map<String, Object> map, Class<T> t) {
		T obj = null;
		try {
			//创建一个空实例
			obj = t.newInstance();
			//获取map集合的键集(所有列名,即要返回对象的属性名)
			Set<String> keys = map.keySet();
			for(String cname : keys){
				//获取属性对象
				Field f = t.getDeclaredField(cname);
				//获取set方法名称
				String setMethodName = "set"+cname.substring(0, 1).toUpperCase()+cname.substring(1);
				//获取set方法对象
				Method method = t.getMethod(setMethodName, f.getType());
				method.invoke(obj, map.get(cname));
			}
			
		} catch (InstantiationException | IllegalAccessException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			
			e.printStackTrace();
		} catch (SecurityException e) {
			
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			
			e.printStackTrace();
		}
		return obj;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值