执行增删改

  • 方法 getUpdate(String sql, Object... args)会执行sql并返回受影响行数,
  • 因此增、删、改的sql统一交给 getUpdate 方法来处理

示例 - 获取受影响行数

  1. @Test
  2. public void test2_1() {
  3. SqlFly sqlFly = SqlFlyFactory.getSqlFly();
  4. String sql = "delete from sys_user where id = ?";
  5. int line = sqlFly.getUpdate(sql, 10009);
  6. System.out.println("成功删除:" + line + "条数据");
  7. }

示例 - 增加一条记录

  1. @Test
  2. public void test2_2() {
  3. SqlFly sqlFly = SqlFlyFactory.getSqlFly();
  4. String sql = " insert into " +
  5. " sys_user(username, password, sex, age, create_time) " +
  6. " values (?, ?, ?, ?, now()) ";
  7. Object [] args = {"刘三刀", "123456", 1, 40}; // 与sql语句中的 ?占位符参数 一一对应即可
  8. sqlFly.getUpdate(sql, args);
  9. System.out.println("记录增加成功");
  10. }

?参数占位符的弊端

不难发现,上面的示例虽然可以轻松的插入一条数据,却有一个非常明显的弊端,那就是当一条sql语句的参数非常多时,将会发生下面类似下面的这种情况

  1. String sql =
  2. " insert into " +
  3. " sys_user(username, password, sex, age, phone, address, status, role_id, follow_count, fans_count, create_time) " +
  4. " values (?, ?, ?, ?, ?, ?, ?, ?, ?, now()) ";
  5. Object [] args = {"韩勇", "123456", 1, 40, "15866668888", "山东省 济南市 历下区", 1, 11, 0, 0};

可以看出,此时再想做到参数列表与sql参数的一一对应将是极其困难的,?参数占位符 在应对这种参数较多的情况将会非常痛苦,稍微一不注意就会在参数顺序中迷失自我, 所以这时候就需要用 #参数模式 来解决这个问题

# 参数模式

1、先创建实体类
  1. public class SysUser {
  2. private long id; // id号
  3. private String username; // 昵称
  4. private String password; // 密码
  5. private int sex; // 性别(1=男,2=女)
  6. private int age; // 年龄
  7. private Date create_time; // 创建日期
  8. }
  • 可以利用ide的快捷键生成字段的 gettersetter (不会的同学请自行百度)
2、示例 - #参数模式
  1. @Test
  2. public void test2_3() {
  3. SqlFly sqlFly = SqlFlyFactory.getSqlFly();
  4. String sql = " insert into " +
  5. " sys_user(username, password, sex, age, create_time) " +
  6. " values (#{username}, #{password}, #{sex}, #{age}, now()) ";
  7. SysUser user = new SysUser();
  8. user.setUsername("王冲");
  9. user.setPassword("123456");
  10. user.setSex(1);
  11. user.setAge(18);
  12. sqlFly.getUpdate(sql, user); // 直接实体类入参
  13. System.out.println("记录增加成功");
  14. }
  • 框架内部会将#{参数}翻译成?占位符,实际上最终执行的还是?占位符方式,不过这为你在书写sql时提供了极大的便利

示例 - 获取增加记录的主键

  • 在自增主键的表中,有时候我们需要在插入记录后立即获取它的主键,有很多种方法可以做到这件事情,这里以mysql为例,提供一个思路
    1. @Test
    2. public void test2_4() {
    3. SqlFly sqlFly = SqlFlyFactory.getSqlFly();
    4. String sql = " insert into " +
    5. " ser_article(title, content, user_id, create_time) " +
    6. " values (?, ?, ?, now()) ";
    7. Object [] args = {"齐鲁晚报", "据报到...", 10001};
    8. // 必须开启事务,保证两条sql使用的是同一条Connection连接
    9. sqlFly.beginTransaction(); // 开启事务
    10. sqlFly.getUpdate(sql, args); // 增加
    11. long id = sqlFly.getModel(long.class, "SELECT @@identity"); // 获取上一条插入记录的主键
    12. sqlFly.commit(); // 提交事务
    13. System.out.println("记录增加成功,记录主键为:" + id);
    14. }