利用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. IPsec_VPN实现技术【转载】

    GRE Tunnel GRE Tunnel(General Routing Encapsulation 通用路由封装)是一种非常简单的VPN(Virtual Private Network 虚拟专用网 ...

  2. 四则运算 WEB

    coding.net:https://git.oschina.net/ysh0904/WEB.git 一.需求分析 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算 ...

  3. 201521123025《JAVA程序设计》第6周学习总结

    1. 本章学习总结 2. 书面作业 Q1.clone方法 1.1Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 要克隆对象要覆盖clon ...

  4. 201521123030《Java程序设计》 第2周学习总结

    本周学习总结 String常量,创建之后不能再进行修改 使用+连接字符串会产生新字符串,要大量使用重复性连接应用StringBuilder,检测字符串相等应用equal方法. 枚举类型变量的取值在一个 ...

  5. Java多态总结

    面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 1.定义: 多态:指允许不同类的对象对同一消息做出响应.即同一消息可 ...

  6. 下载安装ActiveMQ(消息队列)

    安装步骤: 第一步.安装jdk环境,因为ActiveMQ是使用java语言编写. 第二步.将下载好的activemq压缩包上传至Linux系统,进行解压. 第三步.进入解压后的bin/目录,进行启动a ...

  7. Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】

    前言 在写完Spring第二和第三篇后,去读了Spring In Action这本书-发现有知识点要补充,知识点跨越了第二和第三篇,因此专门再开一篇博文来写- 通过java代码配置bean 由于Spr ...

  8. 时间效率:最小的K个数

    输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. import java.util.ArrayList; import jav ...

  9. Saltstack批量编译部署nginx(多模块)

    最近一直在研究saltstack的同步文件和批量执行命令,随着架构的变大,批量部署的需求也变得明显起来了,我需要用一条命令就部署好nginx和tomcat,并且符合我所有的环境需求,可以直接投入生产环 ...

  10. Apache POI

    Apache POI 用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.POI为"Po ...