拥抱 NamedParameterJdbcTemplate

为什么要使用 NamedParameterJdbcTemplate

  1. 简单

    • NamedParameterJdbcTemplate 支持命名参数,这是原生jdbc的一大缺点,因为jdbc是采用索引的方式设置参数,在数据库或者sql发现变化时我们需要修改代码,并且这种维护成本很高,同时也很容易出错,那命名参数可以很好的解决这个问题。

    • NamedParameterJdbcTemplate 支持对象自动映射,如下一段代码NamedParameterJdbcTemplate 会自动将返回结果映射为Person对象

      Person p = new Person();
      p.setName("kevin");
      p.setAddress("Shanghai");
      p.setCountry("China");
      
      namedTemplate.update("insert into t_person(name, address, country) values(:name,:address,:country)", new BeanPropertySqlParameterSource(p))
  2. 快速,NamedParameterJdbcTemplate只是实现了命名参数及数据封装,没有其它任何额外的开销,在运行效率上无限接近原生jdbc

接下来我们看一下使用NamedParameterJdbcTemplate如何工作,还有相同场景下MyBatis的代码。

插入一条数据并返回自增主键

NamedParameterJdbcTemplate
String sql = "INSERT INTO `t_person` (firstName, lastName, age, gender, height, weight, address, hobby, createdTime)" +
        " VALUES (:firstName, :lastName, :age, :gender, :height, :weight, :address, :hobby, :createdTime)";

KeyHolder key = new GeneratedKeyHolder();
jdbcOperations.update(sql, new BeanPropertySqlParameterSource(p), key);
p.setId(key.getKey().longValue());

我们可以通过BeanPropertySqlParameterSource自动绑定SQL参数只需要属性名称为命名参数相同即可,同时我们也可以使用MapSqlParameterSource/Map绑定SQL参数。

MyBatis
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
    INSERT INTO `t_person` (firstName, lastName, age, gender, height, weight, address, hobby, createdTime)
    VALUES (#{firstName}, #{lastName}, #{age}, #{gender}, #{height}, #{weight}, #{address}, #{hobby}, #{createdTime})
</insert>

通过主键查询对象(自动映射)

NamedParameterJdbcTemplate
String sql = "select * from t_person where id=:id";
jdbcOperations.queryForObject(sql, new MapSqlParameterSource("id", id), new BeanPropertyRowMapper<>(Person.class));

我们可以通过BeanPropertyRowMapper将返回结果自动映射为对象类型,和mybatis一样只需要返回的列名与属性名称相同即可

MyBatis
<select id="queryById" resultType="io.zhudy.namedjdbcmybatis.benchmark.Person">
    SELECT * FROM t_person WHERE id=#{value}
</select>

通过主键查询对象(手动映射)

NamedParameterJdbcTemplate
String sql = "select * from t_person where id=:id";

jdbcOperations.queryForObject(sql, new MapSqlParameterSource("id", selectId()), (rs, rowNum) -> {
        Person p = new Person();
        p.setId(rs.getLong("id"));
        p.setFirstName(rs.getString("firstName"));
        p.setLastName(rs.getString("lastName"));
        p.setAge(rs.getInt("age"));
        p.setGender(rs.getInt("gender"));
        p.setHeight(rs.getInt("height"));
        p.setWeight(rs.getInt("weight"));
        p.setAddress(rs.getString("address"));
        p.setHobby(rs.getString("hobby"));
        p.setCreatedTime(rs.getLong("createdTime"));
        return p;
    });
MyBatis
<resultMap id="person" type="io.zhudy.namedjdbcmybatis.benchmark.Person">
    <result column="id" property="id"/>
    <result column="firstName" property="firstName"/>
    <result column="lastName" property="lastName"/>
    <result column="age" property="age"/>
    <result column="gender" property="gender"/>
    <result column="height" property="height"/>
    <result column="weight" property="weight"/>
    <result column="weight" property="weight"/>
    <result column="address" property="address"/>
    <result column="hobby" property="hobby"/>
    <result column="createdTime" property="createdTime"/>
</resultMap>

<select id="queryByIdForManualMap" resultMap="person">
    SELECT * FROM t_person WHERE id=#{value}
</select>

查询多个对象

NamedParameterJdbcTemplate
String sql = "select * from t_person";
jdbcOperations.query(sql, EmptySqlParameterSource.INSTANCE, new BeanPropertyRowMapper<>(Person.class));
MyBatis
<select id="query" resultType="io.zhudy.namedjdbcmybatis.benchmark.Person">
    SELECT * FROM t_person
</select>

通过上面的代码我们可以发现使用NamedParameterJdbcTemplate操作数据库非常的容易,不会给开发带来额外的负担,代码非常的简洁,同时程序的运行效率也非常的高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值