import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList; public class RDao { /**
* 通过表明获取数据库中表的列明
* @param tableName
* @return
*/
public ArrayList<String> getAllColumn(String tableName){
ArrayList<String> ar = new ArrayList<String>();
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
//1=2不成立只能查出来列明
String sql = "select * from "+tableName+" where 1=2";
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery(); ResultSetMetaData metedata = rs.getMetaData();
int colum = metedata.getColumnCount();
for (int i=1;i<=colum;i++) {
String columnName = metedata.getColumnName(i);
ar.add(columnName);
} } catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps, rs);
} return ar;
}
/**
* 通过元数据获得数据列明,数据类型等
*
* 两者的区别R可以获得SQL语句查询出来的所有的列明
* D只可以获取单表列明以及列的所有的属性
*
* @param tableName
* @return
*/
public ArrayList<String> getAllColumns(String tableName){
ArrayList<String> ar = new ArrayList<String>();
Connection conn = BaseConnection.getConnection();
ResultSet rs = null;
try {
//数据库元数据对象,就是数据库数据对象
DatabaseMetaData dbm = conn.getMetaData();
rs = dbm.getColumns(null, "%", tableName, "%");
while (rs.next()) {
String columnName = rs.getString("COLUMN_NAME");
String columnType = rs.getString("TYPE_NAME");
String datasize = rs.getString("COLUMN_SIZE");
String digits = rs.getString("DECIMAL_DIGITS");
String nullable = rs.getString("NULLABLE");
ar.add(columnName);
} } catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, rs);
} return ar; } public boolean insert(Object ob){
boolean b = false;
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null; Class cl = ob.getClass(); Field[] fi = cl.getDeclaredFields(); ArrayList<String >col = getAllColumn(cl.getSimpleName()); StringBuffer sb = new StringBuffer();
StringBuffer sb1 = new StringBuffer(); sb.append("insert into ");
sb.append(cl.getSimpleName());
sb.append("(");
for (int i=1;i<col.size();i++) {
sb.append(col.get(i));
sb1.append("?");
if (i != col.size()-1) {
sb.append(",");
sb1.append(",");
}
}
sb.append(")values(");
sb.append(sb1);
sb.append(")"); try {
ps = conn.prepareStatement(sb.toString());
for (int i=1;i<col.size();i++) {
for (Field ff:fi) {
if (ff.getName().equals(col.get(i))) {
ff.setAccessible(true);
ps.setObject(i, ff.get(ob));
break; }
}
} int a = ps.executeUpdate();
if (a > 0) {
b = true;
} } catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps);
} return b;
} //需求是现在有一个表,这个表是一个订单表(订单号,订单时间,订单人)
// 33 20150101 zhang
// 从表订单详细表 编号 订单号 商品名 数量
// 1 33 ku 2
// 2 33 qun 3
//依次订单有好多数据,我们插入数据的时候就是先插入订单表,然后再插入订单详细表,再插入订单详细表的时候你是需要订单表中的订单号的。 public int insertGetKey(Object ob) { int id = 0;
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null; Class cl = ob.getClass(); Field[] fi = cl.getDeclaredFields(); ArrayList<String >col = getAllColumn(cl.getSimpleName()); StringBuffer sb = new StringBuffer();
StringBuffer sb1 = new StringBuffer(); sb.append("insert into ");
sb.append(cl.getSimpleName());
sb.append("(");
for (int i=1;i<col.size();i++) {
sb.append(col.get(i));
sb1.append("?");
if (i != col.size()-1) {
sb.append(",");
sb1.append(",");
}
}
sb.append(")values(");
sb.append(sb1);
sb.append(")"); try {
ps = conn.prepareStatement(sb.toString());
for (int i=1;i<col.size();i++) {
for (Field ff:fi) {
if (ff.getName().equals(col.get(i))) {
ff.setAccessible(true);
ps.setObject(i, ff.get(ob));
break; }
}
} int a = ps.executeUpdate();
if (a > 0) {
////获得主键,主键必须是递增,还有必须是添加的方法才能获得主键
rs = ps.getGeneratedKeys();
if (rs.next()) {
id = rs.getInt(1);
}
} } catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps);
} return id; } //删除自己写根据id删除 public boolean deleteById(Class cl,int id) { boolean b = false; Object ob = null;
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null; Field[] fi = cl.getDeclaredFields();
//获得表中的所有列
ArrayList<String> col = getAllColumns(cl.getSimpleName()); StringBuffer sb = new StringBuffer();
sb.append("delete "); sb.append("from ");
sb.append(cl.getSimpleName());
sb.append("where");
sb.append(col.get(0));
sb.append("?"); try {
ps = conn.prepareStatement(sb.toString());
ps.setInt(1, id);
int a = ps.executeUpdate(); if (a>0) {
b = true;
} } catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps);
} return b; } /**
* 这个方法是不需要的,没有意义,直接忘记,还获取不到值
* @param ob
* @return
*/
public int updateGetKey(Object ob){
int id = 0;
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
Class cl = ob.getClass(); Field[] fi = cl.getDeclaredFields(); ArrayList<String >col = getAllColumn(cl.getSimpleName()); StringBuffer sb = new StringBuffer(); sb.append("update ");
sb.append(cl.getSimpleName());
sb.append(" set"); for (int i=1;i<col.size();i++) {
sb.append(col.get(i));
sb.append("?");
if (i != col.size()-1) {
sb.append(","); }
} sb.append(" where");
sb.append(col.get(0));
sb.append("=?"); try {
ps = conn.prepareStatement(sb.toString());
for (int i=1;i<col.size();i++) {
for (Field ff:fi) {
if (ff.getName().equals(col.get(i))) {
ff.setAccessible(true);
ps.setObject(i, ff.get(ob));
break; }
}
} fi[0].setAccessible(true);
ps.setObject(col.size(), fi[0].get(ob));
int a = ps.executeUpdate();
if (a > 0) {
//获得主键,主键必须是递增,还有必须是添加的方法才能获得主键
rs = ps.getGeneratedKeys();
if (rs.next()) {
id = rs.getInt(1);
}
} } catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps);
} return id;
} public boolean update(Object ob){
boolean b = false;
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null; Class cl = ob.getClass(); Field[] fi = cl.getDeclaredFields(); ArrayList<String >col = getAllColumn(cl.getSimpleName()); StringBuffer sb = new StringBuffer(); sb.append("update ");
sb.append(cl.getSimpleName());
sb.append(" set"); for (int i=1;i<col.size();i++) {
sb.append(col.get(i));
sb.append("?");
if (i != col.size()-1) {
sb.append(","); }
} sb.append(" where");
sb.append(col.get(0));
sb.append("=?"); try {
ps = conn.prepareStatement(sb.toString());
for (int i=1;i<col.size();i++) {
for (Field ff:fi) {
if (ff.getName().equals(col.get(i))) {
ff.setAccessible(true);
ps.setObject(i, ff.get(ob));
break; }
}
} fi[0].setAccessible(true);
ps.setObject(col.size(), fi[0].get(ob));
int a = ps.executeUpdate();
if (a > 0) {
b = true;
} } catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps);
} return b;
} /**
*
* @param cl
* @param name 数据库中的列明
* @param value
* @return
*/
public ArrayList getListByLike(Class cl,String name,Object value) { ArrayList ar = new ArrayList();
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
Field[] fi = cl.getDeclaredFields();
ArrayList<String> col = getAllColumns(cl.getName());
StringBuffer sb = new StringBuffer();
sb.append("select ");
for (int i=0;i<col.size();i++) {
sb.append(col.get(i));
if (i != col.size()-1) {
sb.append(",");
}
} sb.append(" from");
sb.append(cl.getSimpleName());
sb.append(" where ");
sb.append(name);
sb.append(" like '%");
sb.append(value);
sb.append("%'");
//like 语句不支持占位符 try {
ps = conn.prepareStatement(sb.toString()); rs = ps.executeQuery(); while (rs.next()) {
Object obj = cl.newInstance();
for (String str:col) {
for (Field ff:fi) {
if (str.equals(ff.getName())) {
ff.setAccessible(true);
ff.set(obj, rs.getObject(ff.getName()));
break;
}
}
} ar.add(obj); } } catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps, rs);
} return ar; } /**
* 该方法用于所有的查询
* 注意:尽量保证链接表中数据 除了主外键关联的外,尽量不要使用重复的表列名
* @param 查询出来的数据放到那个类中 实体类中
* @param sql 查询的sql语句
* @param obs 所有的条件
* @return
*/
public ArrayList getListBySqlX(Class cl,String sql,Object[]obs){
Connection conn = BaseConnection.getConnection();
ArrayList ar = new ArrayList();
PreparedStatement ps = null;
ResultSet rs = null;
Field[] fi = cl.getDeclaredFields(); ArrayList<String> col = new ArrayList<String>();
try {
ps = conn.prepareStatement(sql); //获得数据表中的列
ResultSetMetaData metaData = rs.getMetaData();
int column = metaData.getColumnCount();
for (int i=1;i<=column;i++) {
String columnName = metaData.getColumnName(i);
col.add(columnName);
}
for (int i=0;i<obs.length;i++) {
ps.setObject(i+1, obs[i]);
}
rs = ps.executeQuery();
while (rs.next()) {
Object ob = cl.newInstance();
for (String str:col) {
for (Field ff:fi) {
if (str.equals(ff.getName())) {
ff.setAccessible(true);
ff.set(ob, rs.getObject(ff.getName()));
break;
}
}
}
ar.add(ob);
} } catch (Exception e) {
// TODO: handle exception
}finally{
BaseConnection.close(conn, ps, rs);
}
return ar;
} public ArrayList getListBySome(Class cl,String name,Object value) { ArrayList ar = new ArrayList(); Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null; Field[] fi = cl.getDeclaredFields();
//获得表中的所有列
ArrayList<String> col = getAllColumns(cl.getSimpleName()); StringBuffer sb = new StringBuffer();
sb.append("select ");
for (int i=0;i<col.size();i++) {
sb.append(col.get(i));
if (i != col.size()-1) {
sb.append(",");
}
}
sb.append("from ");
sb.append(cl.getSimpleName());
sb.append(" where ");
sb.append(name);
sb.append(" =? "); try {
ps = conn.prepareStatement(sb.toString());
ps.setObject(1, value);
rs = ps.executeQuery(); while (rs.next()) {
Object obj = cl.newInstance();
for (String str:col) {
for (Field ff:fi) {
if (str.equals(ff.getName())) {
ff.setAccessible(true);
ff.set(obj, rs.getObject(ff.getName()));
break;
}
}
} ar.add(obj); } } catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps, rs);
} return ar; } public Object getObById(Class cl,int id){ Object ob = null;
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null; Field[] fi = cl.getDeclaredFields();
//获得表中的所有列
ArrayList<String> col = getAllColumns(cl.getSimpleName()); StringBuffer sb = new StringBuffer();
sb.append("select ");
for (int i=0;i<col.size();i++) {
sb.append(col.get(i));
if (i != col.size()-1) {
sb.append(",");
}
}
sb.append("from ");
sb.append(cl.getSimpleName());
sb.append("where");
sb.append(col.get(0));
sb.append("?"); try {
ps = conn.prepareStatement(sb.toString());
ps.setInt(1, id);
rs = ps.executeQuery(); while (rs.next()) {
Object obj = cl.newInstance();
for (String str:col) {
for (Field ff:fi) {
if (str.equals(ff.getName())) {
ff.setAccessible(true);
ff.set(obj, rs.getObject(ff.getName()));
break;
}
}
} } } catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps, rs);
} return ob; } public ArrayList getList(Class cl){
ArrayList ar = new ArrayList();
Connection conn = BaseConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null; Field[] fi = cl.getDeclaredFields();
//获得表中的所有列
ArrayList<String> col = getAllColumns(cl.getSimpleName()); StringBuffer sb = new StringBuffer(); sb.append("select");
for (int i=0;i<col.size();i++) {
sb.append(col.get(i));
if (i != col.size()-1) {
sb.append(",");
}
} sb.append("from"); sb.append(cl.getSimpleName()); try {
ps = conn.prepareStatement(sb.toString());
rs = ps.executeQuery(); while (rs.next()) {
Object obj = cl.newInstance();
for (String str:col) {
for (Field ff:fi) {
if (str.equals(ff.getName())) {
ff.setAccessible(true);
ff.set(obj, rs.getObject(ff.getName()));
break;
}
}
}
ar.add(obj); } } catch (Exception e) {
// TODO: handle exception
}finally {
BaseConnection.close(conn, ps, rs);
} return ar;
} public static void main(String[] args) { } }

  

