`
我就是linux报错来下载包的
  • 浏览: 1445 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

自己写DButils框架

 
阅读更多
这段时间在大肆复习java,上班也是测试,由于刚来外包不熟悉也没人带,在每天坐在那里看SpringMVC已经快到源码了,自知不是班科出生但是却不乏对计算机的狂热,就像以前对LOL的狂热般,也是每晚深夜奋战在不知道有没有结果的学习上了,最近看了一个叫方立勋的javaweb来着,感觉学到了蛮多的,虽然是2010年的视频感觉还是有不少东西在里面的,每天在公交车也不会忘记看看那些架构师的修炼笔记什么的.本人常出没于各大开源学习网站,什么叫开源,没错在我等屌丝的世界里免费==开源.哈哈,当然也会有时脑一热就去github上面fork下别人的开源框架什么的来看看,自知现在的能力并不能研究下去,不过我不会放弃对源码的啃食的.

         废话不多说,先看下我今天复习到了什么:

1.看了一天的thinking in java总算是把以前一直区分不了的static final和final给区分,当然static这不是光看下thinking in java就能了解的了,所以我还是会慢慢来研究一番JVM的.但是从一些字面我们知道static修饰的成员这是属于我们类本身的,不关对象半毛钱事哈,在加载我们的类的时候就已经是将我们的static修饰的成员给加载了,而且只加载一次,所以不能你new多少对象,static修饰的成员我们永远只有一份,好像跑题了,还是聊回咱今天学习的final吧.根据thinking in java记载final有三种修饰位置,修饰数据,修饰方法,修饰类.

1)这里的数据主要是成员变量以及我们方法中的入参,而这些数据我们又可以细分其类型有主类型和对象类型的,修饰主类型时代表这个主类型一旦被初始化就不能再变了,修饰对象的话,就表示我们这个句柄(引用)就没法再指向其他的对象了,但是对象本身还是可以被改变的,数组也是特殊的对象.入参也是这么区分的,所以同理得证哈.

2).修饰方法,表示我们的方法作者不想后来的使用者修改这个方法,当然按照书中所写在方法体内容不是特别多的时候用final可以提高性能哟.

3).修饰类,表示在该类的所有方法都已经加上了final了,所以同理了,final修饰的类是不可以被继承了,但是其自身还是可以集成其他类的,比如我们的String.

注意:我们private修饰的方法其实就相当于加上了final了呢.final在一些地方可以改善性能,但是这对于我们的扩展绝逼不是建利好消息,所以慎用final.

还有要补充的一点final和static final的一些小区别,一般final修饰的数据可以先声明后通过构造器等初始化,但是static fianl修饰的数据必须是声明同时初始化啊,这里初始化并不代表我们的数据就一定要大写,大写默认是常量,也就是在编译前就已经知道值了,但是像Math,random()给我们的static final修饰的数据赋值时是在编译后才能知道其值的.


后记:

回家后翻来方立勋的视频看看模拟的写了大概半个DButils的框架吧,先睹为快.只是为了记笔记,学习学习哈.老鸟飞过.上代码:
实体类

package com.imooc.domain;

public class Account {
	private int id;
	private String name;
	private float money;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public float getMoney() {
		return money;
	}
	public void setMoney(float money) {
		this.money = money;
	}
	
}

半个框架
package com.imooc;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
 * 使用DBCP数据源获取数据库连接
 * @author pic
 *
 */
public class JdbcUtils_C3P0 {
	private static Connection conn=null;
	private static ComboPooledDataSource combo = null;
	static{
		try{
			combo=new ComboPooledDataSource();
			
		}catch(Exception e){
			e.printStackTrace();
			throw new ExceptionInInitializerError("稍后重试!!");
		}
	}
	
	public static Connection getConnection() throws SQLException {
		
		return combo.getConnection();
	}
	
	public static void main(String[] args) throws SQLException  {
		Connection conn = JdbcUtils_C3P0.getConnection();
		System.out.println(conn);
	}
	
	//2.关闭连接等一些资源
	public static void release(Connection conn,Statement st,ResultSet rs) {
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				if(rs!=null){
					rs=null;
				}
				e.printStackTrace();
			}
		}
		if(st!=null){
			try {
				st.close();
			} catch (SQLException e) {
				if(st!=null){
					st=null;
				}
				e.printStackTrace();
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				if(conn!=null){
					conn=null;
				}
				e.printStackTrace();
			}
		}
	}
	public static void update(String sql,Object[] params){
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils_C3P0.getConnection();
			ps = conn.prepareStatement(sql);
			for(int i=0;i<params.length;i++){
				ps.setObject(i+1, params[i]);
			}
			ps.executeUpdate();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally{
			JdbcUtils_C3P0.release(conn, ps, rs);
		}
	}
	
	/**
	 * 我们可以自己实现提供这个handler的接口,只需要外界提供Class就好了
	 * @param sql:需要发送给数据库的sql语句
	 * @param params:占位符的参数
	 * @param handler 提供外界提供返回结果的类型的处理接口
	 * @return
	 */
	public static Object query(String sql,Object[] params,ResultSerHandler handler){
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils_C3P0.getConnection();
			ps = conn.prepareStatement(sql);
			for(int i=0;i<params.length;i++){
				ps.setObject(i+1, params[i]);
			}
			rs=ps.executeQuery();
			Object bean = handler.handler(rs);
			return bean;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally{
			JdbcUtils_C3P0.release(conn, ps, rs);
		}
	}
}

interface ResultSerHandler{
	public Object handler(ResultSet rs);
}
class BeanHandler implements ResultSerHandler{
	private Class clazz;
	public BeanHandler(Class clazz){
		this.clazz=clazz;
	}
	@Override
	public Object handler(ResultSet rs) {
		try {
			//如果没数据直接返回空
			if(!rs.next()){
				return null;
			}
			//创建封装结果的bean
			Object bean = clazz.newInstance();
			ResultSetMetaData meta = rs.getMetaData();
			int count = meta.getColumnCount();
			for(int i=0;i<count;i++){
				String name = meta.getColumnName(i+1);
				Object value = rs.getObject(name);
				//反射得到列明对应的属性
				Field field = clazz.getDeclaredField(name);
				//暴力打开访问权限
				field.setAccessible(true);
				//将列明对象的结果整到bean中返回即可
				field.set(bean, value);
			}
			return bean;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
	}
	
}


测试类:
package com.imooc;

import org.junit.Test;

import com.imooc.domain.Account;

public class TestUtils {
	
	@Test
	public void testAdd(){
		Account a = new Account();
		a.setName("ggg");
		a.setMoney(40000);
		add(a);
	}
	
	@Test
	public void testFindById(){
		Account account = findById(1);
		System.out.println(account.getId());
		System.out.println(account.getName());
		System.out.println(account.getMoney());
	}
	
	public void add(Account a){
		String sql = "insert into account(name,money) values(?,?)";
		Object[] params = {a.getName(),a.getMoney()};
		JdbcUtils_C3P0.update(sql, params);
	}
	
	public Account findById(int id){
		String sql = "select * from account where id=?";
		Object[] params = {id};
		Account account = (Account) JdbcUtils_C3P0.query(sql, params, new BeanHandler(Account.class));
		return account;
	}
}

打算复习完就换工作,学不到东西果断撤退,对于跳槽也是IT界的必争呀!!!
分享到:
评论

相关推荐

    dbutils框架

    **dbutils框架详解** Apache DBUtils(Database Utilities)是一个基于Java的开源数据库操作框架,它由Apache软件基金会提供,旨在简化数据库操作,提高开发效率。DBUtils的核心理念是通过提供一组实用工具类来减少...

    DBUtils框架ResultSetHandler接口使用

    DBUtils 框架 ResultSetHandler 接口使用 DBUtils 框架的 ResultSetHandler 接口是一种非常重要的接口,它用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。该接口提供了一个单独的方法:Object handle...

    DBUtils框架jar包

    DBUtils框架是一个基于Java的数据库操作工具包,它由Apache软件基金会开发并维护。这个框架的设计目的是为了简化Java程序员在处理数据库操作时的工作,尤其是在执行SQL语句、管理数据库连接和处理结果集等方面。...

    自己动手模仿Hibernate写数据库框架

    【标题】"自己动手模仿Hibernate写数据库框架"揭示了本次讨论的核心内容——尝试构建一个类似于Hibernate的数据库操作框架。Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库与Java对象之间的...

    DBUtils开源框架模板

    DBUtils开源框架模板 框架模板 和jar包 配置文件已经写好 可以直接调用

    apache dbutils 框架

    Apache DBUtils是一个轻量级的Java数据库连接工具框架,它为开发者提供了简洁、高效且可靠的数据库操作API。DBUtils的主要目标是简化Java应用程序中的数据库访问,通过减少代码量和异常处理,让开发者能够更加专注于...

    Apache Dbutils +springmvc 框架demo代码

    commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。 springmvc与springmvc 整合demo

    dbutils

    `dbutils` 是一个开源的Java库,主要设计用于简化数据库操作,它不是数据访问对象(DAO)框架,也不是像Hibernate那样的对象关系映射(ORM)工具。`dbutils` 提供了一些实用功能,使得在Java程序中进行数据库交互变...

    commons-dbutils.jar.rar

    它的简单性和鲁棒性使其成为中小规模项目中的理想选择,特别是对于那些不想使用完整ORM框架(如Hibernate或MyBatis)的开发者。 6. **集成与使用** 要在项目中使用DBUtils,首先需要将对应的jar包添加到项目的类...

    Apache Dbutils JDBC 框架demo代码

    commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司...

    commons-dbutils-1.7

    在实际项目中,开发者可以结合Spring框架或其他ORM工具(如Hibernate或MyBatis)一起使用DbUtils,以实现更加灵活和强大的数据库操作。总的来说,Apache Commons DbUtils是Java开发中一个非常实用的工具,它通过简化...

    dbutils api

    它通常与Apache Spark等大数据框架结合使用,为开发人员提供了一系列实用的API,以简化数据操作、文件管理和任务调度。本篇文章将深入探讨`dbutils` API的核心概念、主要功能以及使用方法。 ### 1. 核心概念 - **...

    DbUtils-1.7.zip

    - 源代码可以帮助开发者扩展DbUtils,或者根据需求定制自己的数据库访问工具。 5. **应用场景**: - 快速开发小型应用,不需大型ORM框架。 - 教学示例,展示如何简化JDBC操作。 - 数据库脚本执行,如批量插入、...

    apache dbutils中文说明

    Apache DBUtils是一个开源的Java库,它为Java程序员提供了便捷的方式来处理JDBC(Java Database Connectivity)...通过利用DBUtils,Java开发者可以在不引入重量级ORM框架的情况下,更高效、安全地与数据库进行交互。

    commons-dbutils-1.6

    它不是ORM框架,如Hibernate或MyBatis,但作为轻量级的工具库,它在处理简单的数据访问任务时表现出色,特别是在那些不希望引入复杂ORM层的项目中。通过结合使用DBUtils和其他Apache Commons库,如Commons DBCP...

    commons-dbutils-1.5

    不过,需要注意的是,尽管DBUtils在很多方面简化了工作,但它并不适合所有情况,尤其是那些需要复杂SQL查询和事务逻辑的应用,可能需要更强大的ORM框架,如Hibernate或MyBatis。 总的来说,"commons-dbutils-1.5"是...

    开发类库DButils

    4. **异常处理**:DButils 将 JDBC 的检查异常(如 `SQLException`)封装为自己的运行时异常,比如 `DbUtils.DbException`。这使得异常处理更简洁,因为不需要捕获并处理多个不同的 SQL 异常。 5. **连接池支持**:...

    dbutils-1.6

    **dbutils-1.6** 是一个用于Java编程的实用工具库,主要目的是简化数据库连接和数据操作。...尽管现在有更多高级的ORM框架(如MyBatis、Hibernate),但在某些场景下,DBUtils仍然是一个高效且可靠的解决方案。

    commons-dbutils-1.7-src.zip

    通过阅读和分析"commons-dbutils-1.7-src.zip"中的源代码,开发者可以深入理解DBUtils如何实现这些功能,如何优化JDBC操作,以及如何在自己的项目中更好地利用这个框架。同时,源代码也可以作为学习Java编程和数据库...

    commons-dbutils-1.7.zip

    5. **缓存支持**:虽然DBUtils本身并不直接提供缓存功能,但它可以与缓存框架(如Ehcache或Guava)结合使用,实现数据的缓存,减少对数据库的频繁访问。 6. **线程安全**:DBUtils设计时考虑了线程安全性,使得在多...

Global site tag (gtag.js) - Google Analytics