Spring JDBC的操作还是使用了sql语句,如果对sql不是非常熟悉的程序员可能在运用的过程中还有些麻烦,为此Spring提供了org.springframework.jdbc.object包来设计完全面向对象查询,只要封装一个面向对象的查询类,丝毫不用写任何的sql语句就可以完成JdbcTemplate所有的数据库操作功能。

publicclassUser...{
privateLongid;
privateStringuserName;
privateStringpassWord;
//set/get方法
}
1、org.springframework.jdbc.object.SqlQuery
SqlQuery是主查询类,他提供了强大的查询功能,不过他的查询返回值将会放到一个RowMapper中进行处理,所以在使用SqlQuery的时候要定义一个自己的RowMapper,然后给返回值放到自定义的RowMapper中,这样就完成了查询工作,示例如下:
首先定义一个UserRowMapper,该类实现RowMapper接口,代码如下:

publicclassUserRowMapperimplementsRowMapper...{

publicObjectmapRow(ResultSetrs,introwNum)throwsSQLException...{
Useruser=newUser();
user.setId(newLong(rs.getLong("id")));
user.setUserName(rs.getString("username"));
user.setPassWord(rs.getString("password"));
returnuser;
}
}
UserRowMapper类中只有一个mapRow方法,该方法就是将返回结果记录集ResultSet的值封装到User类中;
定义一个UserSqlQuery类,该类继承SqlQuery,代码如下:

publicclassUserSqlQueryextendsSqlQuery...{

publicUserSqlQuery(DataSourcedataSource)...{
super(dataSource,"select*fromuserwhereid=?");

int[]types=...{Types.LONGVARCHAR};
setTypes(types);
compile();
}

protectedRowMappernewRowMapper(Object[]args,Mapmap)...{
UserRowMapperurm=newUserRowMapper();
returnurm;
}
}
UserSqlQuery类首先定义了一个构造函数,在构造函数中调用了SqlQuery中的
SqlQuery(DataSourceds, Stringsql)完成数据源以及sql的注入,在sql中仍然用“?”作为占位符,int[] types数组为占位符设置sql字段属性,这里为LONGVARCHAR,最后调用compile()方法编译,执行sql返回值将有newRowMapper方法返回,这里我们直接使用了自定义的UserRowMapper来记录返回值,完成上述步骤后,就可以在UserDAO的find()方法中使用这个查询了:

publicUserfind(Longid)...{

Listlist=userSqlQuery.execute(newObject[]...{id});
return(User)list.get(0);
}
SqlQuery提供了很多的execute方法来执行查询,详情可以参考Spring的API文档,这里使用了execute传递一个id参数,因为返回值是一个数组而且数组中只有一个User对象,所以直接使用了(User)list.get(0)。
2、org.springframework.jdbc.object.MappingSqlQuery
MappingSqlQuery类是SqlQuery类的子类,使用MappingSqlQuery查询就不用使用RowMapper处理返回值了,直接写一个UserMappingSqlQuery类类继承MappingSqlQuery,代码如下:

publicclassUserMappingSqlQueryextendsMappingSqlQuery...{

publicUserMappingSqlQuery(DataSourcedataSource)...{
super(dataSource,"select*fromuserwhereid=?");

int[]types=...{Types.LONGVARCHAR};
setTypes(types);
compile();
}

protectedObjectmapRow(ResultSetrs,introwNum)throwsSQLException...{Useruser=newUser();
user.setId(newLong(rs.getLong("id")));
user.setUserName(rs.getString("username"));
user.setPassWord(rs.getString("password"));
returnuser;
}
}
UserMappingSqlQuery中首先还是使用SqlQuery中的构造函数完成数据源和sql的注入,返回值直接通过mapRow方法来完成,接着就可以这么使用它了:
UserMappingSqlQueryuserMappingSqlQuery=newUserMappingSqlQuery(dataSource);

userMappingSqlQuery.execute(newObject[]...{id});
返回值还是一个list,list中就是查询出来的User对象。
3、org.springframework.jdbc.object.SqlUpdate
SqlUpdate类用来表示一个类的更新,当然前面的SqlQuery和MappiingSqlQuery同样可以执行更新的sql语句,不过Spring为了适应人们的编程习惯,特意设计了SqlUpdate类来执行更新(update)、记录(insert)等操作,SqlUpdate类的使用更加简单,只要通过构造函数完成数据源和sql注入即可,定义一个自己的UserSqlUpdate,代码如下:
构造方法和上面的SqlQuery、MappingSqlQuery一样,这里不过多重复,接着就可以如下来使用了:

publicclassUserSqlUpdateextendsSqlUpdate...{

publicUserSqlUpdate(DataSourcedataSource)...{
super(dataSource,"insertintouser(username,password)values(?,?)");

int[]types=...{java.sql.Types.VARCHAR,java.sql.Types.VARCHAR};
setTypes(types);
compile();
}
}
UserSqlUpdateuserSqlUpdate=newUserSqlUpdate(dataSource);
Useruser=newUser();
user.setUserName("erikchang");
user.setPassWord("123456");

userSqlUpdate.update(newObject[]...{user.getUserName(),user.getPassWord});
SqlUpdate实例直接调用update方法来完成参数的传递以及sql的执行。
4、org.springframework.jdbc.object.SqlFunction
SqlFunction类是MappingSqlQuery的一个子类,他也就是具备了MappingSqlQuery的所有功能,不过SqlFunction实例的调用使用run或runGeneric方法来完成,同样可以在run()或runGeneric()方法中传递一个数组作为sql的参数,其中run()方法返回int类型的,一般用在数量的查询,runGenetic()方法返回一个对象,使用时首先定义一个UserSqlFucntion如下:

