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

package com.jdbc.orm.dbutils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties; import com.jdbc.orm.handler.ResultsetHand; /**
*
* 功能描述:基于jdbc自己封装的orm小框架
*
*/
public class DBUtils {
public static String username;
public static String password;
public static String driverClass;
public static String url; public static Connection connection;
public static PreparedStatement statement;
public static ResultSet rs; static {
Properties properties = new Properties();
InputStream in = DBUtils.class.getClassLoader().getResourceAsStream("db.properties");
try {
properties.load(in);// 加载数据库的配置文件
driverClass = properties.get("jdbc.driverclass").toString();
username = properties.get("jdbc.username").toString();
password = properties.get("jdbc.password").toString();
url = properties.get("jdbc.url").toString();
} catch (IOException e) {
e.printStackTrace();
try {
Class.forName(driverClass);// 加载数据库的驱动程序
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
}
} /**
*
* 功能 :为SQL语句设置参数
*
* @param sql
* 输入的sql语句
* @param params
* 需要的参数
* @throws SQLException
*/
public static void setParams(String sql, Object... params) throws SQLException {
connection = DriverManager.getConnection(url, username, password);
statement = connection.prepareStatement(sql);
if ( params != null && params.length > 0) {
for (int i = 0; i < params.length; i++) {
statement.setObject(i + 1, params[i]);
}
}
} /**
*
* @功能 :根据ID查询实体
* @param sql
* @param id
* @return 返回结果集
* @throws Exception
*/
public static ResultSet queryBeanById(String sql, int id) throws Exception {
setParams(sql, id);
return statement.executeQuery();
} /**
*
* @功能 :查询功能
* @param sql
* @param params
* @return 将查询到的结果映射到一个实体中返回
* @throws SQLException
*/
public static Object query(String sql, ResultsetHand rsh, Object... params) throws SQLException {
setParams(sql, params);
ResultSet rs = statement.executeQuery();
return rsh.handler(rs);
} /**
*
* @功能 :增删改功能
* @param sql
* @param params
* @throws SQLException
*/
public static int update(String sql, Object... params) throws SQLException {
setParams(sql, params);
return statement.executeUpdate();
} }
package com.jdbc.orm.handler;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List; /**
* @描述 : 将查询到的结果映射到集合中
* @author 作者 jjkang
* @version 创建时间:2017年10月6日 下午8:04:46
*/
@SuppressWarnings("rawtypes")
public class BeanListHandler implements ResultsetHand {
private Class clazz; public BeanListHandler(Class clazz) {
this.clazz = clazz;
} @SuppressWarnings("unchecked")
@Override
public Object handler(ResultSet rs) {
List list = new ArrayList();
try { ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
while (rs.next()) {
Object bean = clazz.newInstance();
for (int i = 0; i < columnCount; i++) {
Object object = rs.getObject(i + 1);
String name = metaData.getColumnName(i + 1);
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
field.set(bean, object);
}
list.add(bean);
}
return list;
} catch (Exception e) {
throw new RuntimeException(e);
}
} }
package com.jdbc.orm.handler;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData; /**
* @描述 :将查询的结果映射到实体中
* @author 作者 E-mail: jiajunkang@outlook.com
* @version 创建时间:2017年10月6日 下午5:45:04
*/
public class BeanHandler implements ResultsetHand { private Class clazz;// 将结果映射到的实体 public BeanHandler(Class clazz) {
this.clazz = clazz;
} @Override
public Object handler(ResultSet rs) {
try {
if (!rs.next()) {
return null;
}
Object bean = clazz.newInstance();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
for (int i = 0; i < columnCount; i++) {
String name = metaData.getColumnName(i + 1);// 得出每一列的列名
Object value = rs.getObject(i + 1);// 得到每一列的值
Field field = clazz.getDeclaredField(name);// 利用反射,根据列名得到属性对象
field.setAccessible(true);
field.set(bean, value);
}
return bean;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
package com.jdbc.orm.junit;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import org.junit.Test; import com.jdbc.orm.bean.Student;
import com.jdbc.orm.dbutils.DBUtils;
import com.jdbc.orm.handler.BeanHandler;
import com.jdbc.orm.handler.BeanListHandler; /**
* 描述 : 测试DBUtils
* @version 创建时间:2017年10月6日 下午2:40:45
*/
public class TestDBUtils {
DBUtils dbUtils = new DBUtils();
@Test
public void test(){
System.out.println(dbUtils.driverClass);
System.out.println(dbUtils.password);
System.out.println(dbUtils.url);
System.out.println(dbUtils.username);
} @Test
public void testSetParams() throws SQLException{
String sql = "select name from student where id = ?";
Object params[] = {1};
DBUtils.setParams(sql, params);
}
@Test
public void testQueryBeanById() throws Exception{
String sql = "select id,name,chinese,english,math from student where id = ?";
ResultSet rs=dbUtils.queryBeanById(sql, 1);
Student student = new Student(); while(rs.next()){
student.setId(rs.getInt(1));
student.setName(rs.getString(2));
student.setChinese(rs.getDouble(3));
student.setEnglish(rs.getDouble(4));
student.setMath(rs.getDouble(5));
}
System.out.println(student);
} @Test
public void testUpdate() throws SQLException{
String sql = "update student set name=? where id =?";
Object[] params = {"李晓明",1};
int rows = dbUtils.update(sql, params);
System.out.println(rows);
} @Test
public void testQuery() throws Exception{
String sql = "select id,name,chinese,english,math from student where id = ?";
Student student = new Student();
student = (Student) dbUtils.query(sql,new BeanHandler(Student.class), 1);
System.out.println(student);
}
@Test
public void testQuery1() throws Exception{
String sql = "select id,name,chinese,english,math from student";
List<Student> list = new ArrayList<>();
list = (List<Student>) dbUtils.query(sql,new BeanListHandler(Student.class), null);
System.out.println(list.size());
System.out.println(list);
}
}

利用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. Entity Framework Core Like 查询揭秘

    在Entity Framework Core 2.0中增加一个很酷的功能:EF.Functions.Like(),最终解析为SQL中的Like语句,以便于在 LINQ 查询中直接调用. 不过Entit ...

  2. 软件工程(GZSD2015)学生博客列表

    2015年贵州师范大学软件工程课程学生博客列表 陈小丽 郑倩 唐洁 周娟 李利思 肖俊 罗文豪 周静 徐明艳 毛涛 邓洪虹 岳庆 李盼 安坤 何亚 涂江凤 张义平 杨明颢 杨家堂 胡贵玲 寿克霞 吴明 ...

  3. 英语app分析

    Andorid 版本 第一部分 调研, 评测 搜索了一下必应跑出来的是微软必应,在印象中微软的产品都是很可靠地.安装之后对它的 排版字体图片等不是很喜欢,感觉有道词典会更亲切一点. 必应       ...

  4. 201521123050 《Java程序设计》第8周学习总结

    1. 本周学习总结 2. 书面作业 1.List中指定元素的删除(题目4-1) 1.1 实验总结 在删除元素时,要注意后续元素位置的前移 2.统计文字中的单词数量并按出现次数排序(题目5-3) 2.1 ...

  5. 201521123007《Java程序设计》第7周学习总结

    1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 以下是ArrayList的contains源代码: public bool ...

  6. 201521123101 《Java程序设计》第5周学习总结

    1. 本周学习总结 2. 书面作业 1. 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 不能 ...

  7. 201521123062 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  8. Junit4学习(二)测试失败的情况

    一,前言 首先理解: 1,测试用例不是证明你是对的,而是证明你没有错 2,测试用例用来达到想要的预期结果,但对于逻辑错误无能为力 二,两种测试失败:error And Failure 1,Failur ...

  9. Day-16: 图形界面

    Python支持多种图形界面,有:第三方库有Tk.wxWidgets.Qt.GTK等. Python自带的库是支持Tk的Tkinter,无需安装任何安装包,就可以直接使用. 在Python中使用函数调 ...

  10. SAP高可用性(HA)

    1.SAP系统高可用的要求 高可用性是从终端用户的角度来需求,及要求最大化系统的可用性.其目的是降低意外系统关闭时间(服务器生效.存储失效.操作系统失败--),减少预期系统关闭时间(系统及架构的维护. ...