通用Dao方法
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方法的更多相关文章
- Mybatis 使用PageHelper封装通用Dao分页方法
参考: PageHelper官网:https://pagehelper.github.io/docs/howtouse/#3-%E5%A6%82%E4%BD%95%E5%9C%A8%E4%BB%A3% ...
- Java学习笔记之使用反射+泛型构建通用DAO
PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...
- 使用mybatis完成通用dao和通用service
使用mybatis完成通用dao和通用service 概述: 使用通用dao和通用service可以减少代码的开发.可以将常用的增删改查放到通用dao中.对不同的or框架,基本上都有自己的实现如Spr ...
- Java反射结合JDBC写的一个通用DAO
以前写反射只是用在了与设计模式的结合上,并没有考虑到反射可以与DAO结合.也是一个偶然的机会,被正在上培训的老师点到这个问题,才考虑到这个可能性,于是上网参考各种代码,然后自己动手开发了一个通用DAO ...
- Spring Boot-------JPA——EntityManager构建通用DAO
EntityManager EntityManager 是用来对实体Bean 进行操作的辅助类.他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满 ...
- spring基于通用Dao的多数据源配置详解【ds1】
spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...
- Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用 Mapper3.5.x
Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用 Mapper3.5.x ============================== 蕃薯耀 2018年 ...
- 十六、springboot整合Spring-data-jpa(二)之通用DAO接口与添加自定义方法
@NoRepositoryBean:Spring Data Jpa在启动时就不会去实例化BaseRepository这个接口 1.通用接口: import org.springframework.da ...
- spring基于通用Dao的多数据源配置
有时候在一个项目中会连接多个数据库,须要在spring中配置多个数据源,近期就遇到了这个问题,因为我的项目之前是基于通用Dao的,配置的时候问题不断.这样的方式和资源文件冲突:扫描映射文件的话,Sql ...
随机推荐
- CF 434C Tachibana Kanade's Tofu[数位dp+AC自动机]
Solution //本代码压掉后两维 #include<cstdio> #define max(a,b) (a<b?b:a) using namespace std; inline ...
- 使用jetty的continuations实现"服务器推"
在实际的开发中,我们可能会有这样的场景:许多客户端都连接到服务器端,当有某个客户端的消息的时候,服务器端会主动"推"消息给客户端,手机app的推送是一个典型的场景(IOS的推送都是 ...
- Gnome排序
Gnome排序(地精排序),起初由Hamid Sarbazi-Azad 于2000年提出,并被称为stupid排序,后来被Dick Grune描述并命名为“地精排序”,作为一个排序算法,和插入排序类似 ...
- H3C系列之三层交换机文件管理
笔者本篇文章所用h3c交换机的型号为三层交换机S3600-28TP-SI 对于文件的操作一般都在用户视图下操作,常见的有如下一些操作: 1.查看操作,常用的查看操作可以使用如下命令: <H3C& ...
- VB学习之路基础(一)
1.VB不区分大小定,VB编辑器会自动更正. 2.每一行代码语句,没有语句结束符. 3.续行符:一个"空格"加上一个"下划线".不能在参数中间加续行符. 5.合 ...
- 如何使用Jquery 引入css文件
如何使用Jquery 引入css文件: $("head").append("<link>");var toolbarCss = $("he ...
- R排序sort、order、rank、arrange
Ø sort sort(x, decreasing = FALSE, ...) ## Default S3 method: sort(x, decreasing = FALSE, na.last = ...
- jsp页面中引入文件路径问题的解决方案(使用request获取项目路径)【原创】
在项目页面中,总会引入一些js和css,相对路径or绝对路径的选择就显得至关重要了!下面是项目中遇到的问题和解决方案,做一下记录! 环境: myEclipse创建工程,使用jsp+css+js,项目目 ...
- [实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册
写在前面 上篇文章简单介绍了项目的结构,这篇文章将实现用户的注册.当然关于漂亮的ui,这在追后再去添加了,先将功能实现.也许代码中有不合适的地方,也只有在之后慢慢去优化了. 系列文章 [EF]vs15 ...
- eclipse 中 大小写切换:ctrl+shift+x 转为大写 ctrl+shift+y 转为小写
...............