这是DAO层,第一次尝试,如有bug希望能即使反馈,我们共同进步。具体的用法和实现原理我会在前面几篇博客中补充更新。配置文件及项目目录结构会在下一篇中贴出!

package com.javasm.supermarket.dao;

import java.util.List;
import java.util.Map; public interface DAO {
// 增加
void addObject(Object o);
// 删除
// void deleteObject(Object o);
// 修改
void updateObject(Object o);
/**
* 查询,可实现多查询或单一查询
* @param params
* @param tableName
* @return
*/
List<?> queryObject(); void deleteObject();
}

DAOImpl层源码

package com.javasm.supermarket.impl;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties; import com.javasm.supermarket.dao.DAO;
import com.javasm.supermarket.db.DBConnection; public class DAOImpl implements DAO {
private static Properties objectConfigPath = new Properties();
private static Properties objectConfig = new Properties();
private static String className;
private static Class<?> objectClass;
private static Field[] fields;
private static String tableName;
private static String queryBuilder;
private static String deleteBuilder;
/**
*
* 加载配置文件,从配置文件中获取bean和bean对应的表明
*
*/
static {
try {
DAOImpl.class.getClassLoader();
InputStream objectConfigPathInputStream = ClassLoader
.getSystemResourceAsStream("objectConfigPath.properties");
objectConfigPath.load(objectConfigPathInputStream);
InputStream objectConfigInputStream = ClassLoader
.getSystemResourceAsStream(objectConfigPath
.getProperty("objectConfigPath"));
objectConfig.load(objectConfigInputStream);
className = objectConfig.getProperty("className");
tableName = objectConfig.getProperty("tableName");
queryBuilder = objectConfig.getProperty("queryBuilder");
deleteBuilder = objectConfig.getProperty("deleteBuilder"); objectClass = Class.forName(className);
fields = objectClass.getDeclaredFields(); } catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
System.err.println("配置文件加载失败!");
}
} /**
* 插入数据
*/
@Override
public void addObject(Object object) {
StringBuilder sql = new StringBuilder("INSERT " + tableName
+ " VALUES(");
Connection connection = null;
PreparedStatement preparedStatement = null;
// 用于存放传入的对象的参数,默认将id值(主键)的key设为0,方便条件设置
Map<Integer, Object> fieldsValues = new HashMap<Integer, Object>();
try {
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
fieldsValues.put(i, fields[i].get(object));
sql.append("?");
if (i < (fields.length - 1))
sql.append(", "); }
sql.append(")");
connection = DBConnection.getConnection(); preparedStatement = connection.prepareStatement(sql.toString());
Class<?> fieldClass = null;
for (int i = 1; i <= fieldsValues.size(); i++) {
/**
* 获取存入map中对象的参数的类类型,根据类类型选择preparedStatement的set方法
*/
if (fieldsValues.get(i - 1) != null) {
fieldClass = fieldsValues.get(i - 1).getClass();
// 如果类类型为String.class,则执行setString
if (fieldClass.equals(String.class)) {
preparedStatement.setString(i,
(String) fieldsValues.get(i - 1));
}
// 如果类类型为Float.class,则执行setString
if (fieldClass.equals(Float.class)) {
preparedStatement.setFloat(i,
(Float) fieldsValues.get(i - 1));
}
// 如果类类型为Integer.class,则执行setString
if (fieldClass.equals(Integer.class)) {
preparedStatement.setInt(i,
(Integer) fieldsValues.get(i - 1));
}
// 如果类类型为Timestamp.class,则执行setString
if (fieldClass.equals(Timestamp.class)) {
preparedStatement.setTimestamp(i, new Timestamp(
((Date) fieldsValues.get(i - 1)).getTime()));
} } else {
preparedStatement.setObject(i, null);
} }
// 执行sql语句,返回更新参数
int columnsCount = preparedStatement.executeUpdate();
System.out.println("有" + columnsCount + "条数据被更新!"); } catch (SQLException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
DBConnection.close(connection, preparedStatement, null);
} } /**
*
* 删除数据,条件列表为空时删除所有数据
*/
@Override
public void deleteObject() {
StringBuilder sql = new StringBuilder(
"DELETE FROM order_info WHERE 1=1 ");
List<Map<String, Object>> params = builder(deleteBuilder);
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = DBConnection.getConnection();
if (params != null && params.size() > 0) {
for (int i = 0; i < params.size(); i++) {
Map<String, Object> map = params.get(i);
sql.append(" AND " + map.get("name") + " "
+ map.get("rela") + " " + map.get("value") + " ");
}
}
connection = DBConnection.getConnection();
preparedStatement = connection.prepareStatement(sql.toString());
preparedStatement.executeLargeUpdate(); } catch (SQLException e) {
e.printStackTrace();
System.out.println("删除失败!");
} catch (IllegalArgumentException e) {
e.printStackTrace();
} finally {
DBConnection.close(connection, preparedStatement, null);
} } /**
*
* 修改数据
*
*/
@Override
public void updateObject(Object object) {
StringBuilder sql = new StringBuilder("UPDATE " + tableName + " SET ");
Connection connection = null;
PreparedStatement preparedStatement = null;
// 用于存放传入的对象的参数,默认将id值(主键)的key设为0,方便条件设置
Map<Integer, Object> fieldsValues = new HashMap<Integer, Object>();
try {
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true); if (i == 0) {
fieldsValues.put(fields.length - 1, fields[i].get(object));
continue;
}
sql.append(fields[i].getName());
sql.append("=?");
fieldsValues.put(i - 1, fields[i].get(object));
if (i < (fields.length - 1))
sql.append(", ");
if (i == (fields.length - 1)) {
sql.append(" WHERE ");
sql.append(fields[0].getName());
sql.append("=?");
} }
connection = DBConnection.getConnection(); preparedStatement = connection.prepareStatement(sql.toString());
Class<?> fieldClass = null;
for (int i = 1; i <= fieldsValues.size(); i++) {
/**
* 获取存入map中对象的参数的类类型,根据类类型选择preparedStatement的set方法
*/
fieldClass = fieldsValues.get(i - 1).getClass();
// 如果类类型为String.class,则执行setString
if (fieldClass.equals(String.class)) {
preparedStatement.setString(i,
(String) fieldsValues.get(i - 1));
}
// 如果类类型为Float.class,则执行setString
if (fieldClass.equals(Float.class)) {
preparedStatement.setFloat(i,
(Float) fieldsValues.get(i - 1));
}
// 如果类类型为Integer.class,则执行setString
if (fieldClass.equals(Integer.class)) {
preparedStatement.setInt(i,
(Integer) fieldsValues.get(i - 1));
}
// 如果类类型为Timestamp.class,则执行setString
if (fieldClass.equals(Timestamp.class)) {
preparedStatement.setTimestamp(i, new Timestamp(
((Date) fieldsValues.get(i - 1)).getTime()));
} }
// 执行sql语句,返回更新参数
int columnsCount = preparedStatement.executeUpdate();
System.out.println("有" + columnsCount + "条数据被更新!"); } catch (SQLException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
DBConnection.close(connection, preparedStatement, null);
} } /**
*
* 数据查询,查询条件列表为空时查询所有数据
*
*/
@Override
public List<?> queryObject() {
List<Map<String, Object>> params = builder(queryBuilder);
List<Object> objectList = new ArrayList<Object>();
StringBuilder sql = new StringBuilder("SELECT * FROM " + tableName
+ " WHERE 1=1");
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null; try {
connection = DBConnection.getConnection();
if (params != null && params.size() > 0) {
for (int i = 0; i < params.size(); i++) {
Map<String, Object> map = params.get(i);
sql.append(" AND " + map.get("name") + " "
+ map.get("rela") + " " + map.get("value") + " ");
}
}
preparedStatement = connection.prepareStatement(sql.toString()); resultSet = preparedStatement.executeQuery();
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
// 获取数据列数
int columnsCount = resultSetMetaData.getColumnCount();
Field field = null;
Object object = null;
while (resultSet.next()) {
/**
* 获取实例化对象
*/
object = objectClass.newInstance(); String columnName = null;
String columnTypeName = null;
String columnValue = null; for (int i = 1; i <= columnsCount; i++) {
columnName = resultSetMetaData.getColumnName(i);
columnTypeName = resultSetMetaData.getColumnTypeName(i);
columnValue = resultSet.getString(i);
field = object.getClass().getDeclaredField(columnName);
field.setAccessible(true);
switch (columnTypeName) {
case "INT":
field.set(object, Integer.parseInt(columnValue));
break;
case "TINYINT":
field.set(object, Integer.parseInt(columnValue));
break;
case "VARCHAR":
field.set(object, columnValue);
break;
case "FLOAT":
field.set(object, Float.parseFloat(columnValue));
break;
case "DATETIME":
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
field.set(object, simpleDateFormat.parse(columnValue));
break;
} }
objectList.add(object); } } catch (SQLException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} finally {
DBConnection.close(connection, preparedStatement, resultSet);
}
return objectList;
} /**
* 从配置文件中提取删除或查询条件,如果传入的builder为null,则返回空列表
*
* @param builder
* @return
*/
private List<Map<String, Object>> builder(String builder) {
List<Map<String, Object>> paramList = new ArrayList<Map<String, Object>>();
if (builder.equals("null")) {
paramList = null;
} else {
Map<String, Object> param = null;
String[] values = null;
System.out.println(builder.contains(";"));
if (builder.contains(";")) {
String[] mapValue = builder.split(";");
for (String string : mapValue) {
values = string.split(",");
param = new HashMap<String, Object>();
param.put("name", values[0]);
param.put("rela", values[1]);
param.put("value", values[2]);
paramList.add(param);
}
} else {
values = builder.split(",");
param = new HashMap<String, Object>();
param.put("name", values[0]);
param.put("rela", values[1]);
param.put("value", values[2]);
paramList.add(param);
}
}
return paramList;
} }

