- 浏览: 4205930 次
最新评论
【web】赵雅智_框架技术
使用元数据简化JDBC代码
- 业务背景:系统中所有实体对象都涉及到基本的CRUD操作:
- 所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。
- 实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。
原方法:
ZSGC.java
package com.hbsi.yuan; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.junit.Test; import com.hbsi.util.DBManager_c3p0; public class ZSGC { @Test public void insert(){ Connection conn = null; PreparedStatement st = null; try{ conn = DBManager_c3p0.getConnection(); String sql ="insert into admin(id,name,pass)values(?,?,?)"; st = conn.prepareStatement(sql); st.setInt(1,13); st.setString(2,"aa"); st.setString(3,"aaa"); st.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }finally{ DBManager_c3p0.closeDB(conn, st, null); } } @Test public void update(){ Connection conn = null; PreparedStatement st = null; try{ conn = DBManager_c3p0.getConnection(); String sql ="update admin set name=?,pass=? where id=?"; st = conn.prepareStatement(sql); st.setString(1,"bb"); st.setString(2,"bbb"); st.setInt(3,13); st.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }finally{ DBManager_c3p0.closeDB(conn, st, null); } } @Test public void delete(){ Connection conn = null; PreparedStatement st = null; try{ conn = DBManager_c3p0.getConnection(); String sql ="delete from admin where id=?"; st = conn.prepareStatement(sql); st.setInt(1,13); st.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }finally{ DBManager_c3p0.closeDB(conn, st, null); } } @Test public void find(){ Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ conn = DBManager_c3p0.getConnection(); String sql ="select id,name,pass,sex,role from admin where id=?"; st = conn.prepareStatement(sql); st.setInt(1,1); rs = st.executeQuery(); while(rs.next()){ System.out.println(rs.getInt(1)); System.out.println(rs.getString(2)); System.out.println(rs.getString(3)); System.out.println(rs.getString(4)); System.out.println(rs.getInt(5)); } }catch(Exception e){ e.printStackTrace(); }finally{ DBManager_c3p0.closeDB(conn, st, null); } } }
原表数据
增加
修改
删除
查询
使用元数据简化代码:
util下新建ResultSetHandler接口
ResultSetHandler.java
package com.hbsi.util; import java.sql.ResultSet; public interface ResultSetHandler { public Object handler(ResultSet rs); }
单行封装到一个bean对象里,多行,封装到list集合中
写好处理器
BeanHandler.java
package com.hbsi.util; import java.lang.reflect.Field; import java.sql.ResultSet; import java.sql.ResultSetMetaData; public class BeanHandler implements ResultSetHandler{ //代表bin private Class clazz; public BeanHandler(Class clazz){ this.clazz = clazz; } public Object handler(ResultSet rs) { //要把结果集封装到bean中 try{ if(!rs.next()){ return null; } //获取bean对象 Object bean = clazz.newInstance(); //并不知道有哪些字段,结果集的元数据 ResultSetMetaData meta = rs.getMetaData(); //用元数据获取,获得列数 int count = meta.getColumnCount(); //通过循环把bean的值和字段名取到 for(int i=0;i<count;i++){ //得到结果集中地每列字段名 String columnName = meta.getColumnName(i+1); //按名字走,获取对应值 Object value= rs.getObject(columnName); //反射bean上与列名相对应得属性 Field f = bean.getClass().getDeclaredField(columnName); //权限 f.setAccessible(true); f.set(bean, value); } return bean; }catch(Exception e){ throw new RuntimeException(e); } } }
DBManager_c3p0.java
package com.hbsi.util; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource; import com.mysql.jdbc.Statement; public class DBManager_c3p0 { private static ComboPooledDataSource ds = null; static{ try{ //创建连接池 ds = new ComboPooledDataSource("mysql"); }catch(Exception e){ e.printStackTrace(); } } public static Connection getConnection() throws SQLException{ return ds.getConnection(); } public static void closeDB(Connection con,PreparedStatement ps,ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(ps!=null){ try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //优化CUD操作 public static void update(String sql,Object[] params){ Connection conn = null; PreparedStatement st = null; try{ conn = DBManager_c3p0.getConnection(); st = conn.prepareStatement(sql); for(int i=0;i<params.length;i++){ st.setObject(i+1, params[i]); } st.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }finally{ DBManager_c3p0.closeDB(conn, st, null); } } // public static Object query(String sql,Object[] params, ResultSetHandler h){ Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ conn = DBManager_c3p0.getConnection(); st = conn.prepareStatement(sql); for(int i=0;i<params.length;i++){ st.setObject(i+1, params[i]); } rs = st.executeQuery(); return h.handler(rs); }catch(Exception e){ throw new RuntimeException(e); }finally{ DBManager_c3p0.closeDB(conn, st, rs); } } }
Admin,java
package www.hbsi.domain; import java.io.Serializable; /** * 把一个表admin映射(mapping)成Class类 * * @author redarmy * */ //可序列化的接口 public class Admin implements Serializable { private static final long serialVersionUID = 1L; // 把admin表中的字段映射成Admin类的成员属性(字段类型的转换如下 int --int Integer,varchar--String ) private int id; private String name; private String pass; private String sex; private int role; public Admin(int id, String name, String pass, String sex, int role) { super(); this.id = id; this.name = name; this.pass = pass; this.sex = sex; this.role = role; } //构造器 public Admin() { super(); // TODO Auto-generated constructor stub } public Admin(String name, String pass, String sex, int role) { super(); this.name = name; this.pass = pass; this.sex = sex; this.role = role; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getRole() { return role; } public void setRole(int role) { this.role = role; } @Override public String toString() { return "Admin [id=" + id + ", name=" + name + ", pass=" + pass + ", role=" + role + ", sex=" + sex + "]"; } }
YouHuaZSGC.java
package com.hbsi.yuan; import org.junit.Test; import www.hbsi.domain.Admin; import com.hbsi.util.BeanHandler; import com.hbsi.util.DBManager_c3p0; public class YouHuaZSGC { @Test public void insert(){ String sql ="insert into admin(id,name,pass)values(?,?,?)"; Object[] params ={13,"abc","abc"}; DBManager_c3p0.update(sql, params); } @Test public void update(){ String sql ="update admin set name=?,pass=? where id=?"; Object[] params ={"xxx","xxxx",13}; DBManager_c3p0.update(sql, params); } @Test public void delete(){ String sql ="delete from admin where id=?"; Object[] params ={13}; DBManager_c3p0.update(sql, params); } @Test public void find(){ //单行封装到一个bean对象里,多行,封装到list集合中 String sql ="select id,name,pass from admin where id=?"; Object[] params ={4}; Admin users = (Admin) DBManager_c3p0.query(sql, params, new BeanHandler(Admin.class)); System.out.println(users.getId()+":"+users.getName()+":"+users.getPass()); } }
原表
增加
修改
删除
查找
查询所有:
BeanListHandler.java
package com.hbsi.util; import java.lang.reflect.Field; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.ArrayList; import java.util.List; public class BeanListHandler implements ResultSetHandler { private Class clazz; public BeanListHandler(Class clazz) { super(); this.clazz = clazz; } public Object handler(ResultSet rs) { try{ List list = new ArrayList(); while(rs.next()){ Object bean = clazz.newInstance(); ResultSetMetaData meta = rs.getMetaData(); int count = meta.getColumnCount(); for(int i=0;i<count;i++){ String columnName = meta.getColumnName(i+1); Object value= rs.getObject(columnName); Field f = bean.getClass().getDeclaredField(columnName); f.setAccessible(true); f.set(bean, value); } list.add(bean); } return list; }catch(Exception e){ throw new RuntimeException(e); } } }
YouHuaZSGC.java
package com.hbsi.yuan; import java.util.List; import org.junit.Test; import com.hbsi.domain.Admin; import com.hbsi.util.BeanHandler; import com.hbsi.util.BeanListHandler; import com.hbsi.util.DBManager_c3p0; public class YouHuaZSGC { @Test public void findAll(){ //单行封装到一个bean对象里,多行,封装到list集合中 String sql ="select id,name,pass,sex,role from admin"; Object[] params ={}; List<Admin> list = (List<Admin>) DBManager_c3p0.query(sql, params, new BeanListHandler(Admin.class)); for(Admin admins:list){ System.out.println(admins.getId()+"--"+admins.getName()+"--"+admins.getPass()); } System.out.println(list.size()); } }
相关推荐
MS_WEB开发框架技术1简介,MS_WEB开发框架技术2MVC应用,MS_WEB开发框架技术3Ajax,MS_WEB开发框架技术4JQuery,MS_WEB开发框架技术5Web服务,MS_WEB开发框架技术6数据绑定,MS_WEB开发框架技术8LINQ概况,MS_WEB...
Web__Axios框架.mp4
Web__Vue框架二.mp4
Web__Vue框架一.mp4
MYOIS包括了PHP开发框架、WEB UI组件,应用程序软件模块的一个软件系统,但并不是一个真正的应用软件,但由其中的模块组合及再通过二次开发就可以派生出多个软件,比如OA,CRM, HR,CMS等。MYOIS和开发框架相比是在...
基于_Struts_2+Spring+JPA_框架的WEB_应用
分布式web技术介绍4_分布式web框架_session共享 共6页.ppt
分布式web技术介绍5_分布式web框架_文件中心 共5页.pptx
分布式web技术介绍1_分布式web框架_负载均衡 共35页.ppt
分布式web技术介绍2_分布式web框架_网页缓存 共5页.ppt
分布式web技术介绍3_分布式web框架_探测模块(C语言) 环境安装配置 共7页.ppt
书首先分析了java web应用的分层设计方法,并进行应用框架的选型,然后讲解各种java web应用框架、集成技术、实战开发。主要内容包括如下。. 持久层框架hibernate:讲解hibernate入门与核心技术,分别实现mysql、...
ZK框架_J2EE技术(有胜于SSH的WEB与手机框架) ZK框架_J2EE技术(有胜于SSH的WEB与手机框架) ZK框架_J2EE技术(有胜于SSH的WEB与手机框架)
Web前端框架技术综述.pdf
精通Spring_Web_MVC优秀框架.pdf
python最快的web框架,支持异步,哈哈哈
CTG-BSS_分布式WEB框架_操作手册V0.4 共58页.docx
为了使框架具备 AOP 特性,从代理技术讲到 AOP 技术,从 ThreadLocal 技术讲到事务控制技术。最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为...
CTG-BSS_分布式WEB框架_操作手册V0.4 共44页.docx