Spring JDBC 框架中, 绑定 SQL 参数的另一种选择:具名参数(named parameter)
使用spring的jdbcTemplate-----使用具名参数
在JDBC用法中,SQL参数是用占位符?表示,并且受到位置的限制,定位参数的问题在于,一旦参数的位置发生变化,必须改变参数的绑定,在Spring JDBC中,绑定SQL参数的另一种选择是使用具名参数,SQL具名参数是按照名称绑定,而不是位置绑定。
什么是具名参数?
具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代
具名参数只在 NamedParameterJdbcTemplate 中得到支持。(SImpleJdbcTemplate已过时了)
NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干,NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能。
如何配置?
applicationContext.xml里的配置
<!-- 配置jdbc模板类 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!-- 配置 NamedParameterJdbcTemplate,该对象可以使用具名参数。但它没有无参构造器,所以必须为其制定构造参数,这里指定的是出c3p0数据源--><bean id="namedParameterJdbcTemplate"class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"><constructor-arg ref="dataSource"></constructor-arg></bean>
实例:
public class BaseService {// JdbcTemplate 对象作为构造器参数初始化 @Autowiredprotected NamedParameterJdbcTemplate namedParameterJdbcTemplate;/*** 数据查询* * @param sql* @param object* @return*/@SuppressWarnings("rawtypes")public List<?> query(String sql, Object object) {// BeanPropertySqlParameterSource封装了一个JavaBean对象,通过JavaBean对象属性来决定命名参数的值SqlParameterSource source = new BeanPropertySqlParameterSource(object);@SuppressWarnings("unchecked")// BeanPropertyRowMapper自动将一行数据映射到指定类的实例中 它首先将这个类实例化,然后通过名称匹配的方式,映射到属性中去List<?> list = namedParameterJdbcTemplate.query(sql, source, new BeanPropertyRowMapper(object.getClass()));return list;}/*** 数据添加、删除、修改* * @param sql* @param object* @return*/@SuppressWarnings("unchecked")public int excute(String sql, Object object) {if (object != null) {// 判断类型if (object instanceof Map) {return namedParameterJdbcTemplate.update(sql, (Map<String, ?>) object);} else {BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(object);// 返回对象return namedParameterJdbcTemplate.update(sql, source);}} else {return namedParameterJdbcTemplate.getJdbcOperations().update(sql);}}/*** 查询记录数* * @param sql* @param object* @return*/public int queryCount(String sql, Object object) {BeanPropertySqlParameterSource source = null;if (object != null) {source = new BeanPropertySqlParameterSource(object);}return namedParameterJdbcTemplate.queryForObject(sql, source, Integer.class);}}
NamedParameterJdbcTemplate类是基于JdbcTemplate类,并对它进行了封装从而支持命名参数特性。
NamedParameterJdbcTemplate主要提供以下三类方法:execute方法、query及queryForXXX方法、update及batchUpdate方法。
1)NamedParameterJdbcTemplate初始化:可以使用DataSource或JdbcTemplate 对象作为构造器参数初始化;
2)insert into test(name) values(:name):其中“:name”就是命名参数;
3) update(insertSql, paramMap):其中paramMap是一个Map类型,包含键为“name”,值为“name5”的键值对,也就是为命名参数设值的数据;
4)query(selectSql, paramMap, new RowCallbackHandler()……):类似于JdbcTemplate中介绍的,唯一不同是需要传入paramMap来为命名参数设值;
5)update(deleteSql, paramSource):类似于“update(insertSql, paramMap)”,但使用SqlParameterSource参数来为命名参数设值,此处使用MapSqlParameterSource实现,其就是简单封装java.util.Map。
NamedParameterJdbcTemplate类为命名参数设值有两种方式:java.util.Map和SqlParameterSource:
1)java.util.Map:使用Map键数据来对于命名参数,而Map值数据用于设值;
2)SqlParameterSource:可以使用SqlParameterSource实现作为来实现为命名参数设值,默认有MapSqlParameterSource和BeanPropertySqlParameterSource实现;MapSqlParameterSource实现非常简单,只是封装了java.util.Map;而BeanPropertySqlParameterSource封装了一个
JavaBean对象,通过JavaBean对象属性来决定命名参数的值。
/*** 用户 服务类接口实现*/ @Service public class IUserServiceImpl extends BaseService implements IUserService {public final static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(IUserServiceImpl.class);/*** 查询用户*/@Overridepublic Object queryUser(String sql, Object object) {User user = new User();sql = "select suser as username,spassword as password,tcreatetime as createtime,cisenabled as enabled,cauthorize as authorize from sys_user"; // String sqls = "select suser as username,spassword as password,tcreatetime as createtime,cisenabled as enabled,cauthorize as authorize from sys_user where suser like '%:username%'";// 替换掉sql语句的条件// sqls = sqls.replace(":username", user.getUsername());@SuppressWarnings("unchecked")List<User> list = (List<User>) query(sql, user);return list;}/*** 添加用户*/@Overridepublic MsgBean addUser(User user) {MsgBean msg = new MsgBean();try {String sql = " insert into sys_user (suser,spassword,tcreatetime,cisenabled,cauthorize) values(:username,:password,:createtime,:enabled,:authorize)";// 添加新用户是自动取得时间// user.setCreatetime(DateUtil.getCurDate(null)); excute(sql, user);msg.setFlag(true);msg.setText("ok");} catch (Exception e) {logger.error("出错的原因。。。" + e.getMessage());}return msg;} /*** 修改用户*/@Overridepublic MsgBean updateUser(User user) {MsgBean msg = new MsgBean();try {String sql = " update sys_user set spassword=:password,tcreatetime=:createtime,cisenabled=:enabled,cauthorize=:authorize where suser=:username";excute(sql, user);msg.setFlag(true);msg.setText("ok");} catch (Exception e) {logger.error("出错的原因。。。" + e.getMessage());}return msg;} /*** 删除用户*/@Overridepublic MsgBean deleteUser(String username) {MsgBean msg = new MsgBean();try {String sql = "delete from sys_user where suser =':username'";if (username != null && username.length() != 0) {sql = sql.replace(":username", username);}else {msg.setFlag(false);msg.setText("未知原因,删除失败");return msg;}excute(sql, null);msg.setFlag(true);msg.setText("ok");} catch (Exception e) {logger.error("出错的原因。。。" + e.getMessage());}return msg;} }
User是用户实体类,MsgBean工具实体类里面有flag和text两个参数,又来输出信息的
/*** 用户控制层*/ @Controller public class UserController {private static final Log logger = LogFactory.getLog(UserController.class);@Autowiredprivate IUserService userService;/*** 用户查询* * @param request* @param response* @return*/@ResponseBody@RequestMapping("/queryuser")public Object queryUserList(HttpServletRequest request, HttpServletResponse response) {User user = new User();// 模糊查询传来的值// String username = request.getParameter("username");// // 判断字符串是否为空// if (StringUtil.isBlank(username)) {// // 若为空替换为空字符串// username = "";// }// user.setUsername(username); Object obj = userService.queryUser(null, user);return obj;}/*** 用户添加* * @param user* @return*/@ResponseBody@RequestMapping("/adduser")public MsgBean addUser(User user) {MsgBean msg = null;try {msg = userService.addUser(user);} catch (Exception e) {logger.error("出错的原因 :" + e.getMessage());}return msg;}/*** 用户修改* * @param user* @return*/@ResponseBody@RequestMapping("/updateuser")public MsgBean updateUser(User user) {MsgBean msg = null;try {msg = userService.updateUser(user);} catch (Exception e) {logger.error("出错的原因 :" + e.getMessage());}return msg;}/*** 用户删除* * @param username* @return*/@ResponseBody@RequestMapping("/deleteuser")public MsgBean deleteUser(@RequestParam("username") String username) {MsgBean msg = null;try {msg = userService.deleteUser(username);} catch (Exception e) {logger.error("出错的原因 :" + e.getMessage());}return msg;} }
上述代码写好后,可以运行,因为没有前端jsp文件,所以可以直接在访问的网址后面加上?然后打上参数
转载于:https://www.cnblogs.com/wzqkalil/p/5322360.html
Spring JDBC 框架中, 绑定 SQL 参数的另一种选择:具名参数(named parameter)相关推荐
- java具名参数_Spring JDBC 框架中, 绑定 SQL 参数的另一种选择:具名参数(named parameter)...
使用spring的jdbcTemplate-----使用具名参数 在JDBC用法中,SQL参数是用占位符?表示,并且受到位置的限制,定位参数的问题在于,一旦参数的位置发生变化,必须改变参数的绑定,在S ...
- 在Spring框架中使用SQL存储过程
Spring框架也支持对SQL存储过程的调用,SQL存储过程是一组预先定义好的SQL语句,并存储到数据库管理系统中,外部程序可以直接调用执行.本课主要讨论在Spring框架中应用程序如何调用MySQL ...
- 使用Spring JDBC框架连接并操作数据库
在前一篇博文JAVA通过JDBC连接并操作MySQL数据库中,我们知道如何通过JDBC连接并操作数据库,但是请看程序,整个程序连接数据库和关闭数据库占了很大一部分代码量,而且每次我们执行一下数据库操作 ...
- Spring JDBC 框架一个最简单的Hello World级别的例子
本地安装mySQL数据库社区版,如果不知道如何安装,可以查看我这篇文章: MySQL社区版的下载和安装 https://blog.csdn.net/i042416/article/details/10 ...
- Spring MVC框架中关于限制请求方式
在Spring MVC框架中,@RequestMapping注解的主要作用是配置请求路径,除此以外,还可以配置请求方式,例如: @RequestMapping(value = "/add-n ...
- Spring Boot框架中使用Jackson的处理总结
1.前言 通常我们在使用Spring Boot框架时,如果没有特别指定接口的序列化类型,则会使用Spring Boot框架默认集成的Jackson框架进行处理,通过Jackson框架将服务端响应的数据 ...
- spring security框架中在页面通过标签获取用户信息
2019独角兽企业重金招聘Python工程师标准>>> spring security框架中,通过<@sec.authentication property="nam ...
- iwebshop框架中如何处理SQL?
query 查询类标签(用于前端遍历) 实例: {query:name=goods} {$item['name']} {/query} 本人实际开发中书写代码应用: <php // 下面代码是放 ...
- 盘点 Spring Security 框架中的八大经典设计模式
上次有小伙伴建议,源码分析太枯燥了,要是能够结合设计模式一起来,这样更有助于大家理解 Spring Security 源码,同时还能复习一波设计模式. 因此松哥今天就试着整一篇,和大家来聊一聊 Spr ...
- 详解Spring Boot框架中的@Conditional系列注解
目录 1. @Conditional 注解 2. Spring boot 扩展 1) @ConditionalOnClass和@ConditionalOnMissingClass注解 2) @Cond ...
最新文章
- nginx win 启动关闭_windows下Nginx启动、关闭、重启bat工具
- 搜索引擎(Elasticsearch聚合分析)
- java读写excel文件poi_Java利用POI读写Excel文件工具类
- 理想汽车CEO李想深夜回应“水银事件”:百分百支持你去报案
- linux信任本地jar包,jar包在linux本地运行成功, 但是jenkins构建失败
- linux 判断某进程 前台还是后台,Linux进程管理——进程前后台(优先级)以及作业控制等...
- Android:应用宝省流量更新
- 3D打印经验分享导航
- MLA格式应该如何正确引用?
- 滴滴征战澳洲 全球“追击”优步
- B站视频怎么下载?提取视频文稿的简单方法!
- php加密---六种加密方式
- Elasticsearch-head插件安装
- 网卡超时实现机制 watchdog_timeo/ndo_tx_timeout
- Python xls转换为xlsx
- 计算机文档加密如何解锁,电脑提示文档已被administrator锁定怎么办
- windows7 中pkeyconfig.xrm-ms文件无法删除解决办法
- DeepBrain Chain 深脑链——将区块链与AI相结合的前沿科技
- 手游平台开发需要哪些人员配置?
- 微信小程序 java校园二手物品交易系统uniapp
热门文章
- FrameLayout AbsoluteLayout GridLayout用法及实例
- jmeter展示内存cpu_Jmeter监控服务器-CPU,Memory,Disk,Network性能指标
- 数值计算详细笔记(一):基础数学知识回顾
- 【数论】Concatenated Multiples【codeforces-Round #506-div3-D】
- 128.最长连续序列(力扣leetcode) 博主可答疑该问题
- cad.net 在cad2008引用了错误的com接口的dll导致出现了
- 微信小程序开发04-打造自己的UI库
- 关于个人电脑连不上公司svn服务器,显示拒绝访问的错误
- Duanxx的STM32学习:NVIC操作
- 矩阵快速乘法---代码