Spring JDBC(二)SimpleJdbcInsert

上一篇写了关于jdbcTemplate的一些基本使用,这一篇来聊聊SimpleJdbcInsert

SimpleJdbcInsert是springjdbc提供的一个简化插入操作的类,下面来看一下常用的api

创建SimpleJdbcInsert实例

创建一个用户表

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `password` varchar(255) DEFAULT NULL,
  `user_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建实例

  private SimpleJdbcInsert simpleJdbcInsert;
  private DriverManagerDataSource dataSource;

  @Before
  public void init() {
    dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/blogsrc?useUnicode=true&characterEncoding=UTF-8");
    dataSource.setUsername("root");
    dataSource.setPassword("zhao");
    simpleJdbcInsert = new SimpleJdbcInsert(dataSource);
  }

新增

通过withTableName绑定需要操作的数据库表,然后指定新增的参数

 /**
   * simpleJdbcInsert新增
   */
  @Test
  public void insertTest() {
    Map<String, Object> parameters = new HashMap<String, Object>(3);
    parameters.put("user_name", "小明");
    parameters.put("password", "123456");
    simpleJdbcInsert.withTableName("user").execute(parameters);
  }

返回主键

通过usingGeneratedKeyColumns指定主键,executeAndReturnKey执行并返回主键,返回的主键为Number类型,如有需要,自行转换

  /**
   * simpleJdbcInsert新增,并返回主键
   */
  @Test
  public void insertAndReturnPrimaryKeyTest() {
    Map<String, Object> parameters = new HashMap<String, Object>(3);
    parameters.put("user_name", "小明");
    parameters.put("password", "123456");
    Number primaryKey = simpleJdbcInsert.withTableName("user")
        .usingGeneratedKeyColumns("id")// 指定主键列名
        .executeAndReturnKey(parameters);
    System.out.println("主键为:" + primaryKey);
  }

限制插入的列

usingColumns方法可以限制插入的列

  /**
   * simpleJdbcInsert新增,返回主键,并限制插入的列
   */
  @Test
  public void usingColumnsTest() {
    Map<String, Object> parameters = new HashMap<String, Object>(3);
    parameters.put("user_name", "小明");
    parameters.put("password", "123456");
    Number primaryKey = simpleJdbcInsert.withTableName("user")
        .usingColumns("user_name")// 限制输入的列,因为限制只新增用户名,所以password的值不会进数据库
        .usingGeneratedKeyColumns("id")// 指定主键列名
        .executeAndReturnKey(parameters);
    System.out.println("主键为:" + primaryKey);
  }

SqlParameterSource

SqlParameterSource接口对sql参数进行了封装,两个常用的实现BeanPropertySqlParameterSourceMapSqlParameterSourceBeanPropertySqlParameterSource可以通过javabean构造,MapSqlParameterSource则可以用map构造

@Test
  public void sqlParameterSourceTest() {
    User user = new User();
    user.setUserName("小明");
    user.setPassword("123456");
    // BeanPropertySqlParameterSource
    SqlParameterSource sqlParm = new BeanPropertySqlParameterSource(user);
    simpleJdbcInsert.withTableName("user").execute(sqlParm);

    // MapSqlParameterSource
    simpleJdbcInsert = new SimpleJdbcInsert(dataSource);
    Map<String, Object> mapParameters = new HashMap<String, Object>();
    mapParameters.put("user_name", "小明");
    mapParameters.put("password", "123456");
    SqlParameterSource sqlParmMap = new MapSqlParameterSource(mapParameters);
    simpleJdbcInsert.withTableName("user").execute(sqlParmMap);

    simpleJdbcInsert = new SimpleJdbcInsert(dataSource);
    // 也可以通过MapSqlParameterSource addValue 添加参数
    SqlParameterSource sqlParmMapAdd = new MapSqlParameterSource()
        // addValues(map) 一次添加多个参数
        .addValue("user_name", "小明")// 单个添加
        .addValue("password", "123456");
    simpleJdbcInsert.withTableName("user").execute(sqlParmMapAdd);
  }

需要注意jdbcTemplate是线程安全的,所以可以一直使用同一个实例,但simpleJdbcInsert不是线程安全的,每次使用都要获取一个新的simpleJdbcInsert实例

完整的源码 https://github.com/zhaoguhong/blogsrc