文档章节

BaseDao(反射)

cchoop
 cchoop
发布于 2017/04/22 20:55
字数 384
阅读 71
收藏 0

不解释,直接上代码: 

package com.kyxm.dao.impl;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author author
 *
 * @date  2017-4-21
 *
 * @connect  database
 */

public class BaseDao {
	private final static String DRIVER = "com.mysql.jdbc.Driver";
	private final static String URL = "jdbc:mysql://localhost:3306/yc_kygl_test";
	private static final String USER = "root";
	private static final String PASS = "123";  
	
	
	static {
		try {
			Class.forName(DRIVER);//加载驱动
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConn() {
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(URL, USER, PASS);//获取连接
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	
//	更新操作
	public boolean operUpdate(String sql, List<Object> p) {
		Connection conn = null;
		PreparedStatement pste = null;
		int res = 0;
		conn = getConn();
		try {
			pste = conn.prepareStatement(sql);
			if(p != null) {
				for(int i = 0; i < p.size(); i++) {
					pste.setObject(i+1, p.get(i));
				}
			}
			res = pste.executeUpdate();
			//
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			releaseAll(null, pste, conn);
		}
		return res > 0;//0则失�?
	}
	
//	查询操作
	public <T> List<T> operQuery(String sql, List<Object> p, Class<T> cls) throws Exception{
		Connection conn = null;
		PreparedStatement pste = null;
		ResultSet rs = null;
		List<T> list = new ArrayList<T>();
		conn = getConn();
		try {
			pste = conn.prepareStatement(sql);
			if(p != null) {
				for(int i = 0; i <p.size(); i++) {
					pste.setObject(i+1, p.get(i));
				}
			}
			rs = pste.executeQuery();
			
			ResultSetMetaData rsmd = rs.getMetaData();
			
			while(rs.next()) {
				T m = cls.newInstance();
				for(int j = 0; j < rsmd.getColumnCount(); j++) {
					//从数据库中取得字段名
					String col_name = rsmd.getColumnName(j+1);
					Object value = rs.getObject(col_name);
					//构建属性名 ps:company_id——>companyId
					String fildName = null;
					StringBuffer sb = new StringBuffer();
					String names[] = col_name.split("_");
					for(int i = 0;i < names.length;i ++){
						if(i==0){
							sb.append(names[i]);
						}else{
							//将字符串"_"后一位变为大写
							sb.append(names[i].substring(0, 1).toUpperCase()+names[i].substring(1));
						}
					}
					fildName = sb.toString();
					Field field = cls.getDeclaredField(fildName);
					field.setAccessible(true);
					field.set(m, value);
				}
				list.add(m);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			releaseAll(rs,pste,conn);
		}
		return list;
	}
	
	
//	关闭连接,释放资源
	private void releaseAll(ResultSet res, PreparedStatement pste, Connection conn) {
			try {
				if(res != null) res.close();
				if(pste != null) pste.close();
				if(conn != null) conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
	}
	
}

 

© 著作权归作者所有

上一篇: 将博客搬至CSDN
cchoop
粉丝 0
博文 5
码字总数 2239
作品 0
赣州
程序员
私信 提问
这种泛型反射需求如何实现?

当new BaseDao的时候 如何通过反射在BaseDao的构造中获得User的类 然后可以setter进entityClazz中 现在碰到的问题就是这个反射不会写! 倘若我不实现IBaseDao接口,又是否能实现? 百度了,但是根...

Macrotea
2011/04/26
376
3
@Autowired与@Resource的区别

1、@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。 2、@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果...

随智阔
2014/03/07
0
1
spring @Autowired 与@Resource的区别

Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。 @Resource的作用相当于@Autowired,只不过@Autowire...

xf_xin
2012/12/03
0
0
手撸一个数据库框架 part2 - 增删改查

在上一篇目中,讲解了如何自动建表,代码. 本期来实现增删改查,这里现实最简单的增删改查,主要讲解实现思想,复杂的会在后续文章中讲解。 准备工作 1.首先在BaseDao init 方法,在建表时,...

JakePrim
2018/03/24
0
0
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(二)

(本文示例工程源代码下载地址:http://down.51cto.com/data/1975295) 在上一篇博文的最后,介绍了使用@PostConstruct注解标注StudentDao的init方法,这样在Spring完成依赖注入后此方法即会...

NashMaster2011
2015/01/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
2
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
3
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部