publicclassUserSqlFunctionextendsSqlFunction...{

publicUserSqlFunction(DataSourcedataSource)...{
super(dataSource,"select*fromuserwhereid=?");

int[]types=...{Types.LONGVARCHAR};
setTypes(types);
compile();
}
}
接着就可以如下来查询:
UserSqlFunctionuserSqlFunction=newUserSqlFunction(dataSource);

(User)userSqlFunction.runGeneric(newObject[]...{id});
如果在UserSqlFunction的构造函数中sql为:select count(*) from user,在使用的时候就直接使用userSqlFunction.run(); 文章系
eirkchang所有,转载注明作者!
分享到:
相关推荐
此外,3.0还引入了Spring Expression Language (SpEL),这是一个强大的表达式语言,用于在运行时查询和操作对象图。同时,3.0版本加强了对AspectJ的集成,使得面向切面编程(AOP)更为简便。 `Spring2.5中文版.chm`...
Spring框架是Java开发中最广泛应用的轻量级框架之一,它以IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)为核心,极大地简化了企业级应用的开发工作。这份"spring 源码...
6. **Test**:测试模块支持在开发过程中对 Spring 应用进行单元测试和集成测试,提供了模拟对象、测试上下文框架以及与各种测试框架的集成。 7. **Spring Boot**:近年来,Spring Boot 成为了快速开发 Spring 应用...
在传统的编程中,对象往往会自行创建依赖的对象,而在IoC中,依赖的对象是由容器根据配置动态地注入到需要它们的对象中。这种模式使代码更加松耦合,易于测试和维护。 IoC的实现方式之一是依赖注入(DI)。在上面的...
手册中详细介绍了Spring的IoC容器,它是Spring的核心,负责创建对象、管理对象的生命周期以及对象间的依赖关系。IoC容器通过XML配置文件或者基于注解的方式来实现配置,降低了代码的耦合度。 接着,手册会涵盖...
Spring支持在运行时动态地将切面织入到Java代理对象中。 在Spring框架中,AOP主要通过两种方式实现:基于XML配置和基于注解的方式。在"Spring_AOP_Annotation"这个文件中,我们可以看到关于使用注解实现AOP的例子。...
Spring Security是Spring生态中的安全组件,提供了一套全面的安全管理机制,包括认证(Authentication)、授权(Authorization)以及会话管理。它可以保护Web应用程序免受各种攻击,如XSS、CSRF等。 Spring Boot是...
随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程(AOP)应运而生。Spring框架作为Java开发领域的领头羊之一,提供...
依赖注入允许开发者将对象的创建和组合的责任从对象本身剥离出来,交给外部容器(即Spring IoC容器)处理,从而提高代码的可测试性和可维护性。面向切面编程则允许开发者通过定义切面来封装横切关注点,如日志、事务...
2. **Java配置**:使用@Configuration和@Bean注解,将配置信息写在Java类中,更符合面向对象的编程习惯。 3. **注解驱动**:通过@Component、@Service、@Repository和@Controller等注解标记组件,结合@Autowired自动...
通过提供依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP),Spring能够帮助开发者管理对象之间的关系,实现解耦和模块化。 2. **依赖注入**: 依赖注入是Spring的核心...
这种方式减少了代码的依赖性,使得面向对象设计变得更加灵活。 面向切面编程(AOP)是另一种让开发者集中处理应用程序中跨越多个点的功能(例如事务管理、安全检查)的方式。在Spring AOP模块中,开发者可以定义...
1. 容器与bean:Spring框架的核心是IoC(Inversion of Control)容器,它管理着应用中的对象(bean)。bean是Spring容器中的基本组成单元,它们的创建、配置和管理都由容器负责。 2. 配置bean:可以通过XML、注解或...
JPA是Java标准,用于管理关系数据库中的对象,它允许开发者使用面向对象的方式来操作数据库。Spring Data JPA进一步抽象了JPA,提供了一种声明式的方式来执行CRUD(创建、读取、更新、删除)操作,以及复杂的查询。...
Spring框架是Java开发中最受欢迎的开源框架之一,它以其模块化、灵活性和强大的功能而闻名。这个"Spring中英文资料"包含的是关于Spring 2.0版本的文档,提供了中文和英文两种语言的学习资源,对于想要深入理解Spring...
* Bean:Spring中的Bean是指一个 Java对象,Bean可以是任何类型的对象,例如数据访问对象、业务逻辑对象等。 * 依赖关系:Spring中的依赖关系是指Bean之间的关系,依赖关系可以是单向的或双向的。 * Context:Spring...
在本示例中,"Spring示例_Printer_Spring_AOP_Spring_Proxy" 主要关注的是Spring框架中的核心概念,特别是AOP(面向切面编程)和代理模式的应用。让我们深入探讨这些知识点。 首先,Spring框架是Java开发中最常用的...
面向对象编程(Object-Oriented Programming,简称OOP)是软件开发中的一种核心概念,它在Spring框架中占据了举足轻重的地位。Spring框架是Java领域最流行的框架之一,尤其在企业级应用开发中,其面向对象的设计理念...
SpEL是Spring 2.0引入的一种强大的表达式语言,用于在运行时查询和操作对象图。它可以用于配置文件中的属性值绑定,以及AOP切点表达式。 10. **Spring AOP代理** Spring 2.0提供了两种AOP代理:JDK动态代理和...