JDBC-DbUtils
依赖
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>yofc</groupId>
<artifactId>jdbc</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.14</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.26</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
</dependencies> <build>
<plugins>
<!-- 指定jdk -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
实体类
package com.jdbc; public class User {
private Integer id;
private String name;
private Integer age; public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public User() {} @Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
CURD
INSERT, UPDATE 和 DELETE
import com.alibaba.druid.pool.DruidDataSource;
import com.jdbc.User;
import org.apache.commons.dbutils.QueryLoader;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.*;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; public class DBUtilsTest { private Connection connection; @BeforeEach
public void start() throws Exception {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://192.168.8.136:3306/jdbc");
dataSource.setUsername("root");
dataSource.setPassword("root"); connection = dataSource.getConnection();
} @AfterEach
public void end() throws Exception {
if (connection != null) {
connection.close();
}
} /**
* QueryRunner 类的 update 方法可用于 INSERT, UPDATE 和 DELETE
*/
@Test
public void testQueryRunnerUpdate() {
QueryRunner queryRunner = new QueryRunner();
String sql = "UPDATE user SET name = ? WHERE id = ?";
try {
queryRunner.update(connection, sql, "zhangsan",22);
} catch (Exception e) {
e.printStackTrace();
}
}
}
SELECT
@Test
public void testResultSetHandler() {
String sql = "SELECT id, name, age FROM user";
QueryRunner queryRunner = new QueryRunner();
try {
/**
* ResultSetHandler : query 方法的返回值直接取决于 ResultSetHandler 的 hanlde(ResultSet rs) 是如何实现
* QueryRunner 类的 query 方法中调用了 ResultSetHandler 的 handle() 方法作为返回值
*/
List<User> usersRST = queryRunner.query(connection, sql,
new ResultSetHandler<List<User>>() {
@Override
public List<User> handle(ResultSet rs) throws SQLException {
List<User> users = new ArrayList<>();
while (rs.next()) {
Integer id = rs.getInt(1);
String name = rs.getString(2);
Integer age = rs.getInt(3);
User user = new User(id, name, age);
users.add(user);
}
return users;
}
}
);
System.out.println(usersRST);
} catch (Exception e) {
e.printStackTrace();
}
}
SELECT-BeanHandler
/**
* BeanHandler: 把结果集的第一条记录转为创建 BeanHandler 对象时传入的 Class 参数对应的对象
*/
@Test
public void testBeanHanlder(){
try {
QueryRunner queryRunner = new QueryRunner();
String sql = "SELECT id, name, age FROM user WHERE id >= ?";
User user = (User) queryRunner.query(connection, sql, new BeanHandler(User.class), 5);
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
}
}
SELECT-BeanListHandler
/**
* BeanListHandler:ResultSetHandler 的实现类,把结果集转为一个 List, 该 List 不为 null, 无记录时为空集合
* 有记录, List 中存放创建 BeanListHandler 传入的 Class 对象对应的对象
*/
@Test
public void testBeanListHandler() {
String sql = "SELECT id, name, age FROM user";
QueryRunner queryRunner = new QueryRunner();
try {
Object object = queryRunner.query(connection, sql, new BeanListHandler<>(User.class));
System.out.println(object);
} catch (Exception e) {
e.printStackTrace();
}
}
SELECT-MapHandler
/**
* MapHandler: 返回 SQL 对应的第一条记录对应的 Map 对象
* 键: SQL 查询的列名(不是列的别名), 值: 列的值
*/
@Test
public void testMapHandler() {
QueryRunner queryRunner = new QueryRunner();
String sql = "SELECT id, name, age FROM user Where id > ?";
try {
Map<String, Object> map = queryRunner.query(connection, sql, new MapHandler(), 4);
System.out.println(map);
} catch (Exception e) {
e.printStackTrace();
}
}
SELECT-MapListHandler
/**
* Map 对应查询的一条记录: 键: SQL 查询的列名(不是列的别名), 值: 列的值
* MapListHandler: 返回的多条记录对应的 Map 的集合
*/
@Test
public void testMapListHandler() {
QueryRunner queryRunner = new QueryRunner();
String sql = "SELECT id, name, age FROM user";
try {
List<Map<String, Object>> mapList = queryRunner.query(connection, sql, new MapListHandler());
System.out.println(mapList);
} catch (Exception e) {
e.printStackTrace();
}
}
SELECT-ScalarHandler
/**
* ScalarHandler: 把结果集的第一行第一列转为一个数值(可以是任意基本数据类型)返回
*/
@Test
public void testScalarHandler() {
QueryRunner queryRunner = new QueryRunner();
String sql = "SELECT id, name, age FROM user WHERE id > ?";
try {
Object count = queryRunner.query(connection, sql, new ScalarHandler(), 6);
System.out.println(count);
} catch (Exception e) {
e.printStackTrace();
}
}
QueryLoader
sql.properties
QUERY_USER=SELECT id, name, age FROM user
/**
* QueryLoader: 加载存放着 SQL 语句的资源文件,以更好的解耦
* / 代表类路径的根目录
*/
@Test
public void testQueryLoader() throws IOException {
Map<String, String> sqls = QueryLoader.instance().load("/sql.properties");
String updateSql = sqls.get("QUERY_USER");
System.out.println(updateSql);
}
官方文档
JDBC-DbUtils的更多相关文章
- 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)
-----------------------JDBC---------- 0. db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...
- 使用JDBC(Dbutils工具包)来从数据库拿取map类型数据来动态生成insert语句
前言: 大家在使用JDBC来连接数据库时,我们通过Dbutils工具来拿取数据库中的数据,可以使用new BeanListHandler<>(所映射的实体类.class),这样得到的数据, ...
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口 ...
- jdbc操作mysql
本文讲述2点: 一. jdbc 操作 MySQL .(封装一个JdbcUtils.java类,实现数据库表的增删改查) 1. 建立数据库连接 Class.forName(DRIVER); connec ...
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)
近期看老罗的视频,跟着完毕了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完毕对数据库的增删改查.当中查询这块,包含普通的查询和利用反射完毕的查询,主要包含以下几个函数接口 ...
- Android 之JDBC
JDBC(Java DataBase Connectivity)是使用 Java 存取数据库系统的标准解决方案,它将不同数据库间各自差异API与标准 SQL语句分开看待,实现数据库无关的 Java操作 ...
- 厚积薄发系列之JDBC详解
创建一个以JDBC链接数据库的程序,包含七个步骤 1.加载JDBC驱动 加载要连接的数据库的驱动到JVM 如何加载?forName(数据库驱动) MySQL:Class.forName("c ...
- JdbcUtils.java
package com.jdbc.dbutils; import java.lang.reflect.Field; import java.sql.Connection; import java.sq ...
- 32、mybatis
第一章回顾jdbc开发 1)优点:简单易学,上手快,非常灵活构建SQL,效率高 2)缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等) 开发者既要写业务逻辑,又要写对象的创建 ...
- mybaits入门
1.回顾jdbc开发 orm概述 orm是一种解决持久层对象关系映射的规则,而不是一种具体技术.jdbc/dbutils/springdao,hibernate/springorm,mybaits同属 ...
随机推荐
- BZOJ1005 HNOI2008明明的烦恼(prufer+高精度)
每个点的度数=prufer序列中的出现次数+1,所以即每次选一些位置放上某个点,答案即一堆组合数相乘.记一下每个因子的贡献分解一下质因数高精度乘起来即可. #include<iostream&g ...
- .net Json 反序列化时,属性带点
.net Json 反序列化时,属性带点 使用[JsonProperty("xxx.xxx")] static void Main(string[] args) { string ...
- npm、webpack、vue-cli
Node.js npm 什么是Node.js 以及npm 简单的来说 Node.js 就是运行在服务端的JavaScript,基于Chrome V8 引擎的. npm 是Node.js 的包管理 ...
- Python中的numpy模块解析
numpy 1. 创建对象 维度(dimensions):轴 轴的个数:秩(rank) Numpy最重要的一个特点就是其N维数组对象(即ndarray) 创建数组最简单的函数就是用array函数: ...
- BZOJ4818 [SDOI2017] 序列计数 【矩阵快速幂】
题目分析: 一个很显然的同类项合并.注意到p的大小最大为100,考虑把模p意义下相同的求出来最后所有的减去没有质数的做矩阵快速幂即可. 代码: #include<bits/stdc++.h> ...
- 解决sublime text3 中文字符乱码
前言 由于系统编码问题导致的中文乱码解决,linux和windows解决方式都一样. 流程 linux下两步都需要,windows下只需要第二步. 1.在package install中搜索安装:co ...
- 【XSY2708】hack 网络流
题目描述 给你一个图,每条边有一个权值.要求你选一些边,满足对于每条从\(1\)到\(n\)的路径上(可以不是简单路径)有且仅有一条被选中的边.问你选择的边的边权和最小值. \(n\leq 100\) ...
- [HNOI2008]玩具装箱TOY(斜率优化)
题目链接 题意:有编号为\(1\cdots N\)的N件玩具,第 i 件玩具经过压缩后变成一维长度为 \(C_i\) .要求在一个容器中的玩具编号是连续的,同时如果将第 i 件玩具到第 j 个玩具放 ...
- 【CF809D】Hitchhiking in the Baltic States(Splay,动态规划)
[CF809D]Hitchhiking in the Baltic States(Splay,动态规划) 题面 CF 洛谷 题解 朴素\(dp\):设\(f[i][j]\)表示当前考虑到第\(i\)个 ...
- 【nginx】nginx配置文件结构,内置变量及参数调优
Nginx的配置文件是一个纯文本文件,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的.每个block一般以一个大括号“{”来表示.block 可以分为几个层次,整 ...