為什麼要使用 NamedParameterJdbcTemplate
-
簡單
-
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))
-
-
快速,
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
運算元據庫非常的容易,不會給開發帶來額外的負擔,程式碼非常的簡潔,同時程式的執行效率也非常的高。