一般查询实体的时候,都需要这么使用:
/** *//**
* 根据id查询
*
* @return
*/
public Emp queryEmpById(Integer id)
{
String sql = "select * from emp where empno = ?";
ParameterizedRowMapper<Emp> mapper = new ParameterizedRowMapper<Emp>()
{
public Emp mapRow(ResultSet rs, int rowNum) throws SQLException
{
Emp emp = new Emp();
System.out.println("row:" + rowNum);
emp.setEmpno(rs.getInt("empno"));
emp.setEname(rs.getString("ename"));
return emp;
}
};
return this.getSimpleJdbcTemplate().queryForObject(sql, mapper, id);
}
能不能像Hibernate那样自动set这些值呢,用反射可以实现.
package orm;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
/** *//**
* 通用的Object包装类(类型问题,依然是个瓶颈,如果有好的解决方案请pm我)
*
* 功能:查询对象类型或对象集合时的通用包装类
*
*/
@SuppressWarnings("unchecked")
public class ObjectMapper implements ParameterizedRowMapper
{
private Class clazz;
public ObjectMapper(Class clazz)
{
this.clazz = clazz;
}
/** *//**
* 重写mapRow方法
*/
@Override
public Object mapRow(ResultSet rs, int rowNum) throws SQLException
{
try
{
Object obj = clazz.newInstance();
Field fields[] = obj.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++)
{
Field field = fields[i];
// 暴力访问
field.setAccessible(true);
this.typeMapper(field, obj, rs);
// 恢复默认
field.setAccessible(false);
}
return obj;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
/** *//**
* 数据类型包装器
*
* @param field
* 目标属性
* @param obj
* 目标对象
* @param rs
* 结果集
* @throws Exception
*/
private void typeMapper(Field field, Object obj, ResultSet rs)
throws Exception
{
String type = field.getType().getName();
if (type.equals("java.lang.String"))
{
field.set(obj, rs.getString(field.getName()));
}
else if (type.equals("int") || type.equals("java.lang.Integer"))
{
field.set(obj, rs.getInt(field.getName()));
}
else if (type.equals("long") || type.equals("java.lang.Long"))
{
field.set(obj, rs.getLong(field.getName()));
}
else if (type.equals("boolean") || type.equals("java.lang.Boolean"))
{
field.set(obj, rs.getBoolean(field.getName()));
}
else if (type.equals("java.util.Date"))
{
field.set(obj, rs.getDate(field.getName()));
}
}
}
dao:
/** *//**
* 查询操作 (自动setEmp类型所有值)
*
* @return
*/
public List queryList()
{
return this.getJdbcTemplate().query("select * from emp",
new ObjectMapper(Emp.class));
}
单个查询:
public Emp queryEmpById2(Integer id)
{
String sql = "select * from emp where empno = ?";
ObjectMapper om = new ObjectMapper(Emp.class);
return (Emp) this.getSimpleJdbcTemplate().queryForObject(sql, om, id);
}测试通过:
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
上面是我的一个简单封装,在Spring2.5中及以后版本,已经提供了便捷方法:
/** *//**
* 查询操作 (自动setEmp类型所有值)
*
* @return
*/
public List queryList()
{
return this.getSimpleJdbcTemplate().query(
"SELECT * from emp",
ParameterizedBeanPropertyRowMapper.newInstance(Emp.class));
}
/** *//**
* 根据id查询
*
* @return
*/
public Emp queryById(Integer id)
{
return this.getSimpleJdbcTemplate().queryForObject(
"SELECT * from emp where id = ?",
ParameterizedBeanPropertyRowMapper.newInstance(Emp.class),7369);
}
这样就简单多了,也是用反射实现的.
分享到:
相关推荐
1. **Spring JDBC核心组件**:Spring JDBC的核心是JdbcTemplate,它是一个模板类,封装了基本的JDBC操作,如执行SQL查询、更新、存储过程等。通过使用JdbcTemplate,开发者可以避免编写大量重复的JDBC模板代码,例如...
SBORM只是针对spring jdbc的一些不方便的地方,做了一些封装,更加简化日常的开发工作,基于spring jdbc的RowMapper自动实现对象映射,也勉强算的上叫ORM,只是大部分功能已经由spring jdbc实现了。 平时不太...
Spring JDBC模块提供了对JDBC的简单封装,使得编写SQL和处理结果集变得更简洁。同时,Spring Data JPA和Spring Data JDBC则提供了更高层次的抽象,支持与ORM(对象关系映射)框架如Hibernate集成。Spring Data的...
Spring JDBC是Spring对JDBC的封装,提供了一种更方便、更面向对象的方式来操作数据库。它简化了数据库连接的建立、关闭以及SQL语句的执行,同时提供了事务管理的支持。 学习SSM的过程中,你可能会接触到以下知识点...
- 配置Spring的SqlSessionFactoryBean,用于创建SqlSessionFactory对象,它是MyBatis的核心。 - 创建MyBatis的Mapper接口和XML配置文件,定义SQL语句和结果映射。 - 在Spring配置文件中定义...
综上所述,"spring+mybatis+jdbc.rar"项目是一个基于Java的后端应用,利用Spring的全面功能、MyBatis的简单映射以及JDBC的直接数据库操作,构建了一个适用于中小规模应用的框架。通过合理的架构设计和性能优化,该...
它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索封装工作。MyBatis可以使用简单的XML或注解来进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录...
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.jdbc.Driver mybatis....
1. **SqlSessionTemplate**:这是一个 Spring 封装的 SqlSession 对象,提供了线程安全的 SQL 执行操作。开发者可以通过 SqlSessionTemplate 直接执行 SQL 语句,无需关心事务管理、资源关闭等细节。 2. **...
SqlSessionFactory是Mybatis的核心对象,用于创建SqlSession,而SqlSessionTemplate则是Spring对SqlSession的封装,提供了线程安全的操作。 1. **添加依赖**: 在项目的pom.xml或build.gradle文件中,需要引入...
其中,Spring-JDBC模块是Spring对Java数据库连接(JDBC)的封装,它提供了一种更高级、更简洁的方式来处理数据库操作。本篇文章将详细探讨一个基于Spring-JDBC构建的小型ORM(对象关系映射)实现,帮助开发者理解其...
"Spring3-Mybatis-Spring3MVC所需架包"这个标题揭示了我们需要关注的是这三个技术的整合,而描述则强调了这是为了实现一个简单的整合所需的库文件。下面,我们将深入探讨这些技术及其整合的关键知识点。 **1. ...
1. **自动扫描Mapper接口并注入SqlSession**:MyBatis-Spring能自动扫描项目中的Mapper接口,并为每个接口注入一个实现了该接口的代理对象,该代理对象内部封装了SqlSession,从而简化了对数据库操作的代码。...
例如,SpringMVC的Controller与Service层的bean可以通过@Autowired注解实现自动装配,而MyBatis的SqlSessionFactory和Mapper接口则通过Spring管理。 通过这个简单的SSM实例,开发者可以快速理解如何搭建一个基础的...
3. **配置Mapper扫描**: 在Spring配置文件中,使用MapperScannerConfigurer扫描包中的Mapper接口,使Spring能够自动发现并注册它们。 4. **使用SqlSessionTemplate**: 在需要执行数据库操作的地方,注入...
MyBatis则是一个基于Java的持久层框架,它封装了JDBC,让开发者可以更专注于SQL语句的编写,同时通过XML或注解方式将SQL语句与Java代码解耦。MyBatis的主要特点是它的动态SQL支持,使得SQL的编写更加灵活。 整合...
- **Spring JDBC** 和 **Spring Data**:Spring 提供了对 JDBC 的简化封装,同时 Spring Data 提供了与多种数据存储的交互接口,使得数据库操作更加简单。 - **Spring Boot**:为了简化 Spring 应用的初始化和配置...
Spring与Mybatis的整合可以利用Spring的IOC和AOP特性,让Mybatis的Mapper接口和SqlSession管理更加方便,同时保持Mybatis的灵活性。 6. **Spring-Json** 这可能是Spring对JSON数据处理的支持,比如使用Jackson或...
- Model表示业务数据,可以是简单的Java对象(POJOs)。 - View负责渲染视图,通常与模板引擎(如Thymeleaf、JSP)配合使用。 - ViewModel是Model和View之间的桥梁,用于传递数据。 3. **MyBatis**:MyBatis避免...
Spring是一个广泛使用的Java企业级应用开发框架,它提供了一整套工具和功能来简化JDBC(Java Database Connectivity)的使用,并且支持ORM(Object-Relational Mapping)框架,如Hibernate和MyBatis,来实现对象与...