DBUtils温习2
上篇简单回顾了下DBUtils的简介和其常用的类,这篇博客结合C3P0连接池,做一个简单的增删改查操作
1.创建web项目,导入jar包
2.编写c3p0-config.xml和引入工具类
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config> <default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3307/test</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config> </c3p0-config>
package DBUtils温习; import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DataSourceUtils { private static DataSource dataSource = new ComboPooledDataSource(); private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(); // 直接可以获取一个连接池
public static DataSource getDataSource() {
return dataSource;
} public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
} // 获取连接对象
public static Connection getCurrentConnection() throws SQLException { Connection con = tl.get();
if (con == null) {
con = dataSource.getConnection();
tl.set(con);
}
return con;
} // 开启事务
public static void startTransaction() throws SQLException {
Connection con = getCurrentConnection();
if (con != null) {
con.setAutoCommit(false);
}
} // 事务回滚
public static void rollback() throws SQLException {
Connection con = getCurrentConnection();
if (con != null) {
con.rollback();
}
} // 提交并且 关闭资源及从ThreadLocall中释放
public static void commitAndRelease() throws SQLException {
Connection con = getCurrentConnection();
if (con != null) {
con.commit(); // 事务提交
con.close();// 关闭资源
tl.remove();// 从线程绑定中移除
}
} // 关闭资源方法
public static void closeConnection() throws SQLException {
Connection con = getCurrentConnection();
if (con != null) {
con.close();
}
} public static void closeStatement(Statement st) throws SQLException {
if (st != null) {
st.close();
}
} public static void closeResultSet(ResultSet rs) throws SQLException {
if (rs != null) {
rs.close();
}
} }
3.编写实体类
package domain; public class Student { private int id;
private String name;
private String sex; public void setId(int id) {
this.id = id;
} public void setName(String name) {
this.name = name;
} public void setSex(String sex) {
this.sex = sex;
} public int getId() {
return id;
} public String getName() {
return name;
} public String getSex() {
return sex;
} }
4.编写测试类
package DBUtils温习;
/*
* 测试类
*/ import java.util.List; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test; import domain.Student; public class test { @Test
public void add() {
try {
// 1.获取核心类
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
// 2.编写sql语句
String sql = "insert into student values(?,?,?)";
// 3.设置占位符
Object params[] = { 12, "王三", "女" };
// 4.执行添加操作
int updateRow = qr.update(sql, params);
if (updateRow > 0) {
System.out.println("添加成功");
} else {
System.out.println("添加失败");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} @Test
public void deleteById() {
try {
// 1.获取核心类
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
// 2.编写sql语句
String sql = "delete from student where id=?";
// 3.设置占位符
Object params[] = { 11 };
// 4.执行删除操作
int updateRow = qr.update(sql, params);
if (updateRow > 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} @Test
public void update() {
try {
// 1.获取核心类
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
// 2.编写sql语句
String sql = "update student set name=?,sex=? where id=? ";
// 3.设置占位符
Object params[] = { "王四", "男", 12 };
// 4.执行更新操作
int updateRow = qr.update(sql, params);
if (updateRow > 0) {
System.out.println("更新成功");
} else {
System.out.println("更新失败");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} @Test
/*
* 根据ID查询某个学生
*/
public void findById() {
try {
// 1.获取核心类
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
// 2.编写sql语句
String sql = "select * from student where id=? ";
// 3.设置占位符
Object params[] = { 12 };
// 4.执行查询操作
Student student = qr.query(sql, new BeanHandler<Student>(Student.class), params);
System.out.println(student.getName() + " : " + student.getSex());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} @Test
/*
* 查询所有的学生
*/
public void findAllStudent() {
try {
// 1.获取核心类
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
// 2.编写sql语句
String sql = "select * from student ";
// 3.执行查询操作
List<Student> students = qr.query(sql, new BeanListHandler<Student>(Student.class));
// 4.对结果集进行遍历
for (Student student : students) {
System.out.println(student.getName() + " : " + student.getSex());
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} @Test
/*
* 查询学生的总数
*/
public void totalStudent() {
try {
// 1.获取核心类
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
// 2.编写sql语句
String sql = "select count(*) from student ";
// 3.执行查询操作
Long count = (Long) qr.query(sql, new ScalarHandler());
System.out.println(count.intValue());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
5.补充
qr.query()返回object类型 ,先转成 ScalarHandler的Long类型 然后在转为 int类型
return ((Long) qr.query(sql, new ScalarHandler())).intValue();
DBUtils温习2的更多相关文章
- DBUtils温习1
1.简介 Commons DBUtIls是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,但是使用DBUtils却极大的简化了dao层的开发,少些了很多的jdb ...
- 前端框架 EasyUI (0) 重新温习(序言)
几年前,参与过一个项目.那算是一个小型的信息管理系统,BS 结构的,前端用的是基于 jQuery 的 EasyUI 框架. 我进 Team 的时候,项目已经进入开发阶段半个多月了.听说整个项目的框架是 ...
- dbutils基本使用
dbutils的查询,主要用到的是query方法,增加,修改和删除都是update方法,update方法就不讲了 只要创建ResultSetHandler接口不同的实现类对象就可以得到想要的查询结果, ...
- BenUtils组件和DbUtils组件
BenUtils组件和DbUtils组件 [TOC] 1.BenUtils组件 1.1.简介 程序中对javabean的操作很频繁,所有Apache提供了一套开源api,方便javabean的操作!即 ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- <十六>JDBC_使用 DBUtils 编写通用的DAO
接口 : DAO<T>.java import java.sql.Connection;import java.sql.SQLException;import java.util.List ...
- <十五>JDBC_使用 DBUtils 进行更新、查询操作
详解待续... DBUtilsTest.java import java.sql.Connection;import java.sql.Date;import java.sql.ResultSet;i ...
- DBUtils 笔记
一.DBUtils介绍 apache 什么是dbutils,它的作用 DBUtils是java编程中的数据库操作实用工具,小巧简单实用. DBUtils封装了对JDBC的操作,简化了JDBC操作.可 ...
- python DBUtils.PooledDB 中 maxcached 和 maxconnections
PooledDB 有这么几个参数 mincached : the initial number of idle connections in the pool (the default of 0 me ...
随机推荐
- Hive环境搭建及测试
前提条件:已经安装好如下软件 Eclipse4.5 hadoop-2.7.3 jdk1.7.0_79 此篇文章基于上一篇文章:zookeeper高可用集群搭建 什么是Hive? 1.Hive是一个基 ...
- Asp.net 获取访问者IP
using System.Web; namespace Wxlhjcyy.Public { public class GetIp { public static string IPAddress { ...
- springbooot2 thymeleaf 配置以及加载资源文件。Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration)
最近在学习springbooot2 和 thymeleaf 程序文件 application.properties文件配置: #thymeleaf spring.thymeleaf.prefix=cl ...
- python进程基础
目录 进程以及状态 1. 进程 2. 进程的状态 进程的创建-multiprocessing 1. 创建进程 2. 进程pid 3. Process语法结构如下 4. 给子进程指定的函数传递参数 5. ...
- python基础学习(五)while循环语句
while循环基本使用 循环的作用就是让指定的代码重复的执行 while循环最常用的应用场景就是让执行的代码按照指定的次数重复执行 流程图 基本语法 初始条件设置 —— 通常是重复执行的 计数器 wh ...
- Go开发之路 -- strings以及strconv的使用
strings的使用 HasPrefix 语法: strings.HasPrefix(s, prefix string) bool // 判断字符串s是否以prefix开头 // 判断一个url是否以 ...
- 洛谷P4065 [JXOI2017]颜色(线段树)
题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...
- Html5新增标签的学习。
随笔,记录的比较随便. 今天新学习了9个标签. <audio> 简单的说就是一个音频标签,他的主要常用属性有src=""音频的路径 controls="con ...
- Jenkins 利用Build With Parameters Plugin实现Jenkins参数化构建
利用Build With Parameters Plugin实现Jenkins参数化构建 by:授客 QQ:1033553122 测试环境 Build With Parameters Plugin ...
- 第二章 运算方法与运算器(浮点数的加减法,IEEE754标准32/64浮点规格化数)
这一章,主要介绍了好多种计算方法.下面,写一点自己对于有些计算(手写计算过程)的见解. 1.原码.反码.补码 原码:相信大家都会写,符号位在前二进制数值在后,凑够位数即可. 反码:原码符号位不变,其他 ...