NamedJdbcTemplate 使用方法

本文通过一个具体的例子展示了如何使用 Spring 框架中的 JDBC 模块进行数据库操作,包括插入记录和查询记录。重点介绍了 NamedParameterJdbcTemplate 的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package cn.itcast.jdbc.spring;

import java.util.HashMap;
import java.util.Map;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

import cn.itcast.jdbc.JdbcUtils;
import cn.itcast.jdbc.domain.User;


public class NamedJdbcTemplate {
	static NamedParameterJdbcTemplate named = new NamedParameterJdbcTemplate(
			JdbcUtils.getDataSource());

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		User user = new User();
		user.setMoney(10);
		user.setId(2);
		System.out.println(findUser1(user));
	}

	static void addUser(User user) {
		String sql = "insert into user(name,birthday, money) values (:name,:birthday,:money) ";
		SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
		KeyHolder keyHolder = new GeneratedKeyHolder();
		named.update(sql, ps, keyHolder);
		int id = keyHolder.getKey().intValue();
		user.setId(id);
		
		Map map = keyHolder.getKeys();
	}

	static User findUser(User user) {
		String sql = "select id, name, money, birthday  from user "
				+ "where money > :m and id < :id";
		Map params = new HashMap();
		// params.put("n", user.getName());
		params.put("m", user.getMoney());
		params.put("id", user.getId());
		Object u = named.queryForObject(sql, params, new BeanPropertyRowMapper(
				User.class));
		return (User) u;
	}

	static User findUser1(User user) {
		String sql = "select id, name, money, birthday  from user "
				+ "where money > :money and id < :id";
		SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
		Object u = named.queryForObject(sql, ps, new BeanPropertyRowMapper(
				User.class));
		return (User) u;
	}

}

