依靠反射来个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学习系列(八)( 面向对象基础)
Python学习系列(八)( 面向对象基础) Python学习系列(七)( 数据库编程) 一,面向对象 1,域:属于一个对象或类的变量.有两种类型,即实例变量—属于每个实例/类的对象:类变量—属于类 ...
- 【转】MFC对话框和控件
原文网址:http://www.cnblogs.com/tiwlin/archive/2013/05/08/3067966.html 对话框和控件 对话框是Windows应用程序中一种常用的资源,其主 ...
- 关于RAS加密中pfx格式提取字符串私钥 (转)
openssl 使用以下命令 如果如果执行出错,请查看是否安装环境或在命令前面加上openssl --提取出来的无法直接使用 pkcs12 -in zhaoshang2.pfx -nocerts -n ...
- SharePoint中使用Visio Service展示业务数据
SharePoint中可以通过Visio Service可以在浏览器中查看Visio图,功能部署到系统中,一切安好. 而现实总是很折磨人,使用该功能后,相关使用者随后提出,Visio图能否与我的业务数 ...
- phpstudy mysql无法启动
在安装好phpstudy后,Apache可以启动,Mysql无法启动. 以管理员的身份运行cmd,然后输入sc delete mysql 即可
- (转)Inno Setup入门(十)——操作注册表
本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250871 有些程序需要随系统启动,或者需要建立某些文件关联等问题 ...
- Hibernate学习11——Hibernate 高级配置(连接池、log4j)
第一节:配置数据库连接池 这里配置c3p0连接池,需要的jar包: jar包位于hibernate压缩包的:hibernate-release-4.3.5.Final\lib\optional\c3p ...
- isset ,empty,is_null 区别
<?php $a = ''; $b = ""; $c = null; $d = array(); $e = ' '; $f = 0; $g = "0"; ...
- 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内。以及两点间的测距功能
权声明:本文为博主原创文章,未经博主允许不得转载. 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内.以及两点间的测距功能. 绘制多边形(蓝色) ...
- python 之 Collections模块
官方文档:https://yiyibooks.cn/xx/python_352/library/collections.html 参考: https://blog.csdn.net/songfreem ...