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 ...
随机推荐
- Spring中@相关注解的意义
1.@controller 控制器(注入服务) 用于标注控制层,相当于struts中的action层 2.@service 服务(注入dao) 用于标注服务层,主要用来进行业务的逻辑处理 3.@rep ...
- 安装好ubuntu双系统启动时卡死解决办法
问题描述:在安装完ubuntu双系统后,第一次启动ubuntu系统时,卡死在启动界面(或者黑屏),这大概都是由于显卡驱动的原因,具体不在这里阐述,通过以下方法能成功解决,据我个人经验,这可能是诸多方法 ...
- Linux下安装Anaconda
Anaconda官方下载地址: https://www.anaconda.com/download/ >>bash xxxxxx.sh >>reboot >>sud ...
- mysql 按出现次数排序
SELECT * FROM table a LEFT JOIN (SELECT key,count(*) as c FROM table GROUP BY key ) b on a.key=b.k ...
- Java的学习05
今天学习了,Java中的LinkedList类.这个类需要用到链表的知识,以前一直以为,只有c/c++有链表.今天才知道,原来其他语言.也有链表,而且还是双向链表. /** * 自定义一个链表 * @ ...
- windows nodejs yarn 与hadoop yarn命令冲突
添加环境变量后 修改名字 1.修改前: 2.修改后:
- 关于深度学习中的batch_size
5.4.1 关于深度学习中的batch_size 举个例子: 例如,假设您有1050个训练样本,并且您希望设置batch_size等于100.该算法从训练数据集中获取前100个样本(从第1到第100个 ...
- netty(二) 创建一个netty服务端和客户端
服务端 NettyServer package com.zw.netty.config; import com.zw.netty.channel.ServerInitializer;import io ...
- SSM框架整合过程总结
-----------------------siwuxie095 SSM 框架整合过程总结 1.导入相关 jar 包( ...
- [leetcode]76. Minimum Window Substring最小字符串窗口
Given a string S and a string T, find the minimum window in S which will contain all the characters ...