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

使用spring的jdbcTemplate-----使用具名参数

在JDBC用法中,SQL参数是用占位符?表示,并且受到位置的限制,定位参数的问题在于,一旦参数的位置发生变化,必须改变参数的绑定,在Spring JDBC中,绑定SQL参数的另一种选择是使用具名参数,SQL具名参数是按照名称绑定,而不是位置绑定。

什么是具名参数?

具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代

具名参数只在 NamedParameterJdbcTemplate 中得到支持。(SImpleJdbcTemplate已过时了)

NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干,NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能。

如何配置?

applicationContext.xml里的配置

实例:

public classBaseService {//JdbcTemplate 对象作为构造器参数初始化

@AutowiredprotectedNamedParameterJdbcTemplate namedParameterJdbcTemplate;/*** 数据查询

*

*@paramsql

*@paramobject

*@return

*/@SuppressWarnings("rawtypes")public List>query(String sql, Object object) {//BeanPropertySqlParameterSource封装了一个JavaBean对象,通过JavaBean对象属性来决定命名参数的值

SqlParameterSource source = newBeanPropertySqlParameterSource(object);

@SuppressWarnings("unchecked")//BeanPropertyRowMapper自动将一行数据映射到指定类的实例中 它首先将这个类实例化,然后通过名称匹配的方式,映射到属性中去

List> list = namedParameterJdbcTemplate.query(sql, source, newBeanPropertyRowMapper(object.getClass()));returnlist;

}/*** 数据添加、删除、修改

*

*@paramsql

*@paramobject

*@return

*/@SuppressWarnings("unchecked")public intexcute(String sql, Object object) {if (object != null) {//判断类型

if (object instanceofMap) {return namedParameterJdbcTemplate.update(sql, (Map) object);

}else{

BeanPropertySqlParameterSource source= newBeanPropertySqlParameterSource(object);//返回对象

returnnamedParameterJdbcTemplate.update(sql, source);

}

}else{returnnamedParameterJdbcTemplate.getJdbcOperations().update(sql);

}

}/*** 查询记录数

*

*@paramsql

*@paramobject

*@return

*/

public intqueryCount(String sql, Object object) {

BeanPropertySqlParameterSource source= null;if (object != null) {

source= newBeanPropertySqlParameterSource(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对象属性来决定命名参数的值。

/*** 用户 服务类接口实现*/@Servicepublic class IUserServiceImpl extends BaseService implementsIUserService {public final static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(IUserServiceImpl.class);/*** 查询用户*/@OverridepublicObject queryUser(String sql, Object object) {

User user= newUser();

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 aspassword,tcreatetime ascreatetime,cisenabled as enabled,cauthorize as authorize fromsys_user where suser like '%:username%'";//替换掉sql语句的条件//sqls = sqls.replace(":username", user.getUsername());

@SuppressWarnings("unchecked")

List list = (List) query(sql, user);returnlist;

}/*** 添加用户*/@OverridepublicMsgBean addUser(User user) {

MsgBean msg= newMsgBean();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());

}returnmsg;

}

/*** 修改用户*/@OverridepublicMsgBean updateUser(User user) {

MsgBean msg= newMsgBean();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());

}returnmsg;

}

/*** 删除用户*/@OverridepublicMsgBean deleteUser(String username) {

MsgBean msg= newMsgBean();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("未知原因,删除失败");returnmsg;

}

excute(sql,null);

msg.setFlag(true);

msg.setText("ok");

}catch(Exception e) {

logger.error("出错的原因。。。" +e.getMessage());

}returnmsg;

}

}

User是用户实体类,MsgBean工具实体类里面有flag和text两个参数,又来输出信息的

/*** 用户控制层*/@Controllerpublic classUserController {private static final Log logger = LogFactory.getLog(UserController.class);

@AutowiredprivateIUserService userService;/*** 用户查询

*

*@paramrequest

*@paramresponse

*@return

*/@ResponseBody

@RequestMapping("/queryuser")publicObject queryUserList(HttpServletRequest request, HttpServletResponse response) {

User user= newUser();//模糊查询传来的值//String username = request.getParameter("username");// //判断字符串是否为空//if (StringUtil.isBlank(username)) {// //若为空替换为空字符串//username = "";//}//user.setUsername(username);

Object obj= userService.queryUser(null, user);

returnobj;

}/*** 用户添加

*

*@paramuser

*@return

*/@ResponseBody

@RequestMapping("/adduser")publicMsgBean addUser(User user) {

MsgBean msg= null;try{

msg=userService.addUser(user);

}catch(Exception e) {

logger.error("出错的原因 :" +e.getMessage());

}returnmsg;

}/*** 用户修改

*

*@paramuser

*@return

*/@ResponseBody

@RequestMapping("/updateuser")publicMsgBean updateUser(User user) {

MsgBean msg= null;try{

msg=userService.updateUser(user);

}catch(Exception e) {

logger.error("出错的原因 :" +e.getMessage());

}returnmsg;

}/*** 用户删除

*

*@paramusername

*@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());

}returnmsg;

}

}

上述代码写好后,可以运行,因为没有前端jsp文件,所以可以直接在访问的网址后面加上?然后打上参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值