依靠反射来个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•在运行时判断 ...
随机推荐
- 随着tomcat一起启动一个线程
package test; import javax.servlet.*; public class MyCode implements ServletContextListener { //当Tom ...
- springboot: 集成jdbc
1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- java 简洁的分层实现
1.分页实现 分页实现是将所有查询结果保存在session对象或集合中,翻页时从session对象或集合中取出一页所需的数据显示.但是这种方法有两个最主要的缺点:一是用户看到的可能是过期数据:二是如果 ...
- 【备忘录】Golang交叉编译
Golang 支持交叉编译,在一个windows平台可以生成linux或Mac系统下的可执行文件. Mac 下编译 Linux 和 Windows 64位可执行程序 CGO_ENABLED=0 GOO ...
- expdp实现oracle远程服务器导出到本地
expdp导出 expdp user/pwd@orcl directory=dd network_link=dblink dumpfile=fileName.dmp //user为本地用户名 //ne ...
- appium历史版本下载地址
https://github.com/appium/appium-desktop/releases
- java代码----数据类型的转换-----int --->String
总结:int ----->String package com.a.b; //测试..char--->int // int--->String public class Yue2 { ...
- ptyhon中文本挖掘精简版
import xlrd import jieba import sys import importlib import os #python内置的包,用于进行文件目录操作,我们将会用到os.listd ...
- Filter command
1. grep egrep fgrep 2. sort sort -d sort -n sort -r sort -f 3. uniq uniq -d uniq -u uniq -c 4. ...
- Mybatis扩展
分页插件PageHelper 其实Mybstis内部有实现逻辑分页的功能,但是较为麻烦和难用.这里记录一个分页插件PageHelper的使用,我们可以在它的github地址https://github ...