通用的CURD操作提取,模拟DBUtils

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39531549/article/details/82796016

一、增删改通用方法提取

1、通用的crud方法的提取

(1)使用传统方式实现crud操作,实现之后比较如何进行提取

(2)通用的增加修改和删除方法的提取(****)
	* 在这些操作里面,不同的部分有两部分
	- 第一部分是 ,sql语句不同
	- 第二部分是,设置的参数个数或者参数的值不同
	- 其他的部分都相同的

	* 如何进行提取?
	- 首先让sql语句通过参数传递进来
	- 其次让参数通过可变参数进行设置(可变参数理解为一个数组)
		-- 如果通过可变参数,把值设置进去?
		-- 第一步:获取参数的数量 使用参数元数据里面方法进行获取
		-- 第二步:设置值,使用方法是setObject设置,setObject(i,数组的下标得到可变参数里面的值)


 -代码演示
	 public class TestAUD {
		
		public static void main(String[] args) {
			String sql="insert into user values(?,?,?)";
			myTestAUD(sql, 1,"小苍",8787);
			String sql1 = "update user set salary=? where id=?";
			myTestAUD(sql1, 9898,2);
			String sql2 = "delete from user where id=?";
			myTestAUD(sql2, 3);
			
		}
		
		//通用的增加修改删除的方法
		//首先传递两个参数,一个是可变参数
		//关于可变参数:只能写在参数列表最后,且只能有一个可变参数,只能在参数列表中,不能单独定义
		//可变参数相当于数组,通过数组下标获取值
		public static void myTestAUD(String sql ,Object...o){
			Connection conn = null;
			PreparedStatement pst = null;
			try{
				//通过连接池建立连接
				conn = JDBCUtils.getConnection();
				//预编译
				pst = conn.prepareStatement(sql);
				
				//获取参数个数,得到参数元数据,循环,向里面设置值
				for(int i=1;i<=pst.getParameterMetaData().getParameterCount();i++){
					pst.setObject(i, o[i-1]);
				}
				
				int executeUpdate = pst.executeUpdate();
				
				if(executeUpdate>0){
					System.out.println("执行成功");
				}else{
					System.out.println("执行失败");
				}				
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				//释放资源
				JDBCUtils.releaseResource(conn, pst);
			}
		}	
	}

二、查询方法的提取(******)

(3)通用的查询的方法的提取
*因为通用方法里面的三处不同点,其中处理结果集的地方不同和返回类型,所以定义泛型接口,实现泛型接口里面的处理结果集的方法即可实现通用的查询方法。
	
		-总结:当发现通用性代码时,里面有部分功能时不通用的,这个时候就定义接口,传到方法中,让调用者自己按照自己需要的去处理这个功能。接口方法让调用者重写功能

 -处理结果集的接口
	public interface ResultSetHandler<T> {

		T handler(ResultSet rs) throws Exception;
	}

 -代码演示
	/***
	 * 实现通用的查询方法的提取,
	 * 
	 * 	查询语句有三处不同的地方。
	 * 		-sql语句
	 * 		-参数个数
	 * 		-数据封装的过程
	 * @author XiaYuJia
	 *
	 */
	public class TestSelect {
		
		public static <T> void main(String[] args) {
			
			/*//调用查询方法,把数据封装到list里面
			List<User> listuser  = query("select * from user", new ResultSetHandler<List<User>>() {
				List<User> list = new ArrayList<User>();
				public List<User> handler(ResultSet rs) throws Exception {
					//封装数据
					while(rs.next()){
						//把记录放到对象里面
						User user = new User();
						user.setId(rs.getInt(1));
						user.setName(rs.getString(2));
						user.setSalary(rs.getInt(3));
						list.add(user);
					}
					return list;
				}
			});
			
			//遍历list
			for (User user : listuser) {
				System.out.println(user.getId()+" "+user.getName()+" "+user.getSalary());
			}*/
			
			
		//调用查询方法,把数据封装到user里面
			User user = query("select * from user where id=?",new ResultSetHandler<User>() {
				public User handler(ResultSet rs) throws Exception {
					while(rs.next()){
						//创建User
						User  user = new  User();
						user.setId(rs.getInt(1));
						user.setName(rs.getString(2));
						user.setSalary(rs.getInt(3));
						return user;
					}
					return null;
				}
			},2);
			System.out.println(user.getId()+" "+user.getName()+" "+user.getSalary());
		}
		
		//返回是一个任意类型
		//使用泛型表示<T>
		public static <T>T query(String sql ,ResultSetHandler<T> rst,Object...o){
			
			Connection conn = null;
			PreparedStatement pst = null;
			ResultSet rs = null;
			try{
				//得到连接池连接
				conn = JDBCUtils.getConnection();
				//预编译
				pst = conn.prepareStatement(sql);
				//循环设置值
				for(int i=1;i<=pst.getParameterMetaData().getParameterCount();i++){
					pst.setObject(i, o[i-1]);
				}
				//执行sql
				rs = pst.executeQuery();
				
				T trs = rst.handler(rs);
				return trs;
				
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				//释放资源
				JDBCUtils.releaseResource(conn, pst,rs);
			}	
			return null;
		}
	}

 三、DBUtils小框架的使用(类库)

