自己写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界的必争呀!!!

猜你喜欢

转载自644259206.iteye.com/blog/2283701