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

}

}

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

  1. idea 为模块添加Tomcat依赖 解决: Intelij IDEA 创建WEB项目时没有Servlet的jar包

    解决: Intelij IDEA 创建WEB项目时没有Servlet的jar包 今天创建SpringMVC项目时 用到HttpServletRequest时, 发现项目中根本没有Servlet这个包, ...

  2. Maven创建工程项目如何下载所需要的jar包

    转自:http://hi.baidu.com/hotthought/item/57ce101556d0ba0de75c36c5 Maven包的下载路径: http://maven.apache.org ...

  3. json-lib-2.4-jdk15.jar所需全部JAR包.rar java jsoup解析开彩网api接口json数据实例

    json-lib-2.4-jdk15.jar所需全部JAR包.rar  java jsoup解析开彩网api接口json数据实例 json-lib-2.4-jdk15.jar所需全部JAR包.rar  ...

  4. 02_c3p0之c3p0-config.xml配置案例,操作c3p0的jdbcUtil工具类的编写

     c3p0也是一个开源jdbc连接池,我们熟悉的Hibernate和Spring框架使用的都是该数据源. 这里获得数据源使用的方法是:ComboPooledDataSource 它提供的构造方法有 ...

  5. web工程 所需是jar包总结

    commons-beanutils-1.8.3.jar : BeanUtils主要提供了对于JavaBean进行各种操作,需要Commons -Collections包和Commons -loggin ...

  6. SpringBoot+Maven多模块项目(创建、依赖、打包可执行jar包部署测试)完整流程

    一,创建Maven多模块项目先建立外层父工程         File →new →project  选择Spring Initializr          Next下一步到以下页面 工程结构如下 ...

  7. 二.创建maven工程及下载需要的jar包

    1.使用Eclipse的Maven插件来创建一简单的Maven项目 步骤:打开新建项目对话框,选择Maven Project(File->New->Object->Maven-> ...

  8. SSH整合所需的jar包

    Spring3.1+Hibernate3+Struts2的最新整合所需要的jar包 Spring的基本jar包: 1.org.springframework.web-3.1.4.RELEASE.jar ...

  9. maven添加本地非repository中的jar包

    1.今天在使用maven编译打包一个web应用的时候,碰到一个问题: 项目在开发是引入了依赖jar包,放在了WEB-INF/lib目录下,并通过buildpath中将web libariary导入.  ...

随机推荐

  1. [SCOI2008]着色方案

    1079: [SCOI2008]着色方案 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2228  Solved: 1353[Submit][Stat ...

  2. BZOJ4423 Bytehattan

    Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的. 有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第 ...

  3. ●Joyoi Normal

    题链: http://www.joyoi.cn/problem/tyvj-1953题解: 定义d(u,v)这个函数,满足: d(u,v)=1,当且仅当在点分树中,u是v的祖先 d(u,v)=0,其它情 ...

  4. noip模拟题-赛斯石

    题目背景 白露横江,水光接天,纵一苇之所如,凌万顷之茫然.--苏轼 真程海洋近来需要进购大批赛斯石,你或许会问,什么是赛斯石? 首先我们来了解一下赛斯,赛斯是一个重量单位,我们用sisi作为其单位.比 ...

  5. 【luogu3384】【模板】树链剖分

    省选被暴虐,成功爆0...顺便ditoly差点全省总分Rank1 orz..... 于是开始赶进度学新算法.... 然后决定开始学习树剖orz... 发现树剖很好用啊!!!! 然后做了模板题. 题目就 ...

  6. bzoj 4567: [Scoi2016]背单词

    Description Lweb 面对如山的英语单词,陷入了深深的沉思,"我怎么样才能快点学完,然后去玩三国杀呢?".这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册 ...

  7. hdu 5463(水水)

    Sample Input 2 3 2 33 3 33 2 33 10 5 467 6 378 7 309 8 499 5 320 3 480 2 444 8 391 5 333 100 499   S ...

  8. python3 字符串str 教程

    字符串可以用单引号或双引号来创建. Python 不支持单字符类型,单字符也在Python也是作为一个字符串使用. 例: var1 = 'Hello World!' var2 = "Pyth ...

  9. input中v-model和value不能同时调用时解决方案

    <input type="text" v-model="keyWord" value="请输入地名地址" > 当使用如上代码时, ...

  10. c# 操作数据库

    查询 string strConnection = "Data Source=(local);Initial Catalog=zpractice;Integrated Security=SS ...