您的位置:首页 > 编程语言 > Java开发

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

2014-12-08 21:59 901 查看



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

A
创建数据库 day14

B
创建数据表
users

create
table users

(

   
id int
primary
keyauto_increment,

   
username varchar(20),

   
password
varchar(20)

);


添加依赖的jar包

c3p0-0.9.1.2.jar

mysql-connection-java-5.0.8-bin.jar

commons-beanutils-1.8.0.jar

commons-logging.jar


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

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

          
//让我们传入比较器实现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;

 

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

   
}

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