Spring DAO

@Repository("mysqlDao")
public class MysqlDao {

	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	protected int add(String sql,Object[]params){
		System.out.println("[sql]"+sql);
		return jdbcTemplate.update(sql, params);
	}
	protected int update(String sql,Object[]params){
		System.out.println("[sql]"+sql);
		return jdbcTemplate.update(sql, params);
	}
	/**
	 * 插入
	 * @param table
	 * @param map
	 * @return 返回更新条数
	 */
	public int add(String table,Map<String, Object> map){
		if (map==null) {
			return 0;
		}
		List<String> fields_list = new ArrayList<String>();
		List<Object> values_list = new ArrayList<Object>();
		
		Set<String> fields = map.keySet();
		for (String field : fields) {
			Object value = map.get(field);
			if (value!=null) {
				fields_list.add(field);
				values_list.add(value);
			}
		}
		if (fields_list.size()>0) {
			String sql_fields = StringUtil.listToString(fields_list, ",");
			String sql_questions = StringUtil.loop("?", fields_list.size(), ",");
			Object[] sql_values = values_list.toArray();
			
			StringBuffer sql_sb = new StringBuffer();
			sql_sb.append("insert into "+table+"(");
			sql_sb.append(sql_fields);
			sql_sb.append(") values (");
			sql_sb.append(sql_questions);
			sql_sb.append(")");
			String sql = sql_sb.toString();
			System.out.println("[sql]"+sql);
			return jdbcTemplate.update(sql, sql_values);
			
		}else {
			return 0;
		}
	}
	/**
	 * 插入
	 * @param table
	 * @param map
	 * @return 返回id
	 */
	public long addForID(String table,Map<String, Object> map){
		if (map==null) {
			return 0;
		}
		List<String> fields_list = new ArrayList<String>();
		List<Object> values_list = new ArrayList<Object>();
		
		Set<String> fields = map.keySet();
		for (String field : fields) {
			Object value = map.get(field);
			if (value!=null) {
				fields_list.add(field);
				values_list.add(value);
			}
		}
		if (fields_list.size()>0) {
			String sql_fields = StringUtil.listToString(fields_list, ",");
			String sql_questions = StringUtil.loop("?", fields_list.size(), ",");
			Object[] sql_values = values_list.toArray();
			
			StringBuffer sql_sb = new StringBuffer();
			sql_sb.append("insert into "+table+"(");
			sql_sb.append(sql_fields);
			sql_sb.append(") values (");
			sql_sb.append(sql_questions);
			sql_sb.append(")");
			String sql = sql_sb.toString();
			System.out.println("[sql]"+sql);
			//----------
			KeyHolder keyHolder = new GeneratedKeyHolder();  
			final String _sql = sql;
			final Object[] params_sql =  sql_values;
			int updatecount = jdbcTemplate.update(new PreparedStatementCreator() {  
			    public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {  
			        PreparedStatement ps = connection.prepareStatement(_sql, Statement.RETURN_GENERATED_KEYS);
			        for (int i = 0; i < params_sql.length; i++) {
						ps.setObject(i+1, params_sql[i]);
					}
			        return ps;
			    }
			}, keyHolder);
			if (updatecount>0) {
				long id = keyHolder.getKey().longValue();
				return id;
			}else {
				return 0;
			}
//			return jdbcTemplate.update(sql, sql_values);
			
		}else {
			return 0;
		}
	}
	/**
	 * 修改
	 * @param table
	 * @param map
	 * @param id
	 */
	public int update(String table,Map<String, Object> map,Object id){
		if (map==null) {
			return 0;
		}
		List<String> fields_list = new ArrayList<String>();
		List<Object> values_list = new ArrayList<Object>();
		
		Set<String> fields = map.keySet();
		for (String field : fields) {
			Object value = map.get(field);
			if (value!=null) {
				String field2 = field+" = ?"; 
				fields_list.add(field2);
				values_list.add(value);
			}
		}
		if (fields_list.size()>0) {
			String sql_fields = StringUtil.listToString(fields_list, ",");
			
			StringBuffer sql_sb = new StringBuffer();
			sql_sb.append("update "+table+" set ");
			sql_sb.append(sql_fields);
			sql_sb.append(" where id = ? ");
			String sql = sql_sb.toString();
			
			values_list.add(id);
			Object[] sql_values = values_list.toArray();
			System.out.println("[sql]"+sql);
			return jdbcTemplate.update(sql, sql_values);
			
		}else {
			return 0;
		}
	}
	protected int delete(String sql,Object[]params){
		System.out.println("[sql]"+sql);
		return jdbcTemplate.update(sql, params);
	}
	protected int delete(String table,int id){
		String sql = "delete from "+table+ " where id = ? ";
		System.out.println("[sql]"+sql);
		return jdbcTemplate.update(sql, id);
	}
	protected int[] batchUpdate(String sql,List<Object[]> params){
		final List<Object[]> args = params;
		
		BatchPreparedStatementSetter batchParams = new BatchPreparedStatementSetter() {
			
			public void setValues(PreparedStatement ps, int i) throws SQLException {
				Object[]param=args.get(i);
				for (int j = 0; j < param.length; j++) {
					ps.setObject(j+1, param[j]);
				}
			}
			public int getBatchSize() {
				
				return args.size();
			}
		};
		System.out.println("[sql]"+sql);
		return jdbcTemplate.batchUpdate(sql, batchParams);
		
	}
	protected int[] batchDelete(String sql,List<Object[]> params){
		final List<Object[]> args = params;
		
		BatchPreparedStatementSetter batchParams = new BatchPreparedStatementSetter() {
			
			public void setValues(PreparedStatement ps, int i) throws SQLException {
				Object[]param=args.get(i);
				for (int j = 0; j < param.length; j++) {
					ps.setObject(j+1, param[j]);
				}
			}
			public int getBatchSize() {
				
				return args.size();
			}
		};
		System.out.println("[sql]"+sql);
		return jdbcTemplate.batchUpdate(sql, batchParams);
		
	}
	protected int queryCount(String sql,Object[]params){
		System.out.println("[sql]"+sql);
		return jdbcTemplate.queryForInt(sql,params);
	}
	protected List<Map<String, Object>> queryBySql(String sql,Object[]params){
		System.out.println("[sql]"+sql);
		return jdbcTemplate.queryForList(sql, params);
	}
	protected Map<String, Object> queryOneBySql(String sql,Object[]params){
		System.out.println("[sql]"+sql);
		return jdbcTemplate.queryForMap(sql, params);
	}
	protected int getLastId(){
		String sql_lastId = "select LAST_INSERT_ID()";
		return jdbcTemplate.queryForInt(sql_lastId);
	}

}

 