通用Dao方法的更多相关文章

  1. Mybatis 使用PageHelper封装通用Dao分页方法

    参考: PageHelper官网:https://pagehelper.github.io/docs/howtouse/#3-%E5%A6%82%E4%BD%95%E5%9C%A8%E4%BB%A3% ...

  2. Java学习笔记之使用反射+泛型构建通用DAO

    PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...

  3. 使用mybatis完成通用dao和通用service

    使用mybatis完成通用dao和通用service 概述: 使用通用dao和通用service可以减少代码的开发.可以将常用的增删改查放到通用dao中.对不同的or框架,基本上都有自己的实现如Spr ...

  4. Java反射结合JDBC写的一个通用DAO

    以前写反射只是用在了与设计模式的结合上,并没有考虑到反射可以与DAO结合.也是一个偶然的机会,被正在上培训的老师点到这个问题,才考虑到这个可能性,于是上网参考各种代码,然后自己动手开发了一个通用DAO ...

  5. Spring Boot-------JPA——EntityManager构建通用DAO

    EntityManager EntityManager 是用来对实体Bean 进行操作的辅助类.他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满 ...

  6. spring基于通用Dao的多数据源配置详解【ds1】

    spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...

  7. Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用 Mapper3.5.x

    Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用 Mapper3.5.x ============================== 蕃薯耀 2018年 ...

  8. 十六、springboot整合Spring-data-jpa(二)之通用DAO接口与添加自定义方法

    @NoRepositoryBean:Spring Data Jpa在启动时就不会去实例化BaseRepository这个接口 1.通用接口: import org.springframework.da ...

  9. spring基于通用Dao的多数据源配置

    有时候在一个项目中会连接多个数据库,须要在spring中配置多个数据源,近期就遇到了这个问题,因为我的项目之前是基于通用Dao的,配置的时候问题不断.这样的方式和资源文件冲突:扫描映射文件的话,Sql ...

