07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao

  1. 云栖社区>
  2. 博客>
  3. 正文

07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao

涂作权 2014-12-08 21:59:00 浏览1337
展开阅读全文


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

<?xml version="1.0" encoding="utf-8"?>

<c3p0-config>

    <default-config>

       <property name="initialPoolSize">5</property>

       <property name="maxPoolSize">20</property>

       <property name="driverClass">com.mysql.jdbc.Driver</property>

       <property name="jdbcUrl">jdbc:mysql://localhost:3306/day14</property>

       <property name="user">root</property>

       <property name="password">123456</property>

    </default-config>

    <named-config name="toto">

       <property name="initialPoolSize">5</property>

       <property name="maxPoolSize">20</property>

       <property name="driverClass">com.mysql.jdbc.Driver</property>

       <property name="jdbcUrl">jdbc:mysql://localhost:3306/day14</property>

       <property name="user">root</property>

       <property name="password">123456</property>

    </named-config>

</c3p0-config>

4 编写User.java

package cn.toto.domain;

 

public class User {

    private int id;

    private String username;

    private String password;

    public int getId() {

       return id;

    }

    public void setId(int id) {

       this.id = id;

    }

    public String getUsername() {

       return username;

    }

    public void setUsername(String username) {

       this.username = username;

    }

    public String getPassword() {

       return password;

    }

    public void 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  实现排序,只是实现了部分功能(二叉树,还有没实现的)

           //(元素的比较) 让我们传入比较器来实现

           //让我们传入比较器实现Comparatorcompare方法

           /*元素的自然顺序  实现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;

 

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

 

import cn.toto.domain.User;

import cn.toto.exception.DaoException;

import cn.toto.utils.BeanHandler;

import cn.toto.utils.BeanListHandler;

import cn.toto.utils.JdbcUtils;

import cn.toto.utils.ResultSetHandler;

 

public class UserDao {

 

    public List<User> getAll() {

       //sql

       String sql = "select * from users";

       //封装参数

      

       //实现结果集处理器 也可以用默认的实现类

       List list = (List) JdbcUtils.query(sql, null, new BeanListHandler(User.class));

      

 

       return list;

    }

   

    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;

    }

   

    public boolean insert(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;

    }

   

    public boolean update(User user) {

       String sql = "update users set username=?,password=? where id=?";

      

       return JdbcUtils.update(sql, new Object[]{

              user.getUsername()

              ,user.getPassword()

              ,user.getId()

       });

    }

   

    public boolean delete(int id) {

       String sql = "delect from users where id=?";

      

       return JdbcUtils.update(sql, new Object[]{id});

    }

}

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

package cn.toto.exception;

 

public class DaoException extends RuntimeException {

 

    private static final long serialVersionUID = 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;

import java.sql.SQLException;

 

import org.apache.commons.beanutils.BeanUtils;

 

import cn.toto.domain.User;

import cn.toto.exception.DaoException;

 

public class BeanHandler implements ResultSetHandler {

    private Class 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;

           }

           return null;

       } catch (Exception e) {

           throw new DaoException(e);

       }

    }

}

9 编写BeanListHandler.java

package cn.toto.utils;

 

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

 

import org.apache.commons.beanutils.BeanUtils;

 

import cn.toto.exception.DaoException;

 

//它的功能是将数据封装到bean,然后再将数据封装到List集合中

public class BeanListHandler implements ResultSetHandler {

    private Class clazz;

    public BeanListHandler(Class clazz){

       this.clazz = clazz;

    }

   

    //实现接口,要实现接口中的方法中。

    //将结果集的每一行封装到bean,bean加入一个List返回

    public Object handle(ResultSet rs) {

      

       try{

           List list = new ArrayList();

           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){

           throw new DaoException(e);

       }

      

    }

}

10 编写ResultSetHandler.java

package cn.toto.utils;

 

import java.sql.ResultSet;

 

public interface 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;

 

public class UserDaoTest {

 

    private UserDao dao = new UserDao();

    @Test

    public void testInsert() {

       User user = new User();

        

       user.setUsername("zhangsan");

       user.setPassword("11111111");

      

       boolean b = dao.insert(user);

       System.out.println(b);

    }

    @Test

    public void testGetAll() {

       List all = dao.getAll();

       System.out.println(all);

    }

    @Test

    public void testFind() {

       User user = dao.find(0);

       System.out.println(user);

    }

}

 

网友评论

登录后评论
0/500
评论