2、DBUtils框架的使用

*DBUtils是Apache组织提供一个开源JDBC工具类库
	-DBUtils 使用很简单,在很多公司里面不想使用hibernate,因为使用hibernate如果使用不好,会产生性能问题,很多公司而是使用DBUtils框架完成jdbc的操作。


*使用到的类:
	-DBUtils:
		-方法
			--close(Connection conn)
			-loadDriver(String driverClassName)
			-roolback()
	
	-QueryRunner:
		-方法:
			构造函数常用两个:
				--QueryRunner();
					*如果使用没有参数的构造方法,需要使用下面的方法
						- update(Connection conn, String sql, Object... params)
					
						- query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)

				--QueryRunner(DataSource ds);
					*如果使用有参数的构造方法 ,使用里面参数是DataSource的构造方法
						- update(String sql, Object... params) :完成增加修改和删除的操作
						
						- query(String sql, ResultSetHandler<T> rsh, Object... params):完成查询的操作



*代码演示
	-dbutils实现增删改(*******)
		/**
		 * 使用dbutils框架实现增加、删除和修改操作
		 * @author XiaYuJia
		 *
		 */
		public class TestDButils {
			
			public static void main(String[] args) {
				//创建一个QueryRunner对象
				QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
				//使用update方法实现操作,注意:QueryRunner构造函数传入了DataSource对象
				try {
					//不需要释放资源了,类库里面已经实现释放资源了
					qr.update("insert into user values(?,?,?)",666,"孙悟空",20000);
					//删除操作
					
					qr.update("update user set id=? where name=?",7,"孙悟空");
					//修改操作
					
					qr.update("delete from user where id=?",666);
					//删除操作
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}


	-dbutils实现查询操作(**********)
		/**
		 * 使用dbutils实现查询的操作,使用到接口的实现类
		 * 		-ArrayHandler
		 * 
		 * @author XiaYuJia
		 *
		 */
		public class TestDBUtils2 {

			public static void main(String[] args) throws Exception {

					// 创建QueryRunner 对象
					QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());
					
					//ArrayHandler:把数据封装到一个数组里面========================================
					ArrayHandler ah = new ArrayHandler();
					
					String sql = "select * from user where id=?";

					Object[] query = runner.query(sql, ah ,1);	
					System.out.println(Arrays.toString(query));
					
					//ArrayListHander:把数据存到数组然后把数组放到list里面================================
					String sql1 = "select * from user";
					ArrayListHandler alh = new ArrayListHandler();
					List<Object[]> query2 = runner.query(sql1, alh);
					for (Object[] objects : query2) {
						System.out.println(Arrays.toString(objects));	
					}
					
					//BenaHandler:把数据封装到对象里面(****)=========================================
					BeanHandler bh = new BeanHandler<User>(User.class);
					User user = runner.query(sql, bh ,6);
					System.out.println(user.getId()+" "+user.getName()+" "+user.getSalary());
					
					
					//BeanListHandler:把数据放到对象里面,把对象放到list里面(******)=====================
					BeanListHandler blh = new BeanListHandler<User>(User.class);
					List<User> list = runner.query(sql1, blh);
					for (User user2 : list) {
						System.out.println(user2.getId()+" "+user2.getName()+" "+user2.getSalary());
					}			
			}
		}


		/**
		 * 把数据封装到ResultSetHandler实现类里面演示
		 * @author XiaYuJia
		 *
		 */
		public class TestDBUtils3 {
			
			public static void main(String[] args) throws Exception {
				
				//创建QueryRunner对象
				QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
				
				//MapHandler:把数据封装到map里面=================================
				MapHandler mh = new MapHandler();
				String sql = "select * from user where id=?";
				Map<String, Object> map = qr.query(sql, mh,1);
				System.out.println(map);
				
				//MapListHandler:把数组存到map里面,把map存到list里面===============
				String sql1 ="select * from user";
				MapListHandler mlh = new MapListHandler();
				List<Map<String, Object>> query = qr.query(sql1, mlh);
				for (Map<String, Object> map2 : query) {
					System.out.println(map2);
				}
				
				//ColumnListHandler:把查询到某一列的值放到list里面==================
				String sql2 = "select name from user";
				ColumnListHandler clh = new ColumnListHandler();
				List<Object> query2 = qr.query(sql2, clh);
				for (Object object : query2) {
					System.out.println(object);
				}
				
				//keyedHandler :把数据存到map里面。把封装之后map作为值存到另一个map中
				KeyedHandler kh = new KeyedHandler("name");//把name作为键
				//KeyedHandler kh = new KeyedHandler();
				Map<Object, Map<String, Object>> map1 = qr.query(sql1, kh);
				System.out.println(map1);	
				
				//ScalarHandlrt :进行单值查询
				String sql3 ="select count(*) from user";
				ScalarHandler sh = new ScalarHandler();
				Long  query3 = (Long) qr.query(sql3, sh);
				System.out.println(query3);
			}
		}
		 
* 掌握的实现类:BeanHandler   BeanListHandler    MapListHandler

猜你喜欢

转载自blog.csdn.net/weixin_39531549/article/details/82796016
今日推荐