public class TBUSSLD { /** * 项目部号 */ private String xmbCode; /** * 次号 */ private Integer xmbNum; /** * 结算期 */ private String sysJsq; /** * 单据编号 */ private String sldDjbh; /** * 物资分类 */ private String gsflCode; /** * 分类名称 */ private String gsflName; /** * 预验标志 */ private String sldYybz; /** * Sld Dkbz */ private String sldDkbz; /** * Sld Yfbz */ private String sldYfbz; /** * 发生日期 */ private Date sldFsrq; /** * 单据状态 */ private String sldDjzt; /** * 记账日期 */ private Date sldJzrq; /** * 记账人 */ private String sldJzr; /** * 仓库编号 */ private String ckCode; /** * 仓库名称 */ private String ckName; /** * 供应方式编号 */ private String gyfsCode; /** * 供应方式名称 */ private String gyfsName; /** * 对方项目部号 */ private String dfxmbCode; /** * 对方调拨单号 */ private String dfdbdCode; /** * 供应商编号 */ private String gysCode; /** * 供应商名称 */ private String gysName; /** * 供应合同号 */ private String gyhtCode; /** * 来料凭证名称 */ private String sldLlpzmc; /** * 来料凭证编号 */ private String sldLlpzbh; /** * Sld Fdjsl */ private String sldFdjsl; /** * 送检标志 */ private String sldSjbz; /** * Sjd Djbh */ private String sjdDjbh; /** * 招标标准 */ private String sldZbbz; /** * 招标类型 */ private String zblxCode; /** * 招标类型名称 */ private String zblxName; /** * 采购员 */ private String sldCgy; /** * 收料员 */ private String sldSlr; /** * 操作员 */ private String sldCzy; /** * 操作时间 */ private Date sldCzsj; /** * 备注 */ private String sldMemo; /** * Sys Autoup */ private String sysAutoup; } 将 return namedJdbcTemplate.query(sql, params, new RowMapper<TBUSSLD>() { @Override public TBUSSLD mapRow(ResultSet rs, int rowNum) throws SQLException { TBUSSLD entity = new TBUSSLD(); entity.setSldDjbh(rs.getString("SLD_DJBH")); // 映射其他字段... return entity; }补充完整
最新发布
07-31
<think>我们需要根据提供的TBUSSLD类,将RowMapper中的字段映射补充完整。注意:实体类中的字段名与数据库中的列名可能不完全一致(例如大小写差异或命名习惯),因此需要根据数据库实际列名进行映射。 假设数据库表T_BUS_SLD的列名与实体类字段的对应关系如下(根据实体类注释和常见映射规则): 实体类字段名(驼峰命名) -> 数据库列名(通常为大写下划线分割) 例如: xmbCode -> XMB_CODE xmbNum -> XMB_NUM ... 以此类推 但是,请注意:实体类中的字符串字段如sldDjbh对应数据库列名可能是SLD_DJBH(根据之前SQL中的字段名推断)。 由于实体类字段较多,我们将逐一映射。同时,注意日期类型字段(如sldFsrq, sldJzrq, sldCzsj)需要使用rs.getDate或rs.getTimestamp。 另外,有些字段在实体类中是String类型,但在数据库中可能是CHAR或VARCHAR,使用rs.getString即可。 下面补充完整的RowMapper实现:</think>根据您提供的 `TBUSSLD` 实体类结构,以下是完整的 `RowMapper` 实现,包含所有字段的映射: ```java return namedJdbcTemplate.query(sql, params, new RowMapper<TBUSSLD>() { @Override public TBUSSLD mapRow(ResultSet rs, int rowNum) throws SQLException { TBUSSLD entity = new TBUSSLD(); // 字符串类型字段 entity.setXmbCode(rs.getString("XMB_CODE")); entity.setSysJsq(rs.getString("SYS_JSQ")); entity.setSldDjbh(rs.getString("SLD_DJBH")); entity.setGsflCode(rs.getString("GSFL_CODE")); entity.setGsflName(rs.getString("GSFL_NAME")); entity.setSldYybz(rs.getString("SLD_YYBZ")); entity.setSldDkbz(rs.getString("SLD_DKBZ")); entity.setSldYfbz(rs.getString("SLD_YFBZ")); entity.setSldDjzt(rs.getString("SLD_DJZT")); entity.setSldJzr(rs.getString("SLD_JZR")); entity.setCkCode(rs.getString("CK_CODE")); entity.setCkName(rs.getString("CK_NAME")); entity.setGyfsCode(rs.getString("GYFS_CODE")); entity.setGyfsName(rs.getString("GYFS_NAME")); entity.setDfxmbCode(rs.getString("DFXMB_CODE")); entity.setDfdbdCode(rs.getString("DFDBD_CODE")); entity.setGysCode(rs.getString("GYS_CODE")); entity.setGysName(rs.getString("GYS_NAME")); entity.setGyhtCode(rs.getString("GYHT_CODE")); entity.setSldLlpzmc(rs.getString("SLD_LLPZMC")); entity.setSldLlpzbh(rs.getString("SLD_LLPZBH")); entity.setSldFdjsl(rs.getString("SLD_FDJSL")); entity.setSldSjbz(rs.getString("SLD_SJBZ")); entity.setSjdDjbh(rs.getString("SJD_DJBH")); entity.setSldZbbz(rs.getString("SLD_ZBBZ")); entity.setZblxCode(rs.getString("ZBLX_CODE")); entity.setZblxName(rs.getString("ZBLX_NAME")); entity.setSldCgy(rs.getString("SLD_CGY")); entity.setSldSlr(rs.getString("SLD_SLR")); entity.setSldCzy(rs.getString("SLD_CZY")); entity.setSldMemo(rs.getString("SLD_MEMO")); entity.setSysAutoup(rs.getString("SYS_AUTOUP")); // 整数类型字段 entity.setXmbNum(rs.getInt("XMB_NUM")); // 处理可能的null值 if (rs.wasNull()) { entity.setXmbNum(null); } // 日期类型字段(使用getTimestamp获取日期时间) entity.setSldFsrq(rs.getTimestamp("SLD_FSRQ")); entity.setSldJzrq(rs.getTimestamp("SLD_JZRQ")); entity.setSldCzsj(rs.getTimestamp("SLD_CZSJ")); return entity; } }); ``` ### 关键实现细节说明: 1. **日期类型处理**: - 使用 `getTimestamp()` 而非 `getDate()` 获取日期时间字段 - 原因:`getDate()` 只返回日期部分(丢失时间),而 `getTimestamp()` 保留完整的日期时间信息 - 如果数据库字段是纯日期类型(无时间),可改用 `getDate()` 2. **空值处理**: - 字符串类型:`rs.getString()` 在数据库值为 NULL 时返回 null,无需额外处理 - 整数类型:使用 `rs.wasNull()` 检查读取值是否为 NULL ```java entity.setXmbNum(rs.getInt("XMB_NUM")); if (rs.wasNull()) { entity.setXmbNum(null); // 将基本类型转为包装类null } ``` 3. **字段映射规范**: - 数据库列名使用大写形式(如 `XMB_CODE`),符合SQL Server系统表存储惯例 - 实体类属性使用驼峰命名(如 `xmbCode`),符合Java编码规范 - 确保列名与数据库实际字段名完全一致(包括大小写和下划线) 4. **性能优化建议**: ```java // 使用BeanPropertyRowMapper简化(需字段名匹配) return namedJdbcTemplate.query( sql, params, new BeanPropertyRowMapper<>(TBUSSLD.class) { @Override protected Object getColumnValue(ResultSet rs, int index, String column) throws SQLException { // 特殊处理日期字段 if ("SLD_FSRQ".equalsIgnoreCase(column) || "SLD_JZRQ".equalsIgnoreCase(column) || "SLD_CZSJ".equalsIgnoreCase(column)) { return rs.getTimestamp(column); } return super.getColumnValue(rs, index, column); } } ); ``` ### 注意事项: 1. **列名一致性**:确保SQL查询中的列名(如 `XMB_CODE`)与数据库实际列名完全一致 2. **时区处理**:若涉及跨时区应用,在获取 `Timestamp` 后需转换为合适的时区 3. **大字段优化**:对于大文本字段(如 `SLD_MEMO`),若数据量过大可考虑使用 `getCharacterStream()` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值