Java学习笔记49(DBUtils工具类二)
上一篇文章是我们自己模拟的DBUtils工具类,其实有开发好的工具类
这里使用commons-dbutils-1.6.jar
事务的简单介绍:
在数据库中应用事务处理案例:转账案例
张三和李四都有有自己的存款
主键 帐户名 余额
1 张三 1000
2 李四 10
要从张三的账户余额中转账800到李四账户
SQL语句实现:
update xx set 余额 = 余额-800 where 主键=1
update xx set 余额 = 余额+800 where 主键=2
虽然操作成功,但是会出现问题,如果张三余额不足800,那么转账结束后余额是负数,显然有问题
而数据库本身不会判断是否为负数
所以数据库就将这两个操作包装成一个事务,执行结果有两种,成功或者失败,不可以分开执行
执行成功称:提交事务,执行失败称:回滚事务
对数据表的操作:
表的创建:
CREATE TABLE sort(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(100),
sprice DOUBLE,
sdesc VARCHAR(5000)
);
QueryRunner类的方法实现表的增删改:
package demo; import java.sql.Connection;
import java.sql.SQLException; import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner; public class QueryRunnerDemo {
private static Connection con = JDBCUtils.getConnection(); public static void main(String[] args) throws SQLException {
// 这三个方法不能同时执行,测试时候应该注释掉不使用的
// 因为每一个方法最后都关闭了数据库连接
// insert();
// update();
delete();
} public static void insert() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "INSERT INTO sort (sname,sprice,sdesc)VALUES(?,?,?)";
Object[] params = { "篮球", 266, "体育用品" };
int row = qr.update(JDBCUtils.getConnection(), sql, params);
System.out.println(row);
DbUtils.closeQuietly(con);
} public static void update() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "UPDATE sort SET sname=?,sprice=?,sdesc=? WHERE sid=?";
Object[] params = { "足球", 255, "出售足球", 8 };
int row = qr.update(con, sql, params);
System.out.println(row);
DbUtils.closeQuietly(con);
} public static void delete() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "DELETE FROM sort WHERE sid=?";
int row = qr.update(con, sql, 8);
System.out.println(row);
DbUtils.closeQuietly(con);
}
} // 三种方法如果输出1表示执行成功,输出0表示执行失败
自定义的工具:
package demo; import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties; public class JDBCUtils {
private static Connection con;
private static String driverClass;
private static String url;
private static String username;
private static String password; static {
try {
readConfig();
Class.forName(driverClass);
con = DriverManager.getConnection(url, username, password);
} catch (Exception ex) {
throw new RuntimeException("数据库连接失败");
}
} private static void readConfig() throws Exception {
InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("database.properties");
Properties pro = new Properties();
pro.load(in);
driverClass = pro.getProperty("driverClass");
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
} public static Connection getConnection() {
return con;
} }
配置文件:database.properties
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybase
username=root
password=xuyiqing
QueryRunner类查询:
这里有多种结果集的处理方式:
package demo; import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler; public class QueryRunnerDemo {
private static Connection con = JDBCUtils.getConnection(); public static void main(String[] args) throws SQLException {
arrayHandler();
arrayListHandler();
beanHandler();
beanListHandler();
scalarHandler();
mapHandler();
mapListHandler();
} public static void arrayHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
Object[] result = qr.query(con, sql, new ArrayHandler());
for (Object obj : result) {
System.out.print(obj + "\t");
}
// 打印第一行的数据
} public static void arrayListHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
List<Object[]> result = qr.query(con, sql, new ArrayListHandler());
for (Object[] objs : result) {
for (Object obj : objs) {
System.out.print(obj + "\t");
}
System.out.println();
}
// 打印了全部的数据
} public static void beanHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
Sort sort = qr.query(con, sql, new BeanHandler<Sort>(Sort.class));
System.out.println(sort);
// 第一行的数据变成sort对象,打印对象的toString方法
// 这种方法需要特别注意:sort类中必须有空参构造器
} public static void beanListHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
List<Sort> list = qr.query(con, sql, new BeanListHandler<Sort>(Sort.class));
for (Sort s : list) {
System.out.println(s);
}
// 所有数据变成sort对象,装入list集合,打印出多个对象
} public static void scalarHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT COUNT(*) FROM sort";
long count = qr.query(con, sql, new ScalarHandler<Long>());
System.out.println(count);
// 适合于处理单结果集
} public static void mapHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
Map<String, Object> map = qr.query(con, sql, new MapHandler());
for (String key : map.keySet()) {
System.out.println(key + "\t" + map.get(key));
}
// 打印第一行数据,键值对
} public static void mapListHandler() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "SELECT * FROM sort";
List<Map<String, Object>> list = qr.query(con, sql, new MapListHandler());
for (Map<String, Object> map : list) {
for (String key : map.keySet()) {
System.out.println(key + "\t" + map.get(key));
}
}
// 所有数据转成map集合,再存入List集合
}
}
附加:
这里用到了和表名一致的一个自定义类,sort类:
package demo; public class Sort {
private int sid;
private String sname;
private double sprice;
private String sdesc; public Sort(int sid, String sname, double sprice, String sdesc) {
this.sid = sid;
this.sname = sname;
this.sprice = sprice;
this.sdesc = sdesc;
} public Sort() {
} public int getSid() {
return sid;
} public void setSid(int sid) {
this.sid = sid;
} public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
} public double getSprice() {
return sprice;
} public void setSprice(double sprice) {
this.sprice = sprice;
} public String getSdesc() {
return sdesc;
} public void setSdesc(String sdesc) {
this.sdesc = sdesc;
} @Override
public String toString() {
return "Sort [sid=" + sid + ", sname=" + sname + ", sprice=" + sprice + ", sdesc=" + sdesc + "]";
} }
Java学习笔记49(DBUtils工具类二)的更多相关文章
- Java学习笔记七——数组工具类Arrays
数组工具类Arrays Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组.若将里面的方法用熟的话,那开发效率会大大提高.下面介绍其中的方法. List<T> ...
- java学习笔记07--日期操作类
java学习笔记07--日期操作类 一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...
- 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理
在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...
- java学习笔记之日期日历类
java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...
- Java学习笔记26(Math类、Arrays类、BigInteger类、BigDecimal类)
Math类:数学工具类,做一些数学计算,开方,对数,三角函数等 所有方法都是静态方法,不需要建立对象,直接用类名调用即可 示例: 这里写几个在日常开发中会用到的,比如三角函数之类的平时不会用到,了解即 ...
- java学习-加载.properties工具类
javaWeb项目,要加载xxx.properties或其它如.txt, .md后缀的文本文件 文本内容有两种格式 key:value或者key=value 诸如Spring框架,Jfinal框架,都 ...
- java学习笔记之基础语法(二)
1.数组: 概念:同一种类型数据的集合,其实,数组就是一个容器 优点:可以方便的对其进行操作,编号从0开始,方便操作这些元素. 2,数组的格式 元素类型[]数组名=new 元素类型[数组元素个数]: ...
- [Guava学习笔记]Collections: 集合工具类
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3861431.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- 吴裕雄--天生自然java开发常用类库学习笔记:集合工具类Collections
import java.util.Collections ; import java.util.List ; import java.util.Set ; public class Collectio ...
随机推荐
- 《DOM Scripting》学习笔记-——第二章 js语法
<Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...
- CSS 盒子投影
box-shadow 属性可以设置盒子的投影效果.它的原理同文本投影一样.字体风格一节有介绍. 它有4个值,同时使用,也可以有选择地使用: 第一个值 设置阴影左右延伸长度,负值向左,正值向右 第二个值 ...
- zabbix-3.4.10系列
第1节 zabbix体系架构图:
- Django REST framework的分页
DRF分页组件 为什么要使用分页 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输 ...
- extern和include的作用
首先要搞清楚的是.h头文件中都是一些声明性的语句,是不分配内存的,所以头文件中有对函数的声明,有define语句,有没有实例化的结构体定义,但是没有对变量的定义(比如 int a),有的只是对外变量的 ...
- ORACLE查询内存溢出
首先我们来看一个带排序的查询,点击工具栏的显示包含实际的执行计划. 1 SELECT * FROM AdventureWorks2008R2.Person.Person WHERE FirstName ...
- 31. Next Permutation 返回下一个pumutation序列
[抄题]: Implement next permutation, which rearranges numbers into the lexicographically next greater p ...
- 698. Partition to K Equal Sum Subsets 数组分成和相同的k组
[抄题]: Given an array of integers nums and a positive integer k, find whether it's possible to divide ...
- shell脚本编写informix数据库中表的导入和导出
表的导入: 第一行:是指此脚本使用/bin/bash来解释执行. 第四行:定义一个list,里面存放表的名称,之间用空格隔开. 第七行:dbaccess tofpe(数据库名) <<EOF ...
- python07 函数式编程
1.作用域 1.1 pass关键字表示,暂时不写该方法 1.2表示返回值为方法 输出结果333 1.3函数作用域:和函数调用没关系,和声明的位置有关系, 结果为444 2.匿名函数 lanmbda ...