使用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)相关推荐

  1. java具名参数_Spring JDBC 框架中, 绑定 SQL 参数的另一种选择:具名参数(named parameter)...

    使用spring的jdbcTemplate-----使用具名参数 在JDBC用法中,SQL参数是用占位符?表示,并且受到位置的限制,定位参数的问题在于,一旦参数的位置发生变化,必须改变参数的绑定,在S ...

  2. 在Spring框架中使用SQL存储过程

    Spring框架也支持对SQL存储过程的调用,SQL存储过程是一组预先定义好的SQL语句,并存储到数据库管理系统中,外部程序可以直接调用执行.本课主要讨论在Spring框架中应用程序如何调用MySQL ...

  3. 使用Spring JDBC框架连接并操作数据库

    在前一篇博文JAVA通过JDBC连接并操作MySQL数据库中,我们知道如何通过JDBC连接并操作数据库,但是请看程序,整个程序连接数据库和关闭数据库占了很大一部分代码量,而且每次我们执行一下数据库操作 ...

  4. Spring JDBC 框架一个最简单的Hello World级别的例子

    本地安装mySQL数据库社区版,如果不知道如何安装,可以查看我这篇文章: MySQL社区版的下载和安装 https://blog.csdn.net/i042416/article/details/10 ...

  5. Spring MVC框架中关于限制请求方式

    在Spring MVC框架中,@RequestMapping注解的主要作用是配置请求路径,除此以外,还可以配置请求方式,例如: @RequestMapping(value = "/add-n ...

  6. Spring Boot框架中使用Jackson的处理总结

    1.前言 通常我们在使用Spring Boot框架时,如果没有特别指定接口的序列化类型,则会使用Spring Boot框架默认集成的Jackson框架进行处理,通过Jackson框架将服务端响应的数据 ...

  7. spring security框架中在页面通过标签获取用户信息

    2019独角兽企业重金招聘Python工程师标准>>> spring security框架中,通过<@sec.authentication property="nam ...

  8. iwebshop框架中如何处理SQL?

    query 查询类标签(用于前端遍历) 实例: {query:name=goods} {$item['name']} {/query} 本人实际开发中书写代码应用: <php // 下面代码是放 ...

  9. 盘点 Spring Security 框架中的八大经典设计模式

    上次有小伙伴建议,源码分析太枯燥了,要是能够结合设计模式一起来,这样更有助于大家理解 Spring Security 源码,同时还能复习一波设计模式. 因此松哥今天就试着整一篇,和大家来聊一聊 Spr ...

  10. 详解Spring Boot框架中的@Conditional系列注解

    目录 1. @Conditional 注解 2. Spring boot 扩展 1) @ConditionalOnClass和@ConditionalOnMissingClass注解 2) @Cond ...

最新文章

  1. nginx win 启动关闭_windows下Nginx启动、关闭、重启bat工具
  2. 搜索引擎(Elasticsearch聚合分析)
  3. java读写excel文件poi_Java利用POI读写Excel文件工具类
  4. 理想汽车CEO李想深夜回应“水银事件”:百分百支持你去报案
  5. linux信任本地jar包,jar包在linux本地运行成功, 但是jenkins构建失败
  6. linux 判断某进程 前台还是后台,Linux进程管理——进程前后台(优先级)以及作业控制等...
  7. Android:应用宝省流量更新
  8. 3D打印经验分享导航
  9. MLA格式应该如何正确引用?
  10. 滴滴征战澳洲 全球“追击”优步
  11. B站视频怎么下载?提取视频文稿的简单方法!
  12. php加密---六种加密方式
  13. Elasticsearch-head插件安装
  14. 网卡超时实现机制 watchdog_timeo/ndo_tx_timeout
  15. Python xls转换为xlsx
  16. 计算机文档加密如何解锁,电脑提示文档已被administrator锁定怎么办
  17. windows7 中pkeyconfig.xrm-ms文件无法删除解决办法
  18. DeepBrain Chain 深脑链——将区块链与AI相结合的前沿科技
  19. 手游平台开发需要哪些人员配置?
  20. 微信小程序 java校园二手物品交易系统uniapp

热门文章

  1. FrameLayout AbsoluteLayout GridLayout用法及实例
  2. jmeter展示内存cpu_Jmeter监控服务器-CPU,Memory,Disk,Network性能指标
  3. 数值计算详细笔记(一):基础数学知识回顾
  4. 【数论】Concatenated Multiples【codeforces-Round #506-div3-D】
  5. 128.最长连续序列(力扣leetcode) 博主可答疑该问题
  6. cad.net 在cad2008引用了错误的com接口的dll导致出现了
  7. 微信小程序开发04-打造自己的UI库
  8. 关于个人电脑连不上公司svn服务器,显示拒绝访问的错误
  9. Duanxx的STM32学习:NVIC操作
  10. 矩阵快速乘法---代码