神刀安全网

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 对象作为构造器参数初始化     @Autowired     protected 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);      /**      * 查询用户      */     @Override     public 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;     }      /**      * 添加用户      */     @Override     public 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;     }      /**      * 修改用户      */     @Override     public 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;     }       /**      * 删除用户      */     @Override     public 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);      @Autowired     private 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文件,所以可以直接在访问的网址后面加上?然后打上参数

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » Spring JDBC 框架中, 绑定 SQL 参数的另一种选择:具名参数(named parameter)

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
分享按钮