依靠反射来个Dbutils
闲来无事,写个dbutils玩玩,不完善,满足基本增删改查,上代码
1、Dbutils
package db; import annotation.Table;
import java.util.*;
import java.sql.*;
import java.lang.reflect.Field; /**
*
* @author xjy
* @param <T>
*/
public class DbUtil<T> { private static DataBase dataBase = null;
private static Connection con = null;
private static Statement st = null; public DbUtil() {
dataBase = new DataBase();
} @SuppressWarnings("null")
public List<T> getAll(T bean) throws Exception { List<T> list = new ArrayList<>();
Class<T> clazz = (Class<T>) bean.getClass();
Table table = clazz.getDeclaredAnnotation(Table.class);
String name = table.name(); String tableName;
if (!"".equals(name)) {
tableName = name;
} else {
tableName = clazz.getSimpleName().toLowerCase();
} StringBuilder sql = new StringBuilder("select * from " + tableName); if (bean != null) {
sql.append(" where ");
Field[] declaredFields = clazz.getDeclaredFields(); for (Field declaredField : declaredFields) {
//打开私有访问
declaredField.setAccessible(true);
String name1 = declaredField.getName();
Object value = declaredField.get(bean);
if (value != null && !"id".equals(name1)) {
sql.append(name1).append("='").append(value).append("' and ");
}
}
sql.append("1=1");
} con = dataBase.getConnection();
st = dataBase.getStatement(); ResultSet rs = st.executeQuery(sql.toString()); Field[] fields = clazz.getDeclaredFields();
while (rs.next()) { T t = clazz.newInstance(); for (Field field : fields) {
String fName = field.getName();
String str = rs.getString(fName);
field.setAccessible(true); // 如果类型是Integer
if (field.getGenericType().toString().equals("class java.lang.Integer")) {
field.set(t, Integer.valueOf(str));
} else {
field.set(t, str);
} } list.add(t);
} return list;
} public int add(T bean) throws Exception {
con = dataBase.getConnection();
st = dataBase.getStatement();
Class<T> clazz = (Class<T>) bean.getClass();
Table table = clazz.getDeclaredAnnotation(Table.class);
String name = table.name(); String tableName;
if (!"".equals(name)) {
tableName = name;
} else {
tableName = clazz.getSimpleName().toLowerCase();
} Field[] fields = clazz.getDeclaredFields(); StringBuilder sql = new StringBuilder("insert into " + tableName + "("); for (Field field : fields) {
String fName = field.getName();
if (!"id".equals(fName)) {
sql.append(fName).append(","); }
} sql.deleteCharAt(sql.length() - 1).append(") values("); Field[] declaredFields = clazz.getDeclaredFields(); for (Field declaredField : declaredFields) { if (!"id".equals(declaredField.getName())) {
//打开私有访问
declaredField.setAccessible(true);
Object value = declaredField.get(bean);
sql.append("'").append(value).append("',");
} } sql.deleteCharAt(sql.length() - 1).append(")");
int result = 0; try {
result = st.executeUpdate(sql.toString());
} catch (SQLException se) {
System.out.println(se.getMessage());
} finally { }
return result;
} @SuppressWarnings("FinallyDiscardsException")
public List<Map<String, Object>> querySql(String sql) {
List<Map<String, Object>> list = new ArrayList<>(); con = dataBase.getConnection();
st = dataBase.getStatement();
@SuppressWarnings("UnusedAssignment")
ResultSet rs = null;
try {
rs = st.executeQuery(sql);
ResultSetMetaData md = rs.getMetaData(); //获得结果集结构信息,元数据
int columnCount = md.getColumnCount(); //获得列数
while (rs.next()) {
Map<String, Object> rowData = new HashMap<>();
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));
}
list.add(rowData);
}
} catch (SQLException e) {
System.out.println(e.toString()); } finally {
dataBase.closeConnection();
return list;
}
} @SuppressWarnings("FinallyDiscardsException")
public int executeSql(String sql) {
con = dataBase.getConnection();
st = dataBase.getStatement();
int result = 0;
try {
result = st.executeUpdate(sql);
} catch (SQLException se) {
System.out.println(se.getMessage());
} finally {
dataBase.closeConnection();
return result;
}
} @SuppressWarnings("MismatchedReadAndWriteOfArray")
public int update(T bean) throws Exception {
con = dataBase.getConnection();
st = dataBase.getStatement();
Class<T> clazz = (Class<T>) bean.getClass();
Table table = clazz.getDeclaredAnnotation(Table.class);
String name = table.name(); String tableName;
if (!"".equals(name)) {
tableName = name;
} else {
tableName = clazz.getSimpleName().toLowerCase();
} StringBuilder sql = new StringBuilder("update " + tableName + " set "); Field[] declaredFields = clazz.getDeclaredFields(); for (Field declaredField : declaredFields) {
declaredField.setAccessible(true);
//打开私有访问
String name1 = declaredField.getName();
Object value = declaredField.get(bean);
if (value != null && !"id".equals(name1)) {
sql.append(name1).append("='").append(value).append("',");
}
}
Field field1 = clazz.getDeclaredField("id");
field1.setAccessible(true); sql.deleteCharAt(sql.length() - 1).append(" where id =").append(field1.get(bean)); int result = 0; try {
result = st.executeUpdate(sql.toString());
} catch (SQLException se) {
System.out.println(se.getMessage());
} finally {
}
return result;
}
}
2、注解Table
package annotation; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
*
* @author xjy
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table { public String name() default ""; }
3、database,获取连接等,这里用的sqlserver,其他自己发挥咯
package db; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement; /**
*
* @author Administrator
*/
public class DataBase { private String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=db_car";
private String userName = "sa";
private String userPasswd = "123456";
private Connection connection;
private Statement statement;
public DataBase(){
try {
Class.forName(driverName);
}
catch (ClassNotFoundException cnfex){
System.err.println("装载 JDBC/ODBC 驱动程序失败。");
cnfex.printStackTrace();
System.exit(1);
}
}
//取得与数据库的连接
public Connection getConnection(){
try {
//捕获连接数据库异常
connection = DriverManager.getConnection(url, userName, userPasswd);
}
catch (SQLException sqlex){
System.err.println("无法连接数据库");
sqlex.printStackTrace();
System.exit(1);
}
finally {
return connection;
}
}
//取得 statement
public Statement getStatement(){
try {
if (connection != null){
statement = connection.createStatement();
}
}
catch (SQLException sqlex){
System.err.println("无法取得 Statement");
sqlex.printStackTrace();
System.exit(1);
}
finally{
return statement;
}
}
public void closeConnection(){
try {
if (null != statement){
statement.close();
}
if (null != connection){
connection.close();
}
statement = null;
connection = null;
}
catch (Exception e){
e.printStackTrace();
}
}
}
所需驱动文件:https://files.cnblogs.com/files/xujingyang/sqljdbc4.zip
顺便说下,开发工具玩的是NetBeans
依靠反射来个Dbutils的更多相关文章
- dbutils中实现数据的增删改查的方法,反射常用的方法,绝对路径的写法(杂记)
jsp的三个指令为:page,include,taglib... 建立一个jsp文件,建立起绝对路径,使用时,其他jsp文件导入即可 导入方法:<%@ include file="/c ...
- 利用反射和ResultSetMetaData实现DBUtils的基本功能
DBUtils大大简化了JDBC的书写,极大的提高了开发效率,和数据库连接池一起,简化了JDBC开发的流程.简易的自定义数据库连接池可以通过装饰者设计模式和动态代理模式得到很简单的实现,那么DBUti ...
- 反射模拟DbUtils实现ResultSet转成Bean实例
前几天接触到了apache的一个小框架DbUtils,真的被其优雅的设计所震撼到了,尤其是其中的 MyBean mybean = QueryRunner.query(sqlConnection,sql ...
- 使用Java封装一个DBUtils类(反射)
刚开始学JavaWeb时,我是调用N个setter方法将从数据库中查询出的数据封装成JavaBean的,极其繁琐. 后来了解SpringJDBC后,发现它提供的接口非常简单,然后就想自己封装一个简单的 ...
- 【Java EE 学习 17 上】【dbutils和回调函数】
一.dbutils的核心就是回调函数,可以说如果没有回调函数的思想,dbutils是不可能被开发出来的. 对于dbutils中的QuryRunner类,向该类的query方法提供不同的参数,可以得到不 ...
- 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】
一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...
- DbUtils是Apache出品一款简化JDBC开发的工具类
DbUtils - DbUtils是Apache出品一款简化JDBC开发的工具类 - 使用DbUtils可以让我们JDBC的开发更加简单 - DbUtils的使用: ...
- JNDI和在tomcat中配置DBCP连接池 元数据的使用 DBUtils框架的使用 多表操作
1 JNDI和在tomcat中配置DBCP连接池 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.namin ...
- 反射机制及开源框架xUitls的使用,使用HttpUtils通过断点续传下载文件
反射: Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性 Java反射机制主要提供下面几种用途: 1•在运行时判断 ...
随机推荐
- Python 函数 -range()
range() pytho range() 函数可创建一个整数列表,一般用在 for 循环中. 语法: range(start, stop[, step]) start: 计数从 start 开始.默 ...
- Android.mk语法解析
Android.mk 相当于 Linux 中的 Makefile 文件,用来向安卓系统描述如何编译源代码.该文件会被编译器解析多次,所以尽量减少在 Android.mk 中声明变量. Android. ...
- advapi32.dll kernel32.dll 中的两套注册表API
日前遇到一件事:WebBrowser中的网页会用到一个“大众”ActiveX控件,为了保证兼容性以及和其它程序互不干扰,我们采用这样一种方案: 1. 我们的软件会自带该控件: 2. 如果系统中已注册有 ...
- NAT功能测试
一.测试目标和功能: 1.内网设备可以访问外网的IP: 2.外网PC可以登录内网设备的telnet. 二.设备硬件结构 1.3135相当于交换机: 2.eth0.netra和业务网口通过内部端口连接3 ...
- 【转】挟天子以令诸侯博客关于TCP/IP模型与OSI模型的区别
挟天子以令诸侯 博客园 首页 新随笔 联系 订阅 管理 随笔 - 21 文章 - 0 评论 - 9 TCP/IP四层模型与OSI参考模型 TCP/IP四层模型: 1.链路层(数据链路层/网络接 ...
- Java Scanner 类,获取用户输入的值
Scanner 类使用步骤 1.导入java.util.Scanner import java.util.Scanner; 2.创建Scanner对象 Scanner scan = new Scann ...
- .NET单点登录实现方法----两种
第一种模式:同一顶级域名下cookie共享,代码如下 HttpCookie cookies = new HttpCookie("Token"); cookies.Expires = ...
- 大白话系列之C#委托与事件讲解大结局
声明:本系列非原创,因为太精彩才转载,如有侵权请通知删除,原文:http://www.cnblogs.com/wudiwushen/archive/2010/04/20/1698795.html 今天 ...
- 【洛谷】P1196 银河英雄传说(并查集)
题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...
- sram的读和写
sram的型号:ISSI IS61LV25616 -10TL 以上是数据手册上的. 对sram的认识:SRAM不需要刷新电路即能保存它内部存储的数据.而DRAM(Dynamic Random Acce ...