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. wireshark 表达式备忘录

    参考资料: https://blog.csdn.net/wojiaopanpan/article/details/69944970 wireshark分两种表达式,一种是捕获表达式,这个是在捕获时用的 ...

  2. [工具] 知网(CNKI)文献下载工具

    https://github.com/amyhaber/cnki-downloader 用于免费搜索,下载CNKI上的各类文献资料

  3. css---媒体查询

    简单示例: <style type="text/css"> /* 小于 300的时候 */ @media screen and (max-width: 400px){ ...

  4. PHP生成页面二维码解决办法?详解

    随着科技的进步,二维码应用领域越来越广泛,今天我给大家分享下如何使用PHP生成二维码,以及如何生成中间带LOGO图像的二维码. 具体工具: phpqrcode.php内库:这个文件可以到网上下载,如果 ...

  5. html 自动弹出框

    1.点击div外部隐藏, //*代表tip_box所包含的子元素 $('body').click(function(e) { var target = $(e.target); if(!target. ...

  6. Java工程师之SpringBoot系列教程前言&目录

    前言 与时俱进是每一个程序员都应该有的意识,当一个Java程序员在当代步遍布的时候,你就行该想到我能多学点什么.可观的是后端的框架是稳定的,它们能够维持更久的时间在应用中,而不用担心技术的更新换代.但 ...

  7. 170816、nginx常用配置说明

    #user nobody; #开启进程数 <=CPU数  worker_processes 1; #错误日志保存位置 #error_log logs/error.log; #error_log ...

  8. POJ-1322 Chocolate(概率DP)

    Chocolate Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9279 Accepted: 2417 Special Jud ...

  9. HUSTM 1601 - Shepherd

    题目描述 Hehe keeps a flock of sheep, numbered from 1 to n and each with a weight wi. To keep the sheep ...

  10. OKEX API

    本文介绍OKEX API Rest 开始使用 REST,即Representational State Transfer的缩写,是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方 ...