创建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. Gradle学习之构建java与web项目

    一.使用Gradle的java插件构建Java项目 1)Gradle插件包含了若干个接口定义和已有的任务项,语法结构:apply plugin:'插件名' ,此处我们定义插件 apply plugin ...

  2. 网络硬盘NFS

    NFS是网络文件系统,用于计算机间共享文件系统,由sun公司1985年推出的协议,现在已经被广泛使用.一般来说,所有的linux发型版都支持NFS.nfs是一个服务器,客户端的架构,建立一个nfs的服 ...

  3. Lua和C#调用探秘

    转载请标明出处:http://www.cnblogs.com/zblade/ 在实际的项目中,大部分业务逻辑 程序员只需要负责lua层编写逻辑即可,或者在c#层添加一些静态函数,供lua层调用.那么对 ...

  4. Vegas Pro 15软件界面对比

    大家都知道Vegas是一款专业的视频制作软件,而新版的VEGAS Pro 15更是专业性十足.好了,废话不多说,接下来小编就带大家具体的看一下Vegas 15界面都有哪些更新吧! 一.软件图标 图1: ...

  5. @RequestBody和@ModelAttribute注解

    一 .@RequestBody @RequestBody接收的是一个Json对象的字符串,而不是一个Json对象.然而在ajax请求往往传的都是Json对象,后来发现用 JSON.stringify( ...

  6. C++Sizeof与Strlen的区别与联系

    一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保 ...

  7. DDD实战进阶第一波(七):开发一般业务的大健康行业直销系统(实现产品上下文接口与测试)

    前一篇文章我们介绍了如何将创建产品的领域逻辑与产品的持久化仓储通过上架产品的用例组织起来,完成了一个功能.在实际的项目中,多种前端的形态比如PC Web. 微信小程序.原生APP等要调用后端的功能,通 ...

  8. Linux中Mysql root用户看不到mysql库问题解决方式

    第一种方式: 1.首先停止MySQL服务:service mysqld stop2.加参数启动mysql:/usr/bin/mysqld_safe --skip-grant-tables &  ...

  9. 反射获取 Class

    原文链接:https://www.codemore.top/cates/Backend/post/2018-04-26/reflect-class 类 Java中每个类型要么是引用类型,要么是原生类型 ...

  10. Linux的哲学思想

    1.一切皆文件:2.单一目的的小程序:3.组合小程序完成复杂任务:4.文本文件保存配置信息:5.尽量避免捕获用户接口:6.提供机制,而非策略. 说到底Linux的哲学思想在于方便和更好的管理后台,不同 ...