创建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. [bzoj4868][Shoi2017]期末考试

    来自FallDream 的博客,未经允许,请勿转载,谢谢. 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天或之前得知所.有.课程的成绩.如果在 ...

  2. ml-agent:Win10下环境安装

    这是我看到的最全面最详细的ml-agent讲解.(只用于学习与知识分享,如有侵权,联系删除.谢谢!) 来自CodeGize的个人博客 .源链接:https://www.cnblogs.com/Code ...

  3. 使用word

    同样这也是生活中常用到的办公软件,word本质是一个排版软件,它与一般的编辑器不同的是,它将整个文本分成了一页一页的,当然这也是方便于打印文档. 使用word还是很容易的,一般来说需要注意以下几方面的 ...

  4. Python中模块之logging & subprocess的讲解

    subprocess & logging模块的介绍 1. subprocess 该模块替代了os.system & os.pawn*所实现的功能. 2. logging 1. 日志五大 ...

  5. 如何避免 async/await 地狱

    简评:async/await 写着很爽,不过要注意这些问题. async/await 让我们摆脱了回调地狱,但是这又引入了 async/await 地狱的问题. 什么是 async/await 地狱 ...

  6. 特殊权限 SUID、SGID、Sticky

    摘录之----------QuintinX 一. 前提 本篇主要讲解SUID, SGID, Sticky三个权限的基本原理和应用. 为什么要使用特殊权限? 比如系统中假如有超过四类人然而每一类人都需要 ...

  7. Jenkins构建时间Poll Scm的设置

    每15分钟构建一次:H/15 * * * *   或*/15 * * * * 每天8点构建一次:0 8 * * * 每天8点~17点,两小时构建一次:0 8-17/2 * * * 周一到周五,8点~1 ...

  8. struts2 可以用ognl拿到值而不可以用el拿到值的解决方法

    错误debug后 得到了There is no read method for container的错误 于是我new了一个实体类 package com.unity; public class St ...

  9. Java锁Synchronized对象锁和类锁区别

    java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...

  10. 41. First Missing Positive(困难, 用到 counting sort 方法)

    Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2,0] ...