反射实现数据库增删改查DAO及DAOImpl源代码(一)的更多相关文章

  1. 反射实现数据库增删改查DAO及DAOImpl源代码(二)

    配置文件源码 配置文件主要用于配置数据库对象(javaBean),配置表名,配置查询条件,配置删除条件 文件名称:objectConfigPath.properties 这个配置文件里面配置的是另外一 ...

  2. Java连接MySQL数据库增删改查通用方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...

  3. mybatis--实现数据库增删改查

    首先,创建一个数据库my,并在数据库中插入一张表user,然后在user表中插入一行数据,代码如下: create database my; use my; create table user( id ...

  4. Yii2.0高级框架数据库增删改查的一些操作(转)

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2.0高级框架数据库增删改查的一些操作 --------------------------- ...

  5. 2. MongoDB基本操作 —— 用Mongo.exe操作数据库增删改查

    一.开篇 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(collection).文档对象 ...

  6. go——beego的数据库增删改查

    一直都不理解使用go语言的时候,为什么还要自己去装beego,以为使用go便可以解决所有的问题,结果在朋友的点拨下,才意识到: go与beego的关系就好比是nodejs与thinkjs的关系,因此也 ...

  7. (转)SQLite数据库增删改查操作

    原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数 ...

  8. Yii2.0高级框架数据库增删改查的一些操作

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2.0高级框架数据库增删改查的一些操作 --------------------------- ...

  9. WindowsPhone8 数据库增删改查

    今天第一次在博客园发表文章,如果有的地方写的不对,还请大家指出! 1.这就是一个简单wp8数据库增删改查 1.创建数据表Person [Table] public class Person : INo ...

随机推荐

  1. linux没有eth0

    1.创建ifcfg-eth0 touch /etc/sysconfig/network-scripts/ifcfg-eth0 2.配置ifcfg-eth0 DEVICE=eth0 HWADDR=:0c ...

  2. poj-1442 Black Box(Treap)

    题目链接: Black Box 题意: 给一个序列,m个询问,每个询问是求前x个数中的第i小是多少; 思路: Treap的入门题目;Treap能实现STL的set实现不了的功能,如名次树(rank t ...

  3. 【leetcode刷题笔记】N-Queens

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  4. bzoj 2969: 矩形粉刷 概率期望

    题目: 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以把这两格子为对角的,平行于木板边界的一个子矩形 ...

  5. 11g RAC 如何备份OCR,利用备份恢复OCR,ocrdump

    OCR备份 OCR的备份有2种方式,自动备份和手工备份. 自动备份策略: Oracle Clusterware 每隔4小时,CRSD 进程会自动对OCR 进行一次备份,在任意时刻,oracle 总会保 ...

  6. linux shell查询

    查看当前版本可用的shell cat /etc/shells 查看当前使用的shell echo $0 查看当前用户默认使用的shell echo $SHELL

  7. Poj 2304 Combination Lock(模拟顺、逆时钟开组合锁)

    一.题目大意 模拟一个开组合的密码锁过程.就像电影你开保险箱一样,左转几圈右转几圈的就搞定了.这个牌子的锁呢,也有它独特的转法.这个锁呢,有一个转盘,刻度为0~39.在正北方向上有一个刻度指针.它的密 ...

  8. SQL语法基础:DDL、DML

    一.DDL(Data Definition Language):数据定义语句 #常见的语句 1)CREATE TABLE/DATABASE:创建数据库 CREATE [TEMPORARY] TABLE ...

  9. unittest ,ddt数据驱动,读取文件中数据,多个参数时的处理

    1. test.yaml中的数据 这里的属性是list 2.创建用例 3,在yaml中创建数据,创建list数据,list中再创建dict数据,这样就可以读取dict中的多个参数的数据了

  10. Go语言命令行操作命令详细介绍

    转自:http://www.jb51.net/article/56781.htm Go 命令 Go语言自带有一套完整的命令操作工具,你可以通过在命令行中执行go来查看它们: 图 Go命令显示详细的信息 ...