自己写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的框架吧,先睹为快.只是为了记笔记,学习学习哈.老鸟飞过.上代码:
[align=left][size=xx-small]实体类[/size][/align]
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 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 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 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界的必争呀!!!

你可能感兴趣的:(jdbc学习笔记)