数据库简单操作-Db

由来

数据库操作不外乎四门功课:增删改查,在Java的世界中,由于JDBC的存在,这项工作变得简单易用,但是也并没有做到使用上的简化。于是出现了JPA(Hibernate)、MyBatis、Jfinal、BeetlSQL等解决框架,或解决多数据库差异问题,或解决SQL维护问题。而Hutool对JDBC的封装,多数为在小型项目中对数据处理的简化,尤其只涉及单表操作时。OK,废话不多,来个Demo感受下。

使用

我们以MySQL为例

1、添加配置文件

Maven项目中在src/main/resources目录下添加db.setting文件(非Maven项目添加到ClassPath中即可):

  1. ## db.setting文件
  2. url = jdbc:mysql://localhost:3306/test
  3. user = root
  4. pass = 123456
  5. ## 可选配置
  6. # 是否在日志中显示执行的SQL
  7. showSql = true
  8. # 是否格式化显示的SQL
  9. formatSql = false
  10. # 是否显示SQL参数
  11. showParams = true
  12. # 打印SQL的日志等级,默认debug,可以是info、warn、error
  13. sqlLevel = debug

2、引入MySQL JDBC驱动jar

  1. <!--mysql数据库驱动 -->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. <version>${mysql.version}</version>
  6. </dependency>

注意 此处不定义MySQL版本,请参考官方文档使用匹配的驱动包版本。

3、增删改查

  1. Db.use().insert(
  2. Entity.create("user")
  3. .set("name", "unitTestUser")
  4. .set("age", 66)
  5. );

插入数据并返回自增主键:

  1. Db.use().insertForGeneratedKey(
  2. Entity.create("user")
  3. .set("name", "unitTestUser")
  4. .set("age", 66)
  5. );

  1. Db.use().del(
  2. Entity.create("user").set("name", "unitTestUser")//where条件
  3. );

注意 考虑安全性,使用del方法时不允许使用空的where条件,防止全表删除,如有相关操作需要,请调用execute方法执行SQL实现。

  1. Db.use().update(
  2. Entity.create().set("age", 88), //修改的数据
  3. Entity.create("user").set("name", "unitTestUser") //where条件
  4. );

注意 条件语句除了可以用=精确匹配外,也可以范围条件匹配,例如表示 age < 12 可以这样构造Entity:Entity.create("user").set("age", "< 12"),但是通过Entity方式传入条件暂时不支持同字段多条件的情况。

  1. 查询全部字段
  1. //user为表名
  2. Db.use().findAll("user");
  1. 条件查询
  1. Db.use().findAll(Entity.create("user").set("name", "unitTestUser"));
  1. 模糊查询
  1. Db.use().findLike("user", "name", "Test", LikeType.Contains);

或者:

  1. List<Entity> find = Db.use().find(Entity.create("user").set("name", "like 王%"));
  1. 分页查询
  1. //Page对象通过传入页码和每页条目数达到分页目的
  2. PageResult<Entity> result = Db.use().page(Entity.create("user").set("age", "> 30"), new Page(10, 20));
  1. 执行SQL语句
  1. //查询
  2. List<Entity> result = Db.use().query("select * from user where age < ?", 3);
  1. //模糊查询
  2. List<Entity> result = Db.use().query("select * from user where name like ?", "王%");
  1. //新增
  2. Db.use().execute("insert into user values (?, ?, ?)", "张三", 17, 1);
  1. //删除
  2. Db.use().execute("delete from user where name = ?", "张三");
  1. //更新
  2. Db.use().execute("update user set age = ? where name = ?", 3, "张三");
  1. 事务
  1. Db.use().tx(new TxFunc() {
  2. @Override
  3. public void call(Db db) throws SQLException {
  4. db.insert(Entity.create("user").set("name", "unitTestUser"));
  5. db.update(Entity.create().set("age", 79), Entity.create("user").set("name", "unitTestUser"));
  6. }
  7. });

JDK8中可以用lambda表达式(since:5.x):

  1. Db.use().tx(db -> {
  2. db.insert(Entity.create("user").set("name", "unitTestUser2"));
  3. db.update(Entity.create().set("age", 79), Entity.create("user").set("name", "unitTestUser2"));
  4. });
  1. 支持命名占位符的SQL执行

有时候使用”?”占位符比较繁琐,且在复杂SQL中很容易出错,Hutool支持使用命名占位符来执行SQL。

  1. Map<String, Object> paramMap = MapUtil.builder("name1", (Object)"张三").put("age", 12).put("subName", "小豆豆").build();
  2. Db.use().query("select * from table where id=@id and name = @name1 and nickName = @subName", paramMap);

在Hutool中,占位符支持以下几种形式:

  • :name
  • ?name
  • @name
  1. IN查询

我们在执行类似于select * from user where id in 1,2,3这类SQL的时候,Hutool封装如下:

  1. List<Entity> results = db.findAll(
  2. Entity.create("user")
  3. .set("id", "in 1,2,3"));

当然你也可以直接:

  1. List<Entity> results = db.findAll(
  2. Entity.create("user")
  3. .set("id", new long[]{1, 2, 3}));