`
finally_m
  • 浏览: 69644 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模拟Spring的JdbcTemplate实现DAO

阅读更多

通常情况下,普通DAO的实现大概是这样的:

 

1、实体类:

public class Emp {
	private Integer id;
	private String name;
	private String sex;
	private Float sal;
                //getter and setter methods...
}

 2、DAO接口:

public interface EmpDAO {
	public int insert(Emp emp)throws SQLException;
	public int delete(Emp emp)throws SQLException;
	public int update(Emp emp)throws SQLException;
	public Emp findById(Emp emp)throws SQLException;
	public String findName(Emp emp)throws SQLException;
}

 

3、DAO实现类:

public class EmpDAOImpl implements EmpDAO {
	public int delete(Emp emp) throws SQLException {
		String sql = "delete from emp where id=?";
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = DBUtil.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, emp.getId());
			return ps.executeUpdate();
		} catch (SQLException e) {
			throw e;
		} finally {
			DBUtil.close(null, ps, conn);
		}
	}
	public Emp findById(Emp emp) throws SQLException {
		String sql = "select id,name,sal,sex from emp where id=?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		Emp currEmp = null;

		try {
			conn = DBUtil.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, emp.getId());
			rs = ps.executeQuery();
			if (rs.next()) {
				currEmp = new Emp();
				currEmp.setId(rs.getInt("id"));
				currEmp.setName(rs.getString("name"));
				currEmp.setSal(rs.getFloat("sal"));
				currEmp.setSex(rs.getString("sex"));
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			DBUtil.close(rs, ps, conn);
		}
		return currEmp;
	}
	public String findName(Emp emp) throws SQLException {
		String sql = "select name from emp where id=?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String name = null;
		try {
			conn = DBUtil.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, emp.getId());
			rs = ps.executeQuery();
			if (rs.next()) {
				name = rs.getString("name");
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			DBUtil.close(rs, ps, conn);
		}
		return name;

	}
	public int insert(Emp emp) throws SQLException {
		String sql = "insert into emp(name,sal,sex) values(?,?,?)";
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = DBUtil.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setString(1, emp.getName());
			ps.setFloat(2, emp.getSal());
			ps.setString(3, emp.getSex());
			return ps.executeUpdate();
		} catch (SQLException e) {
			throw e;
		} finally {
			DBUtil.close(null, ps, conn);
		}
	}
	public int update(Emp emp) throws SQLException {
		String sql = "update emp set name=?,sal=?,sex=? where id=?";
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = DBUtil.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setString(1, emp.getName());
			ps.setFloat(2, emp.getSal());
			ps.setString(3, emp.getSex());
			ps.setInt(4, emp.getId());
			return ps.executeUpdate();
		} catch (SQLException e) {
			throw e;
		} finally {
			DBUtil.close(null, ps, conn);
		}
	}
}

 

以下是改造后的实现方式:

 

1、实体类同上

2、接口同上

3、用于处理查询结果的接口:

public interface RowMapper {
	public Object mapperRow(ResultSet rs)throws SQLException;
}

 

4、模拟JdbcTemplate类

public class JdbcTemplate {
	public int update(String sql, Object[] args) throws SQLException {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = DBUtil.getConnection();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);
			}
			return ps.executeUpdate();
		} catch (SQLException e) {
			throw e;
		} finally {
			DBUtil.close(null, ps, conn);
		}
	}
	public Object find(String sql, Object[] args, RowMapper rowMapper)
			throws SQLException {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		Object obj = null;
		try {
			conn = DBUtil.getConnection();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i + 1, args[i]);
			}
			rs = ps.executeQuery();
			if (rs.next()) {
				obj = rowMapper.mapperRow(rs);
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			DBUtil.close(rs, ps, conn);
		}
		return obj;
	}

 5、DAO实现类:

public class EmpDAOJdbcTemplateImpl implements EmpDAO {
	private JdbcTemplate jdbcTemplate = new JdbcTemplate();
	public int delete(Emp emp) throws SQLException {
		String sql = "delete from emp where id=?";
		Object[] args = new Object[] { emp.getId() };
		return jdbcTemplate.update(sql, args);
	}
	public Emp findById(Emp emp) throws SQLException {
		String sql = "select id,name,sal,sex from emp where id=?";
		Object[] args = new Object[] { emp.getId() };
		Object obj = jdbcTemplate.find(sql, args, new RowMapper() {
			@Override
			public Object mapperRow(ResultSet rs) throws SQLException {
				Emp emp = new Emp();
				emp.setId(rs.getInt("id"));
				emp.setName(rs.getString("name"));
				emp.setSal(rs.getFloat("sal"));
				emp.setSex(rs.getString("sex"));
				return emp;
			}
		});
		return (Emp) obj;
	}
	public String findName(Emp emp) throws SQLException {
		String sql = "select name from emp where id=?";
		Object[] args = new Object[] { emp.getId() };
		Object obj = jdbcTemplate.find(sql, args, new RowMapper() {
			@Override
			public Object mapperRow(ResultSet rs) throws SQLException {
				return rs.getString("name");
			}
		});
		return (String) obj;

	}
	public int insert(Emp emp) throws SQLException {
		String sql = "insert into emp(name,sal,sex) values(?,?,?)";
		Object[] args = new Object[] { emp.getName(), emp.getSal(),
				emp.getSex() };
		return jdbcTemplate.update(sql, args);

	}
	public int update(Emp emp) throws SQLException {
		String sql = "update emp set name=?,sal=?,sex=? where id=?";
		Object[] args = new Object[] { emp.getName(), emp.getSal(),
				emp.getSex(), emp.getId() };
		return jdbcTemplate.update(sql, args);
	}

}

 

分享到:
评论

相关推荐

    经典spring关于关于dao模式的开发案例

    8. **依赖注入**:通过Spring的IoC容器,可以将数据源、SessionFactory或JdbcTemplate实例注入到DAO实现类中,避免硬编码,提高代码的灵活性。 9. **工厂模式**:使用Spring的Bean工厂,可以动态地创建和获取DAO...

    利用JUnit和Spring-test对SpringJDBC组件DAO层测试

    此外,如果DAO层涉及到复杂的SQL查询,还可以利用Spring-test提供的MockMVC或者Mockito等工具对JdbcTemplate或NamedParameterJdbcTemplate的方法进行mock,模拟不同的数据库返回结果,以覆盖各种可能的业务场景。...

    SpringBoot 多模块Dao层单元测试

    在Spring Boot应用中,开发人员经常需要对各个模块进行单元测试以确保代码的质量和功能的正确性。在大型项目中,通常会...在实际开发中,还可以结合其他测试框架,如Spring Test,实现更复杂的集成测试和端到端测试。

    DAO模式实现增加删除修改操作

    在DAO实现类中,通过连接数据库、执行SQL语句(如INSERT, DELETE, UPDATE)以及处理结果集来完成数据操作。 4. **事务管理** 在进行增删改操作时,通常需要考虑事务的管理。DAO模式下,可以在服务层(Service ...

    SSH中通用dao类

    这些模板类封装了SQL执行、结果集处理等细节,使得DAO实现更加简洁。 2. **Hibernate作为ORM工具**:Hibernate是SSH中的ORM(对象关系映射)工具,它允许开发者通过Java对象来操作数据库,而无需编写SQL语句。在SSH...

    DAO 数据访问对象

    在DAO实现中,通常会有一个接口定义了操作方法,然后有一个具体的实现类来完成实际的工作。这样的设计允许使用不同的数据库技术(如JDBC、Hibernate、MyBatis等)实现相同的业务逻辑,只需更换DAO的实现即可,这就是...

    Spring2+实例

    在这里,我们可以利用Spring的JdbcTemplate或Hibernate Session进行数据库操作。 5. **事务管理**:配置事务管理器,确保在添加用户时,如果出现任何异常,所有的数据库操作都能被正确回滚。 6. **控制器**:创建...

    spring-2.0.8-sources.jar.zip

    Spring 2.0.8加强了对JDBC的抽象,提供了JdbcTemplate和SimpleJdbcTemplate,简化了数据库操作。同时,它还集成了多种ORM框架,如Hibernate、JPA等,提供了统一的编程接口。 八、集成测试 Spring 2.0.8引入了...

    使用spring jdbc template简化jdbc数据库操作实例代码

    然后,我们可以创建一个DAO接口,比如UserDAO,以及其实现类UserDAOSpringJdbcTemplate,使用JdbcTemplate进行数据库操作: ```java public interface UserDAO { void addUser(User user); List&lt;User&gt; getAll...

    Spring开发笔记.pdf

    SpringJDBCTemplate是为持久层提供的简化数据库操作的模板,用来简化数据库操作的代码。Spring还提供了业务层事务管理的机制,确保业务逻辑正确执行。 Spring的优势在于: 1. 方便解耦:Spring通过IoC实现组件之间...

    spring2.0和spring2.5 及以上版本的jar包区别 spring jar 包详解

    5. **spring-dao.jar**:提供了一组异常层次结构,简化了数据访问层的错误处理。它还包含了一些通用的数据访问工具类,比如JdbcTemplate,用于简化JDBC的使用。 6. **spring-hibernate.jar**:该jar包提供了Spring...

    spring3.1.1常用jar包

    8. **Spring Test**:提供了测试支持,包括JUnit和TestNG的集成,以及模拟对象和Web应用程序的测试工具。 在Spring 3.1.1中,一些关键改进包括: - 改进了类型安全的依赖注入,引入了`@Autowired`注解的可选`@...

    struts2+spring练习

    Spring提供了JdbcTemplate或HibernateTemplate等工具,简化了数据库操作。在Service层中注入DAO,通过调用DAO方法来执行CRUD操作。 8. **事务管理**:Spring提供了声明式事务管理,可以在XML配置文件中定义事务规则...

    spring 3.0 mvc实现rest代码

    Spring 提供了多种方式来管理数据库连接,如 JdbcTemplate、Hibernate 或 MyBatis。在本例中,你可能需要创建一个 DAO 类来处理数据库操作,并在 REST 控制器中注入该 DAO。 5. **实体类和响应对象**:对于 REST ...

    spring连数据库实例`

    DAO接口定义了业务逻辑,而DAO实现则包含了具体的数据访问逻辑。Spring的AOP(面向切面编程)可以用于事务管理和异常处理。 8. **单元测试** Spring Test模块提供了测试支持,包括测试环境的配置、模拟数据源、...

    spring-jdbcTmplate使用

    ### Spring中的JdbcTemplate使用详解 #### 一、引言 在Java开发中,Spring框架以其强大的功能和灵活性受到广泛欢迎。其中,`JdbcTemplate`作为Spring JDBC模块的核心组件,为开发者提供了一种更加便捷的方式来处理...

    Spring基础:数据访问(1)

    6. **单元测试**:Spring提供的TestContext框架使得数据访问层的单元测试变得简单,可以通过模拟数据库操作来测试DAO和Service类的功能。 7. **连接池配置**:在实际应用中,为了提高数据库连接的效率和性能,通常...

    JDBC中的 DAO

    - **DAO实现类**:实现了DAO接口,提供了具体的数据库操作实现。 - **实体类**:表示数据库表对应的Java对象,通常包含与数据库表字段相对应的属性和getter/setter方法。 - **数据源**:负责提供数据库连接,例如...

    Spring.3.x企业应用开发实战(完整版).part2

    经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...

    在应用中spring的使用

    在JDBC方面,Spring通过JdbcTemplate和NamedParameterJdbcTemplate简化了SQL的执行,提供了事务管理、连接池管理等功能,避免了手动处理数据库连接和关闭资源的繁琐工作。配置通常涉及以下步骤: 1. 配置数据源:在...

Global site tag (gtag.js) - Google Analytics