利用jdbc写的一个类似DBUtils的框架

  1. package com.jdbc.orm.dbutils;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.sql.Connection;
  6. import java.sql.DriverManager;
  7. import java.sql.PreparedStatement;
  8. import java.sql.ResultSet;
  9. import java.sql.SQLException;
  10. import java.util.Properties;
  11.  
  12. import com.jdbc.orm.handler.ResultsetHand;
  13.  
  14. /**
  15. *
  16. * 功能描述:基于jdbc自己封装的orm小框架
  17. *
  18. */
  19. public class DBUtils {
  20. public static String username;
  21. public static String password;
  22. public static String driverClass;
  23. public static String url;
  24.  
  25. public static Connection connection;
  26. public static PreparedStatement statement;
  27. public static ResultSet rs;
  28.  
  29. static {
  30. Properties properties = new Properties();
  31. InputStream in = DBUtils.class.getClassLoader().getResourceAsStream("db.properties");
  32. try {
  33. properties.load(in);// 加载数据库的配置文件
  34. driverClass = properties.get("jdbc.driverclass").toString();
  35. username = properties.get("jdbc.username").toString();
  36. password = properties.get("jdbc.password").toString();
  37. url = properties.get("jdbc.url").toString();
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. try {
  41. Class.forName(driverClass);// 加载数据库的驱动程序
  42. } catch (ClassNotFoundException e1) {
  43. e1.printStackTrace();
  44. }
  45. }
  46. }
  47.  
  48. /**
  49. *
  50. * 功能 :为SQL语句设置参数
  51. *
  52. * @param sql
  53. * 输入的sql语句
  54. * @param params
  55. * 需要的参数
  56. * @throws SQLException
  57. */
  58. public static void setParams(String sql, Object... params) throws SQLException {
  59. connection = DriverManager.getConnection(url, username, password);
  60. statement = connection.prepareStatement(sql);
  61. if ( params != null && params.length > 0) {
  62. for (int i = 0; i < params.length; i++) {
  63. statement.setObject(i + 1, params[i]);
  64. }
  65. }
  66. }
  67.  
  68. /**
  69. *
  70. * @功能 :根据ID查询实体
  71. * @param sql
  72. * @param id
  73. * @return 返回结果集
  74. * @throws Exception
  75. */
  76. public static ResultSet queryBeanById(String sql, int id) throws Exception {
  77. setParams(sql, id);
  78. return statement.executeQuery();
  79. }
  80.  
  81. /**
  82. *
  83. * @功能 :查询功能
  84. * @param sql
  85. * @param params
  86. * @return 将查询到的结果映射到一个实体中返回
  87. * @throws SQLException
  88. */
  89. public static Object query(String sql, ResultsetHand rsh, Object... params) throws SQLException {
  90. setParams(sql, params);
  91. ResultSet rs = statement.executeQuery();
  92. return rsh.handler(rs);
  93. }
  94.  
  95. /**
  96. *
  97. * @功能 :增删改功能
  98. * @param sql
  99. * @param params
  100. * @throws SQLException
  101. */
  102. public static int update(String sql, Object... params) throws SQLException {
  103. setParams(sql, params);
  104. return statement.executeUpdate();
  105. }
  106.  
  107. }
  1. package com.jdbc.orm.handler;
  2.  
  3. import java.lang.reflect.Field;
  4. import java.sql.ResultSet;
  5. import java.sql.ResultSetMetaData;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8.  
  9. /**
  10. * @描述 : 将查询到的结果映射到集合中
  11. * @author 作者 jjkang
  12. * @version 创建时间:2017年10月6日 下午8:04:46
  13. */
  14. @SuppressWarnings("rawtypes")
  15. public class BeanListHandler implements ResultsetHand {
  16. private Class clazz;
  17.  
  18. public BeanListHandler(Class clazz) {
  19. this.clazz = clazz;
  20. }
  21.  
  22. @SuppressWarnings("unchecked")
  23. @Override
  24. public Object handler(ResultSet rs) {
  25. List list = new ArrayList();
  26. try {
  27.  
  28. ResultSetMetaData metaData = rs.getMetaData();
  29. int columnCount = metaData.getColumnCount();
  30. while (rs.next()) {
  31. Object bean = clazz.newInstance();
  32. for (int i = 0; i < columnCount; i++) {
  33. Object object = rs.getObject(i + 1);
  34. String name = metaData.getColumnName(i + 1);
  35. Field field = clazz.getDeclaredField(name);
  36. field.setAccessible(true);
  37. field.set(bean, object);
  38. }
  39. list.add(bean);
  40. }
  41. return list;
  42. } catch (Exception e) {
  43. throw new RuntimeException(e);
  44. }
  45. }
  46.  
  47. }
  1. package com.jdbc.orm.handler;
  2.  
  3. import java.lang.reflect.Field;
  4. import java.sql.ResultSet;
  5. import java.sql.ResultSetMetaData;
  6.  
  7. /**
  8. * @描述 :将查询的结果映射到实体中
  9. * @author 作者 E-mail: jiajunkang@outlook.com
  10. * @version 创建时间:2017年10月6日 下午5:45:04
  11. */
  12. public class BeanHandler implements ResultsetHand {
  13.  
  14. private Class clazz;// 将结果映射到的实体
  15.  
  16. public BeanHandler(Class clazz) {
  17. this.clazz = clazz;
  18. }
  19.  
  20. @Override
  21. public Object handler(ResultSet rs) {
  22. try {
  23. if (!rs.next()) {
  24. return null;
  25. }
  26. Object bean = clazz.newInstance();
  27. ResultSetMetaData metaData = rs.getMetaData();
  28. int columnCount = metaData.getColumnCount();
  29. for (int i = 0; i < columnCount; i++) {
  30. String name = metaData.getColumnName(i + 1);// 得出每一列的列名
  31. Object value = rs.getObject(i + 1);// 得到每一列的值
  32. Field field = clazz.getDeclaredField(name);// 利用反射,根据列名得到属性对象
  33. field.setAccessible(true);
  34. field.set(bean, value);
  35. }
  36. return bean;
  37. } catch (Exception e) {
  38. throw new RuntimeException(e);
  39. }
  40. }
  41. }
  1. package com.jdbc.orm.junit;
  2.  
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7.  
  8. import org.junit.Test;
  9.  
  10. import com.jdbc.orm.bean.Student;
  11. import com.jdbc.orm.dbutils.DBUtils;
  12. import com.jdbc.orm.handler.BeanHandler;
  13. import com.jdbc.orm.handler.BeanListHandler;
  14.  
  15. /**
  16. * 描述 : 测试DBUtils
  17. * @version 创建时间:2017年10月6日 下午2:40:45
  18. */
  19. public class TestDBUtils {
  20. DBUtils dbUtils = new DBUtils();
  21. @Test
  22. public void test(){
  23. System.out.println(dbUtils.driverClass);
  24. System.out.println(dbUtils.password);
  25. System.out.println(dbUtils.url);
  26. System.out.println(dbUtils.username);
  27. }
  28.  
  29. @Test
  30. public void testSetParams() throws SQLException{
  31. String sql = "select name from student where id = ?";
  32. Object params[] = {1};
  33. DBUtils.setParams(sql, params);
  34. }
  35. @Test
  36. public void testQueryBeanById() throws Exception{
  37. String sql = "select id,name,chinese,english,math from student where id = ?";
  38. ResultSet rs=dbUtils.queryBeanById(sql, 1);
  39. Student student = new Student();
  40.  
  41. while(rs.next()){
  42. student.setId(rs.getInt(1));
  43. student.setName(rs.getString(2));
  44. student.setChinese(rs.getDouble(3));
  45. student.setEnglish(rs.getDouble(4));
  46. student.setMath(rs.getDouble(5));
  47. }
  48. System.out.println(student);
  49. }
  50.  
  51. @Test
  52. public void testUpdate() throws SQLException{
  53. String sql = "update student set name=? where id =?";
  54. Object[] params = {"李晓明",1};
  55. int rows = dbUtils.update(sql, params);
  56. System.out.println(rows);
  57. }
  58.  
  59. @Test
  60. public void testQuery() throws Exception{
  61. String sql = "select id,name,chinese,english,math from student where id = ?";
  62. Student student = new Student();
  63. student = (Student) dbUtils.query(sql,new BeanHandler(Student.class), 1);
  64. System.out.println(student);
  65. }
  66. @Test
  67. public void testQuery1() throws Exception{
  68. String sql = "select id,name,chinese,english,math from student";
  69. List<Student> list = new ArrayList<>();
  70. list = (List<Student>) dbUtils.query(sql,new BeanListHandler(Student.class), null);
  71. System.out.println(list.size());
  72. System.out.println(list);
  73. }
  74. }

