SkillAgentSearch skills...

DbUtils

使用原生JDBC封装的JDBC工具类

Install / Use

/learn @freesoulcode/DbUtils
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

仓库介绍

由于在学习阶段,不允许使用Apache的dbutils包或者mybatis等技术框架,故自己封装了一个基于原生JDBC的一个工具类。

目前该工具类已实现

| 方法名 | 说明 | | ------------------------------------------------------------ | -------------------------------- | | Connection getConnection() | 获取连接 | | void closeResource(Connection connection) | 关闭Connection(有几个重载方法) | | int insert(Connection connection, String sql, Object... param) | 增加一条记录 | | int update(Connection connection, String sql, Object... param) | 更新一条记录 | | int delete(Connection connection, String sql, Object... param) | 删除一条记录 | | List<HashMap<String, Object>> queryObjAsList(Connection connection, String sql, Object... param) | 查询任意字段 | | <T> T queryOneBean(Class<T> clazz, Connection connection, String sql, Object... param) | 查询并封装一个bean对象 | | <T> List<T> queryBeanAsList(Class<T> clazz, Connection connection, String sql, Object... param) | 查询并封装多个bean | | int batchInsert(Connection connection, String sql, int count, Object[][] param) | 批量插入(带参数) | | int batchInsert(Connection connection, String sql, int count) | 批量插入(不带参数) | | int batchDelete(Connection connection, String sql, int count, Object[][] param) | 批量删除(带参数) |

很遗憾,我现在还没有头绪怎么简化的封装好事务功能。

另外,即便我提供了CRUD的实现,但是你会发现,我插入删除是返回了更新操作的结果,因为插入删除本质上就是更新。所以你可以使用更新操作来进行删除、修改,也可以使用修改还进行插入删除。但是为了语义化,我提供了这几个方法的实现。

如果您需要使用druid或者C3P0等连接池,那么你需要自行实例化一个Connection

使用教程

首先,你需要在你的项目中导入这个工具类,并在类路径下创建一个jdbc.properties的配置文件,在配置文件中配置好连接数据库的四要素

driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
user=root
password=root

然后在你要操作的类下面导入该类

import DbUtils的全类名
public class XXXDao {
    Connection connection = DbUtils.getConnection();
}

这样做的目的是你每个方法都可以访问到该连接对象,不至于每个方法都去创建一个Connection

在接下来的使用中,你只需要:① 写SQL语句 ② 调用对应的方法 ③ 关闭连接(只需要关闭连接,其他的资源我已经帮你关闭了,关闭其他资源的方法我只在内部使用,所以关闭其他资源的方法并没有设置为public,您只需要放心的关闭Connection对象就可以了)

增加一条记录

@Test
public void testInsert() {
    //不带参数
    //① 写SQL语句
    String sql = "insert into student values(null,2020200,'王',21,'1班','A')";
    //② 调用对应的方法
    DbUtils.update(connection, sql);
    //带参数
    ////① 写SQL语句
    String sql1 = "insert into student values(null,?,?,21,'1班','A')";
    //② 调用对应的方法
    DbUtils.update(connection, sql1,202022,"王");
    //③ 关闭连接
    DbUtils.closeResource(connection);
}

删除一条记录

@Test
public void testDelete() {
    //① 写SQL语句
    String sql = "delete from student where id = ?";
    //② 调用对应的方法
    DbUtils.update(connection, sql, 2);
    //③ 关闭连接
    DbUtils.closeResource(connection);
}

修改一条记录

@Test
public void testUpdate() {
	//① 写SQL语句
    String sql = "update student set name = '李' where id = ?";
    //② 调用对应的方法
    int update = DbUtils.update(connection, sql, 2);
    //③ 关闭连接
    DbUtils.closeResource(connection);
}

查询一个javaBean

这里举个特例,数据库中的字段为student_num,而实体类中的字段为studentNum。本人还没那个实力去搞懂形如mybatis等设置驼峰命名法,故你需要为该字段添加一个和实体类字段一致的别名,这样便能成功的封装成一个JavaBean

@Test
public void testQueryOneBean() {
    //① 写SQL语句
    String sql = "select id,student_num studentNum,name,age,class_name className ,score " +
            "from student where id = ?";
    //② 调用对应的方法
    Student student = DbUtils.queryOneBean(Student.class, connection, sql, 1);
    System.out.println(student);
    //③ 关闭连接
    DbUtils.closeResource(connection);
}

查询多个JavaBean

同上,若数据库字段和实体类字段不一致,你需要为字段添加一个和实体类字段一致的别名

@Test
public void testQueryBeanAsList() {
    //① 写SQL语句
    String sql = "select id,student_num studentNum,name,age,class_name className ,score " +
            "from student ";
    //② 调用对应的方法
    List student = DbUtils.queryBeanAsList(Student.class, connection, sql);
    System.out.println(student.toString());
    //③ 关闭连接
    DbUtils.closeResource(connection);
}

查询任意字段

@Test
public void testQueryObjAsList() {
    //① 写SQL语句
    String sql = "select count(*) from student where name = ? ";
    //② 调用对应的方法
    List<HashMap<String, Object>> list = DbUtils.queryObjAsList(connection, sql, "王");
    System.out.println(list.toString());
    //③ 关闭连接
    DbUtils.closeResource(connection);
}

批量插入

@Test
public void testBatchInsert() {
    //① 写SQL语句
    String sql = "insert into stu values(?,?) ";
    Object[][] param = new Object[3][2];
    param[0][0] = 10;
    param[0][1] = "王";
    param[1][0] = 11;
    param[1][1] = "吴";
    param[2][0] = 12;
    param[2][1] = "李";
    //② 调用对应的方法
    DbUtils.batchInsert(connection, sql, 3, param);
    //③ 关闭连接
    DbUtils.closeResource(connection);
}

在这里,你可以奇怪这个参数是怎么写的。首先需要一个二维数组,长度为操作的次数和参数。如上所示,操作的次数为3,参数为2,然后将参数设置好便可。

当然,可以不传参数,那意味着一段语句重复执行3次。故你可以使用批量更新的方法不带参数去实现批量执行某条语句。

批量删除

@Test
public void testBatchDelete() {
    //① 写SQL语句
    String sql = "delete from stu where id = ? ";
    Object[][] param = new Object[3][1];
    param[0][0] = 10;
    param[1][0] = 11;
    param[2][0] = 12;
    //② 调用对应的方法
    DbUtils.batchInsert(connection, sql, 3, param);
    //③ 关闭连接
    DbUtils.closeResource(connection);
}

由于批量删除是应该携带参数的,不带参数重复去执行一条删除语句是没有意义的,故不提供。

希望大家能给一个star,并强烈欢迎各位提供更多的方法完善此工具

View on GitHub
GitHub Stars11
CategoryDevelopment
Updated1y ago
Forks0

Languages

Java

Security Score

55/100

Audited on Aug 18, 2024

No findings