创建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. WISCO信息组NOIP模拟赛-数据结构

    传送门 差分+暴力 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstri ...

  2. ●BZOJ 1096 [ZJOI2007]仓库建设

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1096 题解: 斜率优化DP $(d_i:i 位置到1位置的距离,p_i:i位置的成品数量,c ...

  3. hdu5630 BestCoder Round #73 (div.2)

    Rikka with Chess  Accepts: 393  Submissions: 548  Time Limit: 2000/1000 MS (Java/Others)  Memory Lim ...

  4. [bzoj4822][Cqoi2017]老C的任务&[bzoj1935][Shoi2007]Tree 园丁的烦恼

    来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员.     最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统.作为经验丰富的程序员,老 C 轻松地完成 ...

  5. bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 464  Solved: 264[Submit][Sta ...

  6. IDEA 整合 SSM 框架学习

    认识 Spring 框架 更多详情请点击这里:这里 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control ...

  7. jQuery Datetable 渲染

    渲染器 有些情况下,使用表时,表中的行的数据源不包含您希望在表中直接显示的值.您可能希望将其转换为不同的表示形式(时间戳为人类可读的格式),合并数据点(名字和姓氏)或对该值执行一些计算(计算营业额和费 ...

  8. python中type dtype astype 的用法

    1.type 获取数据类型 2.dtype 数组元素的类型 3.astype 修改数据类型

  9. VS2012代码对齐快捷键

    1.选中想要对齐的代码 2.全选代码后按住Ctrl+K,Ctrl+F键,就可以了

  10. 入口开始,解读Vue源码(一)-- 造物创世

    Why? 网上现有的Vue源码解析文章一搜一大批,但是为什么我还要去做这样的事情呢?因为觉得纸上得来终觉浅,绝知此事要躬行. 然后平时的项目也主要是Vue,在使用Vue的过程中,也对其一些约定产生了一 ...