依赖

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的更多相关文章

  1. 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)

    -----------------------JDBC---------- 0.      db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...

  2. 使用JDBC(Dbutils工具包)来从数据库拿取map类型数据来动态生成insert语句

    前言: 大家在使用JDBC来连接数据库时,我们通过Dbutils工具来拿取数据库中的数据,可以使用new BeanListHandler<>(所映射的实体类.class),这样得到的数据, ...

  3. 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)

    最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口 ...

  4. jdbc操作mysql

    本文讲述2点: 一. jdbc 操作 MySQL .(封装一个JdbcUtils.java类,实现数据库表的增删改查) 1. 建立数据库连接 Class.forName(DRIVER); connec ...

  5. 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)

    近期看老罗的视频,跟着完毕了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完毕对数据库的增删改查.当中查询这块,包含普通的查询和利用反射完毕的查询,主要包含以下几个函数接口 ...

  6. Android 之JDBC

    JDBC(Java DataBase Connectivity)是使用 Java 存取数据库系统的标准解决方案,它将不同数据库间各自差异API与标准 SQL语句分开看待,实现数据库无关的 Java操作 ...

  7. 厚积薄发系列之JDBC详解

    创建一个以JDBC链接数据库的程序,包含七个步骤 1.加载JDBC驱动 加载要连接的数据库的驱动到JVM 如何加载?forName(数据库驱动) MySQL:Class.forName("c ...

  8. JdbcUtils.java

    package com.jdbc.dbutils; import java.lang.reflect.Field; import java.sql.Connection; import java.sq ...

  9. 32、mybatis

    第一章回顾jdbc开发 1)优点:简单易学,上手快,非常灵活构建SQL,效率高 2)缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等) 开发者既要写业务逻辑,又要写对象的创建 ...

  10. mybaits入门

    1.回顾jdbc开发 orm概述 orm是一种解决持久层对象关系映射的规则,而不是一种具体技术.jdbc/dbutils/springdao,hibernate/springorm,mybaits同属 ...

随机推荐

  1. BZOJ4177Mike的农场——最小割

    题目描述 Mike有一个农场,这个农场n个牲畜围栏,现在他想在每个牲畜围栏中养一只动物,每只动物可以是牛或羊,并且每个牲畜围栏中的饲养条件都不同,其中第i个牲畜围栏中的动物长大后,每只牛可以卖a[i] ...

  2. 洛谷P2320鬼谷子的钱袋.

    题目 这个题考察二进制分解. \(Code\) #include <bits/stdc++.h> #pragma GCC optimize(2) #pragma GCC optimize( ...

  3. jsp小测试--猜大小

    page1.jpg: <%@ page language="java" import="java.util.*" pageEncoding="g ...

  4. Mysql数据库操作笔记

     如果数据库表字段存在,则删除该表 drop table if exists `table_name` 创建数据库表语句 create table `table_name`( `id` ) not n ...

  5. One-hot encoding 独热编码

    http://blog.sina.com.cn/s/blog_5252f6ca0102uy47.html

  6. 【转】idea设置JVM运行参数

    对JVM运行参数进行修改是JVM性能调优的重要手段,下面介绍在应用程序开发过程中JVM参数设置的几种方式. 方式一 java程序运行时指定 -Dproperty=value 该参数通常用于设置系统级全 ...

  7. NOIP2011Mayan游戏(模拟)

    Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个77 行\times 5×5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指 ...

  8. 【linux】/dev/null作用和/dev/random

    一.  /dev/null /dev/null属于字符特殊文件,它属于空设备,是一个特殊的设备文件,它会丢弃一切写入其中的数据,写入它的内容都会永远丢失,而且没有任何可以读取的内容. 我们用file命 ...

  9. nginx常用配置

    nginx.conf配置文件详解 其主要分为几个模块 全局快 从开始到events块之间的一部分内容,其作用域为全局作用域 events块 主要负责Nginx服务器与用户的网络连接 常用设置: 是否开 ...

  10. 如何优雅的解决mac安装zsh不执行.bash_profile

    最近刚刚重装了系统,并安装了优雅的shell命令工具zsh,突然发现我放在我的工作目录下的.bash_profile居然在启动的时候执行,导致我的java的一些配置没有注册到bash中.然后查资料得知 ...