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




创建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
</property>

<property
</property>

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

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

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

<property
</property>

</default-config>

<named-config
name="toto">

<property
</property>

<property
</property>

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

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

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

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

}

}

上一篇:读书笔记(04) - 错误监控 - JavaScript高级程序设计


下一篇:vert.x学习(八),用JDBCClient配合c3p0操作数据库