技术中心

这里象征着我们的态度和能力

>JDBC的封装类构建
作者:中国IT实验室    来源:中国IT实验室    发布时间:2012-03-12      浏览次数:6923
分享到:
欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  在JAVA中JDBC的访问是比较麻烦的,为此可以使用封装的方法构建一个封装性较好的JDBC工具类,提高编程的可复用性。

  具体的想法是:可以生成一个类封装JDBC的connection和statement的构建,使用Property配置文件来保存JDBC访问的路径以及驱动,这样可以有较好的可维护性,再使用反射特性构建一个DataUtil类封装JDBC获取的结果集,并把其显示出来。

  1.首先新建一个jdbc.property文件存放jdbc的相关属性

  [html] view plaincopy jdbc.driver=com.mysql.jdbc.Driver jdbcjdbc.url=jdbc:mysql://localhost:3306/user jdbc.user=root jdbc.pass=123456通过PropertyUtil类可以获得jdbc的属性

  [java] view plaincopy package jdbc;

  import java.io.IOException;import java.io.InputStream;import java.util.Properties;

  /** * 属性工具类*/ public class PropertiesUtil { //属性列表private static Properties properties = new Properties();//配置文件的路径private static String CONFIG = "/cfg/jdbc.properties";//读取资源文件, 设置输入流private static InputStream is = PropertiesUtil.class.getResourceAsStream(CONFIG);//数据库驱动public static String JDBC_DRIVER;//jdbc连接url public static String JDBC_URL;//数据库用户名public static String JDBC_USER;//数据库密码public static String JDBC_PASS;static { try { //加载输入流properties.load(is);//获得配置的各个属性JDBC_DRIVER = properties.getProperty("jdbc.driver");JDBC_URL = properties.getProperty("jdbc.url");JDBC_USER = properties.getProperty("jdbc.user");JDBC_PASS = properties.getProperty("jdbc.pass");} catch (IOException e) { e.printStackTrace();}

  2.建立JDBCExecutor类来封装JDBC的数据源获取工作,其中通过单例模式获取数据库的连接

  [java] view plaincopy package jdbc;

  import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;

  public class JDBCExecutor{ //获得驱动private static String DRIVER = PropertiesUtil.JDBC_DRIVER;//获得url private static String URL = PropertiesUtil.JDBC_URL;//获得连接数据库的用户名private static String USER = PropertiesUtil.JDBC_USER;//获得连接数据库的密码private static String PASS = PropertiesUtil.JDBC_PASS;//连接对象private Connection connection;//维护一个本类型的对象private static JDBCExecutor jdbcExecutor;//Statement对象,可以执行SQL语句并返回结果private Statement stmt;

  //私有构造器private JDBCExecutor() { try { //初始化JDBC驱动并让驱动加载到jvm中Class.forName(DRIVER);//创建数据库连接connection = DriverManager.getConnection(URL, USER, PASS);//创建Statement对象stmt = connection.createStatement();} catch (Exception e) { throw new JDBCException(e.getMessage());}

  //提供一个静态方法返回本类的实例public static JDBCExecutor getJDBCExecutor() { //如果本类所维护jdbcExecutor属性为空,则调用私有的构造器获得实例if (jdbcExecutor == null) { jdbcExecutor = new JDBCExecutor();} return jdbcExecutor;}

  /* * 执行一句查询的sql */ public ResultSet executeQuery(String sql) { try { //利用Statement对象执行参数的sql ResultSet result = stmt.executeQuery(sql);return result;} catch (Exception e) { throw new QueryException(e.getMessage());}

  //执行单句INSERT、UPDATE 或 DELETE 语句, 如果执行INSERT时, 返回主键public int executeUpdate(String sql) { int result = -1;try { //执行SQL语句stmt.executeUpdate(sql);//获得主键ResultSet rs = stmt.getGeneratedKeys();while(rs.next()) { //返回最后一个主键result = rs.getInt(1);} rs.close();return result;} catch (Exception e) { throw new QueryException(e.getMessage());}

  3.为了将JDBC查询操作的数据获取,封装数据获取的类

  [java] view plaincopy package jdbc;

  import java.lang.reflect.Field;import java.lang.reflect.Method;import java.sql.ResultSet;import java.util.ArrayList;import java.util.Collection;

  import vo.User;import dao.impl.UserDAOImpl;

  /** * 数据转换工具类*/ public class DataUtil { static UserDAOImpl us=new UserDAOImpl();//将rs中的值封装成一个集合public static Collection getDatas(Collection result, ResultSet rs, Class clazz) { try { while (rs.next()) { //创建类的实例Object vo = clazz.newInstance();//获取本对象的属性Field[] fields = clazz.getDeclaredFields();//获取父类的属性//    Field[] superFields = clazz.getSuperclass()。getDeclaredFields();//    //父类的属性和自己的属性相加//    Field[] allFields = addFields(superFields, fields);//遍历所有的属性for (Field field : fields) { //获得setter方法的方法名String setterMethodName = getSetterMethodName(field.getName());//获得setter方法Method setterMethod = clazz.getMethod(setterMethodName, field.getType());invokeMethod(rs, field, vo, setterMethod);} result.add(vo);} rs.close();} catch (Exception e) { e.printStackTrace();throw new DataException(e.getMessage());} return result;}

  //执行一个方法, 从ResultSet中获取一个字段的数据, 调用vo的setter方法private static void invokeMethod(ResultSet rs, Field field, Object vo,Method setterMethod) { try { //当使用ResultSet获取某个字段的时候, 如果没有该字段, 会出现SQLException, 在这里忽略该异常String value = rs.getString(field.getName());//从ResultSet中获取与该对象属性名一致的字段, 并执行setter方法setterMethod.invoke(vo, value);} catch (Exception e) { //忽略异常}

  //根据属性名获得setter方法的方法名private static String getSetterMethodName(String fieldName) { String begin = fieldName.substring(0, 1)。toUpperCase();String end = fieldName.substring(1, fieldName.length());String methodName = "set" + begin + end;return methodName;}

  //测试方法public static void main(String[] args) { JDBCExecutor executor = JDBCExecutor.getJDBCExecutor();us.AddUser(new User("111",12,"333"));//  ResultSet rs = executor.executeQuery("select * from user");//  Collection<User> result = DataUtil.getDatas(new ArrayList<User>(), rs,//    User.class);//  for (User user : result) { //   System.out.println(user.getName());//  } }

  通过上面Main方法中的调用,可以看出能够很轻易的操纵JDBC连接了。

4000-880-989
(24小时热线)
联系客服
微信公众号

官方公众号

小程序

©2008-2022 CORPORATION ALL Rights Reserved. 昆明奥远科技有限公司版权所有 滇ICP备09003328号-1 滇公网安备 53011102000818号 增值电信业务经营许可证号:滇B2-20110045
昆明那家网络公司好,新媒体运营,网站优化,网络推广,网站建设,网页设计,网站设计,网站推广,云南网站公司,昆明新媒体公司,云南网红主播,昆明SEO公司,昆明网站建设,昆明网络推广,昆明网站优化,昆明网站推广,红河网站建设,大理网络公司,曲靖网络公司,丽江网站设计,昭通网络公司,保山大数据服务,智慧高速建设,智慧校园服务,云南IDC服务商,网络安全测评,等保测评,网站关键词排名优化服务,服务客户尽超2000余家,一切尽在奥远科技,服务电话:13888956730