利用jdbc简单封装一个小框架(类似DBUtils)的更多相关文章

  1. 一个小框架,基于rx_retrofit2_mvp

    离职在即,也没什么事情做,就鼓捣了一下.任意搭建了一个小框架,看看以后能不能搞出自己的一个model,好了.不说别的,上代码 1,先上依赖库 compile 'io.reactivex:rxandro ...

  2. JavaScript封装一个函数效果类似内置方法concat()

    JavaScript封装一个函数效果类似内置方法concat() 首先回忆concat()的作用: concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,而仅仅会返回被连接数组的一个 ...

  3. java的jdbc简单封装

    在学了jdbc一段时间后感觉自己写一个简单的封装来试试,于是參考的一些资料就写了一下不是多好,毕竟刚学也不太久 首先写配置文件:直接在src下建立一个db.properties文件然后写上内容 < ...

  4. 如何利用UDP协议封装一个数据包

    在如何封装一个数据包上,是一个非常细致的问题,而利用UDP协议来封装的话,是比较简单,让我们一步步来分析典型的TCP/IP协议.一般来说一个典型的一个数据包,包括以太网MAC头+网络层IP数据头+传输 ...

  5. 简单封装微信小程序

    一.不同环境配置封装 新建config文件夹,根据自己有不同环境设置不同的js文件 具体js文件内容: exports.config = { requestHost: 'https://******. ...

  6. 用XHR简单封装一个axios

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Swift - 简单封装一个工具类模板

    创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...

  8. js 利用throw 写的一个小程序

    在下边的小程序中比较特殊的是使用isNaN()函数判断一个参数是不是数字, <!DOCTYPE html> <!DOCTYPE html> <html> <h ...

  9. 利用ReentrantLock简单实现一个阻塞队列

    借助juc里的ReentrantLock实现一个阻塞队列结构: package demo.concurrent.lock.queue; import java.util.concurrent.lock ...

随机推荐

  1. 边看MHA源码边学Perl语言之一开篇

    边看MHA源码边学Perl语言之一开篇 自我简介 先简单介绍一下自己,到目前为此我已经做了7年左右的JAVA和3年左右php开发与管理,做java时主要开发物流行业的相关软件,对台湾快递,国际快递,国 ...

  2. iOS js oc相互调用(JavaScriptCore 下)

    下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的block 上代码 -(void)we ...

  3. javascript计算啤酒2元一瓶,4个盖换一瓶,2个瓶换一瓶,10元钱最多喝多少瓶

    var n = 0//当前剩下多少瓶加上喝赢了多少瓶 var x = 5//初始多少瓶 var y = 0//除了喝掉的,剩下多少瓶 var z = 0;//总数 var arr = []//定义一个 ...

  4. .net asp mvc 如何从后端返回数据对象

    今天在做项目时,有一个需求:获取从控制器返回的数组对象,方法如下 public ActionResult GetAllFiles() { string dir = Server.MapPath(&qu ...

  5. Beta阶段事后诸葛亮分析

    1.总结的提纲内容 a. 项目管理之事后诸葛亮会 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要解决用户无意识花钱,无法清楚看见钱去 ...

  6. 微信小程序scroll标签的测试

    一:testscroll.wxml的代码如下.testview.js自动生成示例代码 //testscroll.wxml <view class="section__title&quo ...

  7. 团队作业8——第二次项目冲刺(Beta阶段)--第七天

    会议照片: 燃尽图: 项目进展: 所有项目都已完成 进行app测试即使用情况评估 团队贡献比: 队员 角色 团队贡献比 陈麟凤 PM 17% 张志杰 DEV 18% 黄海鸿 TEST 16% 康建灿 ...

  8. 201521123085 《JAVA程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1.clone方法 1.1 Object对 ...

  9. 201521123099《java程序设计》第五周学习总结

    本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现 ...

  10. 201521145048 《Java程序设计》第3周学习总结

    1. 本章学习总结 学会了对于一个基本类的创建,需要有属性(private public protected),方法( 静态方法 非静态方法),构造函数,main函数,在定义属性时一般使用privat ...