通用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) {

	}

}

  

时间: 2024-10-14 02:09:53

通用Dao方法的相关文章

SSH系列:(7)编写通用Dao

因为这里写的是通用Dao功能,因此将它放置到core包里面. 1.定义通用Dao中的方法 BaseDao.java package com.rk.core.dao; import java.io.Serializable; import java.util.List; public interface BaseDao<T> { void save(T entity); void update(T entity); void delete(Serializable id); T findById

通用DAO之MyBatis封装,封装通用的增删改查(二)

曾经发过一篇文章,大概写的就是阿海多么多么厉害,见到某位同事在Hibernate的基础上封装了一下,就以一己之力开发什么什么框架,最后写了个超大的一坨的事. 那么,后续篇来了.阿海不是自负之人,当之前的CRUD框架并没有达到理想的结果时,阿海转向了Mybatis封装.别问我为什么不是Hibernate.我本来就不喜欢Hibernate,即使在之前的一家公司一直被强制性的约束使用Hibernate时,也没有对Hibernate产生什么真正的好感,反而屡次发现了Hibernate的一些问题. 或许是

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

使用通用dao和通用service可以减少代码的开发.可以将常用的增删改查放到通用dao中.对不同的or框架,基本上都有自己的实现如SpringJPA的Repository就提供了常用的增删改查方法.而MyBatis借助代码生成工具也可以生成常用方法的映射 这里只针对Mybatis.如果使用代码生成工具,会有一个问题:每个Mapper里面都有一些方法(增晒改查).维护起来的话还好.只是在写service的时候会有一个问题.比如UserMapper里面有 insert(User user) , f

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

有时候在一个项目中会连接多个数据库,须要在spring中配置多个数据源,近期就遇到了这个问题,因为我的项目之前是基于通用Dao的,配置的时候问题不断.这样的方式和资源文件冲突:扫描映射文件的话,SqlSessionFactory的bean名字必须是sqlSessionFactory 他读不到sqlSessioNFactory2或者其它名字,终于解决方法例如以下: 1.在项目中增加例如以下类MultipleDataSource.java package com.etoak.util; import

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

@NoRepositoryBean:Spring Data Jpa在启动时就不会去实例化BaseRepository这个接口 1.通用接口: import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.N

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

spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种方式和资源文件冲突:扫描映射文件的话,SqlSessionFactory的bean名字必须是sqlSessionFactory 他读不到sqlSessioNFactory2或者其他名字,最终解决方法如下: 1.在项目中加入如下类MultipleDataSource.java ? 1 2 3 4 5

ASP.NET MVC验证框架中关于属性标记的通用扩展方法

http://www.cnblogs.com/wlb/archive/2009/12/01/1614209.html 之前写过一篇文章<ASP.NET MVC中的验证>,唯一的遗憾就是在使用Data Annotation Validators方式验证的时候,如果数据库是Entityframework等自动生成的文件,就没有办法使用扩展属性标记进行标记.现在已经开始有了一些其它的Asp.net MVC 验证框架,使用上跟Data Annotation Validators差不太多,但是普遍有这样

Effective java 第三章对于所有对象都通用的方法(一) 读书笔记

对于所有对象都通用的方法 覆盖equals时请遵守通用约定 类的每个实例本质上都是唯一的. 不关心类是否提供了逻辑相等的测试功能 超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的. 类是私有的或是包级私有的,可以确定它的equals方法永远不会被调用. throw new AssertionError() 一般覆盖Object.equals都是值类 但有一种值类不需要覆盖equals方法,即实例受控,确保每个值至多只存在一个对象的类.如枚举 覆盖equals方法,通用约定. 自

mybatis返回list很智能很简答的,只需要配置resultmap进行类型转换,你dao方法直接写返回值list&lt;对应的object&gt;就行了啊

dao方法 public List<User> selectSimpleMulti(Map<String, Object> params){ if(params == null){ params = new HashMap<String, Object>(); } return dao.queryList(mapper+ "selectSimpleMulti", params); } 对应的mapper.xml配置sql语句 <resultMa