闲来无事,写个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的更多相关文章

  1. dbutils中实现数据的增删改查的方法,反射常用的方法,绝对路径的写法(杂记)

    jsp的三个指令为:page,include,taglib... 建立一个jsp文件,建立起绝对路径,使用时,其他jsp文件导入即可 导入方法:<%@ include file="/c ...

  2. 利用反射和ResultSetMetaData实现DBUtils的基本功能

    DBUtils大大简化了JDBC的书写,极大的提高了开发效率,和数据库连接池一起,简化了JDBC开发的流程.简易的自定义数据库连接池可以通过装饰者设计模式和动态代理模式得到很简单的实现,那么DBUti ...

  3. 反射模拟DbUtils实现ResultSet转成Bean实例

    前几天接触到了apache的一个小框架DbUtils,真的被其优雅的设计所震撼到了,尤其是其中的 MyBean mybean = QueryRunner.query(sqlConnection,sql ...

  4. 使用Java封装一个DBUtils类(反射)

    刚开始学JavaWeb时,我是调用N个setter方法将从数据库中查询出的数据封装成JavaBean的,极其繁琐. 后来了解SpringJDBC后,发现它提供的接口非常简单,然后就想自己封装一个简单的 ...

  5. 【Java EE 学习 17 上】【dbutils和回调函数】

    一.dbutils的核心就是回调函数,可以说如果没有回调函数的思想,dbutils是不可能被开发出来的. 对于dbutils中的QuryRunner类,向该类的query方法提供不同的参数,可以得到不 ...

  6. 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】

    一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...

  7. DbUtils是Apache出品一款简化JDBC开发的工具类

    DbUtils     - DbUtils是Apache出品一款简化JDBC开发的工具类     - 使用DbUtils可以让我们JDBC的开发更加简单     - DbUtils的使用:       ...

  8. JNDI和在tomcat中配置DBCP连接池 元数据的使用 DBUtils框架的使用 多表操作

    1 JNDI和在tomcat中配置DBCP连接池 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.namin ...

  9. 反射机制及开源框架xUitls的使用,使用HttpUtils通过断点续传下载文件

    反射: Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性 Java反射机制主要提供下面几种用途: 1•在运行时判断 ...

随机推荐

  1. gradle 项目构建以及发布maven 私服&& docker 私服构建发布

    1. 项目结构   2. 代码说明 a. Dockerfile docker 构建的 FROM openjdk:8-jre-alpine WORKDIR /appdemo/ COPY build/di ...

  2. caddy server 了解

    Caddy 是一个Go写的服务器软件,官方的宣传语“The HTTP/2 web server with automatic HTTPS”以及“Serve The Web Like It's 2016 ...

  3. Fiddler+Firefox

    配置置代理了,发现还是不好用!无法抓包: 配置就是在firefox的“选项”,拉到最下面,就能够看到“网络代理”,点进去:手动代理里面输入Fiddler的代理信息(默认127.0.0.1:8888) ...

  4. mysql大数据量之limit优化

    背景:当数据库里面的数据达到几百万条上千万条的时候,如果要分页的时候(不过一般分页不会有这么多),如果业务要求这么做那我们需要如何解决呢?我用的本地一个自己生产的一张表有五百多万的表,来进行测试,表名 ...

  5. jq 合并json对象

    一,保存object1和2合并后产生新对象,若2中有与1相同的key,默认2将会覆盖1的值 1 var object = $.extend({}, object1, object2); 二,将2的值合 ...

  6. appium+python自动化32-android_uiautomator定位进阶版

    前言 上一篇介绍uiautomator的定位方式都是类似这种'new UiSelector().xxx("xxx")',看起非常长,我也记不住,这很不python.于是本篇优化了定 ...

  7. Java Thread 多线程同步、锁、通信

    参看:http://www.cnblogs.com/hoojo/archive/2011/05/05/2038101.html

  8. touch python

    一  使用while循环输出 1 2 3 4 5 6 8 9 10. i=0 while i<10: i=i+1 if i == 7: continue print(i) 二  求 1-100所 ...

  9. win iso download

    http://rufus.akeo.ie/ window iso download http://win.86tyu.cn/ylmf32win7.html

  10. KEGG Pathway Anonatation

    转载于 Original 2017-06-20 liuhui 生信百科 KEGG 数据库中,把功能相似的蛋白质归为同一组,然后标上 KO 号.通过相似性比对,可以为未知功能的蛋白序列注释上 KO 号. ...