1  创建day14数据库,创建user.sql表:

A 创建数据库 day14

B 创建数据表users

create table users
 
 
(
 
 
    id int primary keyauto_increment,
 
 
    username varchar(20),
 
 
    password varchar(20)
 
 
);

2  添加依赖的jar包

c3p0-0.9.1.2.jar


mysql-connection-java-5.0.8-bin.jar


commons-beanutils-1.8.0.jar


commons-logging.jar

3  编写c3p0-config.xml

<?xmlversion="1.0" encoding="utf-8"?>
<c3p0-config>
    <default-config>
       <propertyname="initialPoolSize">5</property>
       <propertyname="maxPoolSize">20</property>
       <propertyname="driverClass">com.mysql.jdbc.Driver</property>
       <propertyname="jdbcUrl">jdbc:mysql://localhost:3306/day14</property>
       <propertyname="user">root</property>
       <propertyname="password">123456</property>
    </default-config> 
    <named-configname="toto">
       <propertyname="initialPoolSize">5</property>
       <propertyname="maxPoolSize">20</property>
       <propertyname="driverClass">com.mysql.jdbc.Driver</property>
       <propertyname="jdbcUrl">jdbc:mysql://localhost:3306/day14</property>
       <propertyname="user">root</property>
       <propertyname="password">123456</property>
    </named-config>
</c3p0-config>

4 编写User.java

package cn.toto.domain;
 
publicclass User {
    privateint id;
    private String username;
    private String password;
    publicint getId() {
       return id;
    }
    publicvoid setId(int id) {
       this.id = id;
    }
    public String getUsername() {
       return username;
    }
    publicvoid setUsername(String username) {
       this.username = username;
    }
    publicString
       return password;
    }
    publicvoid setPassword(String password) {
       this.password = password;
    }
    public User() {
       super();
    }
}

5 编写jdbcUtils.java

package cn.toto.utils;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import javax.sql.DataSource;
 
import cn.toto.exception.DaoException;
 
import com.mchange.v2.c3p0.ComboPooledDataSource;
 
public class JdbcUtils {
    private static DataSource ds;
    
    static {
       //ds = new ComboPooledDataSource();//默认的缺省的配置
       ds = new ComboPooledDataSource("toto");//配置文件中设置的内容
    }
    
    //获取与指定数据的连接
    public static DataSource getSource(){
       return ds;
    }
    
    //获得与指定数据库的连接
    public static Connection getConnection() throws SQLException {
       //从连接池返回一个连接
       return ds.getConnection();
    }
    //释放资源
    public static void release(ResultSet rs,Statement stmt,Connection conn) {
       if(rs!=null){
           try{
              rs.close();
           }catch(SQLException e){
              e.printStackTrace();
           }
           rs = null;
       }
       if(stmt!=null){
           try{
              stmt.close();
           }catch(SQLException e){
              e.printStackTrace();
           }
           stmt=null;
       }
       if(conn!=null){
           try{
              conn.close();
           }catch(SQLException e){
              e.printStackTrace();
           }
           conn = null;
       }
    }
    