<think>好的,我现在需要回答用户关于Spring DAO实现和最佳实践的问题。首先,我得回想一下Spring DAO的核心概念。记得Spring DAO主要是为了简化数据访问层的开发,提供了统一的异常处理和数据访问模板。比如,JdbcTemplate就是常用的工具之一,能减少很多样板代码。 接下来要分步骤解释。首先应该介绍Spring DAO的模块,比如属于Spring Framework的哪个部分,支持哪些技术,比如JDBC、Hibernate、JPA等。然后需要提到异常处理,Spring将特定于持久化技术的异常转换成统一的DataAccessException,这样业务层就不需要处理各种不同的异常了。 然后是数据访问模板,比如JdbcTemplate的使用方法,举一个例子,比如查询数据或者插入数据。这部分要确保代码示例正确,符合用户的格式要求,使用代码块包裹,并且语法正确。 接下来是事务管理,说明如何通过@Transactional注解来声明事务,以及配置事务管理器的重要性。可能需要提到如何在Spring Boot中自动配置事务管理器,比如使用PlatformTransactionManager的不同实现。 最佳实践部分要包括几个方面:使用JdbcTemplate简化操作,避免原生JDBC的繁琐;异常处理的最佳方式,比如捕获DataAccessException;事务管理的建议,比如在服务层使用事务;还有分层架构的重要性,保持DAO层独立。 然后生成相关问题,需要结合用户之前提供的引用内容。比如用户提到了水平分库的配置,引用[2]里提到根据业务ID分库,避免跨库关联。所以相关问题可以涉及分库分表时如何结合Spring DAO,或者如何优化Spring DAO的性能,事务在分库场景下的处理等。 另外,用户提供的引用[1]提到SpringSource认证的代码和配置,可能需要在最佳实践中提到遵循官方推荐配置,确保代码的可维护性和性能。 需要检查是否符合用户的所有格式要求,比如行内数学表达式用$...$,独立公式用$$...$$,但这个问题可能不涉及数学公式,所以可能不需要。但如果有提到版本号或类似的地方,可能需要用正确的格式。 确保回答结构清晰,分点说明,每个部分有明确的标题,比如核心概念、实现方式、最佳实践。代码示例要正确,使用正确的语法,比如Java代码而不是之前的Python示例。同时,在引用用户提供的引用时,要在适当的位置添加引用标识,比如在提到分库分表时引用[^2]。 最后,生成的相关问题需要与Spring DAO相关,同时结合用户提供的引用内容,比如分库分表的实现、事务管理优化、异常处理等。确保问题有针对性,能够引导用户进一步学习。</think>### Spring DAO实现与最佳实践 #### 1. Spring DAO核心概念 Spring DAO(Data Access Object)是Spring框架中用于简化数据访问层(DAL)开发的模块,核心目标是**解耦业务逻辑与数据访问逻辑**,并提供统一的异常处理机制。例如: - **统一异常体系**:将JDBC、Hibernate等技术的特定异常(如`SQLException`)转换为`DataAccessException`,开发者无需处理底层差异[^1]。 - **模板模式**:通过`JdbcTemplate`、`HibernateTemplate`等工具类封装重复操作(如连接管理、异常处理)。 #### 2. 实现方式 ##### 2.1 使用JdbcTemplate ```java @Repository public class UserDao { @Autowired private JdbcTemplate jdbcTemplate; public User getUserById(Long id) { return jdbcTemplate.queryForObject( "SELECT * FROM users WHERE id = ?", new Object[]{id}, (rs, rowNum) -> new User(rs.getString("name"), rs.getInt("age")) ); } } ``` 此代码通过`JdbcTemplate`简化了JDBC查询,自动处理资源释放与异常转换。 ##### 2.2 事务管理 通过声明式事务(`@Transactional`)确保操作原子性: ```java @Service public class UserService { @Autowired private UserDao userDao; @Transactional public void updateUser(User user) { userDao.update(user); } } ``` 需配置事务管理器(如`DataSourceTransactionManager`)[^1]。 #### 3. 最佳实践 1. **优先使用JdbcTemplate**:避免原生JDBC的冗余代码,减少资源泄漏风险。 2. **异常处理策略**:捕获`DataAccessException`并记录日志,而非直接暴露底层异常。 3. **事务边界控制**:事务注解应作用于服务层方法,而非DAO层。 4. **分库分表兼容性**:在水平分库场景中,通过业务ID路由数据源,保持DAO层无感知。 5. **依赖注入**:通过`@Repository`标注DAO类,利用Spring的组件扫描与依赖注入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值