Spring JdbcTemplate之使用详解
程序员文章站
2023-11-09 21:19:58
最近在项目中使用到了 Spring 的 JdbcTemplate, 中间遇到了好多坑, 所以花一些时间对 JdbcTemplate 的使用做了一个总结, 方便以后自己的查看。文章中贴出来的API都是经过测试的, 可以放心大胆的拿去用。 概述 JdbcTemplate主要提供4种方法: 前两种使用的一 ......
最近在项目中使用到了 spring 的 jdbctemplate, 中间遇到了好多坑, 所以花一些时间对 jdbctemplate 的使用做了一个总结, 方便以后自己的查看。文章中贴出来的api都是经过测试的, 可以放心大胆的拿去用。
概述
jdbctemplate主要提供4种方法:
- call()方法: 用于执行存储过程、存储函数
- execute()方法: 可以执行任何sql语句, 一般用于ddl语句
- update()和batchupdate()方法: 分别对应单个更新、批量更新的语句执行
- query()和queryforxxx()方法: 用于单查、列表查询
前两种使用的一般较少, 本次主要介绍后两种方法的使用。
单个更新
@test public void insert() { string sql = "insert into pass_user (name,age,gender,birthday,create_time,update_time) values (?,?,?,?,?,?)"; jdbctemplate.update(sql, "张三丰", 18, "male", instant.now().toepochmilli(), instant.now().toepochmilli(), instant.now().toepochmilli()); }
jdbctemplate的大部分方法都和上面类似, 参数列表的最右边经常是一个可变参。
批量更新
@test public void batchinsert() { string sql = "insert into pass_user (name,age,gender,birthday,create_time,update_time) values (?,?,?,?,?,?)"; list<object[]> args = new arraylist<>(); for (int i = 0; i < 5; i++) { args.add(new object[]{"张三丰", 18, "male", instant.now().toepochmilli(), instant.now().toepochmilli(), instant.now().toepochmilli()}); } jdbctemplate.batchupdate(sql, args); }
获取count、sum等聚合函数返回的唯一值
/** * 只能接受string,integer这种单列类型的实体,否则汇报异常 */ @test public void queryforcount1() { string sql = "select count(1) from pass_user where id > ?"; integer count = jdbctemplate.queryforobject(sql, integer.class, 300000); logger.info("[" + thread.currentthread().getstacktrace()[1].getmethodname() + "] {}", count); }
在jdbctemplate中 queryforobject() 方法的文档说明中, 指定了该方法只能接受单个记录的某一列值, 否则报 incorrectresultsizedataaccessexception 异常。
获取单个记录的某一列值
/** * 只能接受string,integer这种单列类型的实体,否则汇报异常 */ @test public void queryforobject1() { string sql = "select name from pass_user where id = ?"; string name = jdbctemplate.queryforobject(sql, string.class, 30);//查询结果空集时会报emptyresultdataaccessexception异常 logger.info("[" + thread.currentthread().getstacktrace()[1].getmethodname() + "] {}", name); }
另外 queryforobject() 方法在查询结果集为空集也就是null值时, 会报 emptyresultdataaccessexception 异常。
获取单个记录的所有列值
通过rowmapper映射, 我们可以通过 queryforobject() 方法获取单个记录的所有列值, 映射方法有两种。
如下, passuser实体类不用实现rowmapper接口, 但是实体类的属性名必须和表中的列名符合驼峰命名匹配,能一一对应起来, 如果两者不一致,则需要在sql语句中给对应的列取一个别名。
public class passuser { private long id; private string name; private integer age; private string gender; private long birthday; private long createtime; private long updatetime; public long getid() { return id; } public void setid(long id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public integer getage() { return age; } public void setage(integer age) { this.age = age; } public string getgender() { return gender; } public void setgender(string gender) { this.gender = gender; } public long getbirthday() { return birthday; } public void setbirthday(long birthday) { this.birthday = birthday; } public long getcreatetime() { return createtime; } public void setcreatetime(long createtime) { this.createtime = createtime; } public long getupdatetime() { return updatetime; } public void setupdatetime(long updatetime) { this.updatetime = updatetime; } @override public string tostring() { return "passuser{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + ", birthday=" + birthday + ", createtime=" + createtime + ", updatetime=" + updatetime + '}'; } }
/** * 可以自动进行驼峰匹配 */ @test public void queryforobject2() { string sql = "select * from pass_user where id = ?"; rowmapper<passuser> rowmapper = new beanpropertyrowmapper<>(passuser.class); passuser passuser = jdbctemplate.queryforobject(sql, rowmapper, 180);//查询结果空集时会报emptyresultdataaccessexception异常 logger.info("[" + thread.currentthread().getstacktrace()[1].getmethodname() + "] {}", passuser); }
第二种方式需要实体类实现rowmapper接口,覆写 maprow() 方法
public class userentity implements rowmapper<userentity> { private long id; private string name; private integer age; private string gender; private long birthday; private long createtime; private long updatetime; public long getid() { return id; } public void setid(long id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public integer getage() { return age; } public void setage(integer age) { this.age = age; } public string getgender() { return gender; } public void setgender(string gender) { this.gender = gender; } public long getbirthday() { return birthday; } public void setbirthday(long birthday) { this.birthday = birthday; } public long getcreatetime() { return createtime; } public void setcreatetime(long createtime) { this.createtime = createtime; } public long getupdatetime() { return updatetime; } public void setupdatetime(long updatetime) { this.updatetime = updatetime; } @override public string tostring() { return "userentity{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + ", birthday=" + birthday + ", createtime=" + createtime + ", updatetime=" + updatetime + '}'; } @override public userentity maprow(resultset rs, int rownum) throws sqlexception { userentity userentity = new userentity(); userentity.setname(rs.getstring("name")); userentity.setage(rs.getint("age")); userentity.setgender(rs.getstring("gender")); userentity.setbirthday(rs.getlong("birthday")); userentity.setcreatetime(rs.getlong("create_time")); userentity.setupdatetime(rs.getlong("update_time")); return userentity; } }
/** * 实体类需要实现接口,覆写方法 */ @test public void queryforobject3() { string sql = "select * from pass_user where id = ?"; userentity userentity = jdbctemplate.queryforobject(sql, new userentity(), 180);//查询结果空集时会报emptyresultdataaccessexception异常 logger.info("[" + thread.currentthread().getstacktrace()[1].getmethodname() + "] {}", userentity); }
获取多个记录的某一列值
/** * 实体类需要实现接口,覆写方法 */ @test public void queryforlist1() { string sql = "select name from pass_user where id < ?"; list<string> names = jdbctemplate.queryforlist(sql, string.class, 50);//只能查询单列属性值集合 logger.info("[" + thread.currentthread().getstacktrace()[1].getmethodname() + "] {}", names); }
获取多个记录的所有列值
/** * 实体类需要实现接口,覆写方法 */ @test public void queryforlist2() { string sql = "select * from pass_user where id < ?"; list<userentity> userentitylist = jdbctemplate.query(sql, new userentity(), 0); logger.info("[" + thread.currentthread().getstacktrace()[1].getmethodname() + "] {}", userentitylist); }
推荐阅读
-
Spring JdbcTemplate之使用详解
-
Vue.js实战之使用Vuex + axios发送请求详解
-
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
-
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
-
详解Spring mvc ant path的使用方法
-
Spring quartz Job依赖注入使用详解
-
Spring MVC之DispatcherServlet详解_动力节点Java学院整理
-
Linux三剑客之awk命令使用详解
-
详解Spring Data JPA使用@Query注解(Using @Query)
-
详解Spring Boot配置使用Logback进行日志记录的实战