    //写一个通过的增删改方法
    public static boolean update(String sql,Object[] params) {
       Connection conn = null;
       PreparedStatement pstmt = null;
       ResultSet rs = null;
       
       try {
           //获得连接
           conn = getConnection();
           //写SQL
           //预编译sql
           pstmt = conn.prepareStatement(sql);
           //替换参数
           int pos = 1;//设置一个脚标
           //for(Object param : params)   这样写是有错误的,会有空指针异常,要写成如下的方法:
           for(int i=0;params!=null&&i<params.length;i++)
              pstmt.setObject(i+1, params[1]);//由于不知道是什么类型的,故可以用Object
 
           //发送sql
           int num = pstmt.executeUpdate();
           
           //返回结果
           if(num>0)
              return true;
           return false;
       } catch (SQLException e) {
           throw new DaoException(e);
       }finally{
           release(rs,pstmt,conn);
       }
    }
    //实现一个通用的查询方法
    public static Object query(String sql,Object[] params,ResultSetHandler handler){
       Connection conn = null;
       PreparedStatement pstmt = null;
       ResultSet rs = null;
       try{
           conn = getConnection();
           //写sql
           //预编译sql
           pstmt = conn.prepareStatement(sql);
           //替换参数
           for(int i=0;params!=null&&i<params.length;i++)
              pstmt.setObject(i+1, params[1]);//由于不知道是什么类型的,故可以用Object
 
           //发送sql
           rs = pstmt.executeQuery();
           //处理结果集
           
           /*我们在方法中需要一种功能让调用者里调用
            * 在方法的内部都有一个模块不会写,有变化,需要留给调用者来处理*/
           
           //这时我们需要用一种设计模式策略模式 TreeSet
           //TreeSet  实现排序,只是实现了部分功能(二叉树,还有没实现的)
           //(元素的比较) 让我们传入比较器来实现
           //让我们传入比较器实现Comparator的compare方法
           /*元素的自然顺序  实现Comparable接口的compareTo方法*/
           
           //向调用者要一个结果集处理器
           Object result = handler.handle(rs);//调用结果处理器的handle方法,它返回的结果就是我们想要的。将结果集变成了一个对象
           return result;
       }catch(SQLException e){
           throw new DaoException(e);
       }finally {
           release(rs,pstmt,conn);
       }
    }
}   
    //写一个通过的增删改方法
    public static boolean update(String sql,Object[] params) {
       Connection conn = null;
       PreparedStatement pstmt = null;
       ResultSet rs = null;
       
       try {
           //获得连接
           conn = getConnection();
           //写SQL
           //预编译sql
           pstmt = conn.prepareStatement(sql);
           //替换参数
           int pos = 1;//设置一个脚标
           for(Object param : params)
              pstmt.setObject(pos, param);//由于不知道是什么类型的,故可以用Object
           
           //发送sql
           int num = pstmt.executeUpdate();
           
           //返回结果
           if(num>0)
              return true;
           return false;
       } catch (SQLException e) {
           throw new DaoException(e);
       }finally{
           release(rs,pstmt,conn);
       }
    }
}

6 编写UserDao.java

package cn.toto.dao;
 
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.util.ArrayList;
import java.util.List;
 
import cn.toto.domain.User;
importcn.toto.exception.DaoException;
import cn.toto.utils.BeanHandler;
import cn.toto.utils.BeanListHandler;
import cn.toto.utils.JdbcUtils;
importcn.toto.utils.ResultSetHandler;
 
publicclass UserDao {
 
    public List<User> getAll() {
       //写sql
       String sql = "select * from users";
       //封装参数
       
       //实现结果集处理器 也可以用默认的实现类
       List list = (List) JdbcUtils.query(sql, null, new BeanListHandler(User.class));
       
 
       returnlist;
    }
    
    public User find(int id){
       String sql = "select * from users where id = ?";
       //调用方法
       User user = (User) JdbcUtils.query(sql, new Object[]{id}, new BeanHandler(User.class));
       
       return user;
    }
    
    publicbooleaninsert(User user) {
       /*//写Sql
       String sql = "insert into users(username,password) values(?,?)";
       //封装参数
       Object[] params = new Object[2];
       params[0] = user.getUsername();
       params[1] = user.getPassword();
       //调用新方法
       boolean b = JdbcUtils.update(sql, params);
       return b;*/
       
       String sql = "insert into users(username,password) values(?,?)";
       boolean b = JdbcUtils.update(sql, new Object[]{user.getUsername(),user.getPassword()});
       return b;
    }
    
    publicboolean update(User user) {
       String sql = "update users set username=?,password=? where id=?";
       
       return JdbcUtils.update(sql, new Object[]{
              user.getUsername()
              ,user.getPassword()
              ,user.getId()
       });
    }
    
    publicboolean delete(int id) {
       String sql = "delect from users where id=?";
       
       return JdbcUtils.update(sql, new Object[]{id});
    }
}

7 编写自定义异常:DaoException.java

package cn.toto.exception;
 