随机推荐

  1. github的README.md文件格式

    一.在线编辑器:stackedit 网址:https://stackedit.io/ README.md是使用Markdown语法.基本规则如下: Markdown 语法速查表 1 标题与文字格式 标 ...

  2. vue Element-UI组件

    一.UI组件 目的: 提高开发效率, 别人提供好一切, 拿过来直接用饿了么团队开源一个基于vue组件库 Element-UI ==> pc端 文档: http://element-cn.elem ...

  3. DragonBones龙骨插槽的隐藏

    参考: 插槽中对象的显示与隐藏问题 let factory = dragonBones.EgretFactory.factory; factory.parseDragonBonesData(RES.g ...

  4. SQL Server2008 R2 安装失败后的解决办法

    当你第一次安装SQL Server2005,SQL Server2008,SQL Server2012失败后,第二次重新安装一般还是容易安装失败,原因就是你没有完全卸载,还存留残留文件和注册表. 我安 ...

  5. 【CF827E】Rusty String 调和级数+FFT

    [CF827E]Rusty String 题意:给你一个01串,其中部分字符是'?',?可以是0或1,求所有可能的d,满足存在一种可能得到的01串,在向右移动d格后与自己相同. $n\le 5\tim ...

  6. s3接口认证说明

    S3 Authorization太绕,太头痛,下面解释说明: XS3 REST API基于HMAC(哈希消息身份验证码)密钥使用自定义HTTP方案进行身份验证.要对请求进行身份验证,您首先需要合并请求 ...

  7. [转]Android中attr自定义标签详解

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:wen= ...

  8. python实现简单购物车系统(练习)

    #!Anaconda/anaconda/python #coding: utf-8 #列表练习,实现简单购物车系统 product_lists = [('iphone',5000), ('comput ...

  9. python开发环境搭建(windows+python2.7.5+django1.5.4)【原创】

    先插入一条广告,博主新开了一家淘宝店,经营自己纯手工做的发饰,新店开业,只为信誉!需要的亲们可以光顾一下!谢谢大家的支持!店名: 小鱼尼莫手工饰品店经营: 发饰.头花.发夹.耳环等(手工制作)网店: ...

  10. 【微信小程序】---授权登陆---【巷子】

    Page({ onLoad: function() { var that = this; // 查看是否授权 wx.getSetting({ success: function(res) { if ( ...