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 ...
随机推荐
- Linux命令:mapfile
mapfile [-n 计数] [-O 起始序号] [-s 计数] [-t] [-u fd] [-C 回调] [-c 量子] [数组] 两个作用: 一是给index数组读取标准输入来赋值:二是文件描述 ...
- mybatis泛型(一)
mybatis的确很方便,可以随意配置sql语句,并根据参数生成指定的sql,也可以根据查询结果生成指定对象 但是有一点非常恐怖,就是每个数据库表都必须有一个配置,等于在一个系统里做了很多重复的工作, ...
- ReactiveX 学习笔记(24)使用 RxCpp + C++ REST SDK 调用 REST API
JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ...
- mac下安装cnpm淘宝镜像
cnpm:官网 (事先已经安装了node,有npm)查看官网,提示安装需运行命令:npm install -g cnpm --registry=https://registry.npm.taobao. ...
- java学习笔记(七):for循环
java的for循环和c++的for循环类似 public class Test { public static void main(String args[]) { for(int x = 10; ...
- Zabbix告警脚本-短信
[root@iot-svndata02 bin]# cat zbsms.sh #!/bin/sh #curl http://221.179.180.137:8080/smsaServer/lkSend ...
- wampserver安装
WampServer的下载地址:https://sourceforge.net/projects/wampserver 安装教程:https://jingyan.baidu.com/article/4 ...
- 706. Design HashMap 实现哈希表
[抄题]: public MyHashMap() { 主函数里面是装非final变量的,如果没有,可以一个字都不写 } [暴力解法]: 时间分析: 空间分析: [优化后]: 时间分析: 空间分析: ...
- java得到当前日期的前一天或后一天
public String getNextDay(String startdate) throws ParseException{ Date date = (new SimpleDateFormat( ...
- java_16Arrays类
1sort():对数组进行升序排列 public static void main(String[] args) { int[] arr= {2,43,6,7}; Arrays.sort(arr); ...