publicclass DaoException extends RuntimeException {
 
    privatestaticfinallongserialVersionUID = 1L;
 
    public DaoException() {
    
    }
 
    public DaoException(String message) {
       super(message);
    }
 
    public DaoException(Throwable cause) {
       super(cause);
    
    }
 
    public DaoException(String message, Throwable cause) {
       super(message, cause);
    
    }
}

8 编写BeanHandler.java

在测试类中所有的类中都用到的数据可以写在@BeforeClass中。

package cn.toto.utils;
 
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
importjava.sql.SQLException;
 
import org.apache.commons.beanutils.BeanUtils;
 
importcn.toto.domain.User;
import cn.toto.exception.DaoException;
 
publicclassBeanHandlerimplements ResultSetHandler {
    privateClass clazz;
    public BeanHandler(Class clazz) {
       this.clazz = clazz;
    }
    
    //将结果集的第一行数据封装到bean返回,要想返回,得加一个返回的类型,上面的代码就是获得类型的代码
    public Object handle(ResultSet rs) {
       try {
           if(rs.next()){
              Object bean = this.clazz.newInstance(); //根据传入的创建一个相应类型的bean
              //获得元数据
              ResultSetMetaData metaData = rs.getMetaData();
              int columnCount = metaData.getColumnCount();
              for(int i=1;i<=columnCount;i++) {
                  //根据列的编号获得列名
                  String name = metaData.getColumnName(i);
                  //根据列名获得这一行中这一列的值
                  Object value = rs.getObject(name);
                  //使用beanutils实现属性的封装
                  BeanUtils.setProperty(bean, name, value);
              }
              //返回bean
              return bean;
           }
           returnnull;
       } catch (Exception e) {
           thrownew DaoException(e);
       }
    }
}

9 编写BeanListHandler.java

package cn.toto.utils;
 
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
importjava.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.commons.beanutils.BeanUtils;
 
import cn.toto.exception.DaoException;
 
//它的功能是将数据封装到bean,然后再将数据封装到List集合中
publicclass BeanListHandler implements ResultSetHandler {
    privateClass clazz;
    public BeanListHandler(Class clazz){
       this.clazz = clazz;
    }
    
    //实现接口,要实现接口中的方法中。
    //将结果集的每一行封装到bean,将bean加入一个List返回
    public Object handle(ResultSet rs) {
       
       try{
           List list = newArrayList();
           while(rs.next()){
              Object bean = this.clazz.newInstance();
              //知道列名  把列名作为属性来用
              
              //获得结果集的元数据
              ResultSetMetaData metaData = rs.getMetaData();
              //获得列的数量
              int columnCount = metaData.getColumnCount();
              for(int i=1;i<=columnCount;i++){
                  //获得类名
                  String columnName = metaData.getColumnName(i);
                  //获得列对应的值    注意现在结果集的游标是指向某一行的
                  Object value = rs.getObject(columnName);
                  BeanUtils.setProperty(bean, columnName, value);
              }
              //将bean存入List集合
              list.add(bean);
           }
           return list;
       }catch(Exception e){
           thrownew DaoException(e);
       }
       
    }
}

10 编写ResultSetHandler.java

package cn.toto.utils;
 
import java.sql.ResultSet;
 
publicinterface ResultSetHandler {
 
    Object handle(ResultSet rs);
}

12 编写UserDaoTest.java

package junit.test;
 
import java.util.List;
 
import org.junit.Test;
 
import cn.toto.dao.UserDao;
import cn.toto.domain.User;
 
publicclass UserDaoTest {
 
    private UserDao dao = new UserDao();
    @Test
    publicvoid testInsert() {
       User user = new User();
        
       user.setUsername("zhangsan");
       user.setPassword("11111111");
       
       boolean b = dao.insert(user);
       System.out.println(b);
    }
    @Test
    publicvoid testGetAll() {
       List all = dao.getAll();
       System.out.println(all);
    }
    @Test
    publicvoid testFind() {
       User user = dao.find(0);
       System.out.println(user);
    }
}