目录
Spring-JDBC模板实现
实现
IOC应用,将JDBC模板对象注入给了Dao层的实现类。
在Service接口实例中将Dao层接口作为私有属性,调用Dao接口中的方法。而Dao中接口实现类继承了JdbcDaoSupport类后,就具有了JDBC模板属性。因为JdbcDaoSupport类中有一个JdbcTemplate属性,用于接收JDBC 模板。在配置文件中只要将模板对象注入即可。
JdbcDaoSupport 类,有一个 dataSource 属性,查看 setDataSource()方法体可知,若 JDBC 模板为 null,则会自动创建一个模板对象。因此,在 Spring 配置文件中,对于 JDBC 模板对象的配置完全可以省去,而是在 Dao 实现类中直接注入数据源对象。这样系统会自动创建 JDBC 模板对象。
增、删、改
对 DB 的增、删、改都是通过 update()方法实现的。该方法常用的重载方法有两个:
public int update ( String sql)
public int update ( String sql, Object… args)
第 1 个参数为要执行的 sql 语句,第 2 个参数为要执行的 sql 语句中所包含的动态参数。其返回值为所影响记录的条数。
查询
JDBC 模板的查询结果均是以对象的形式返回。根据返回对象类型的不同,可以将查询分为两类:简单对象查询,与自定义对象查询。
简单对象查询:查询结果为 String、 Integer 等简单对象类型,或该类型做为元素的集合类型,如 List<String>等。
查询结果为单个对象的 queryForObject()与查询结果为 List的 queryForList()。
pubic T queryForObject (String sql, Class<T> type, Object... args)
pubic List<T> queryForList (String sql, Class<T> type, Object... args)
自定义对象查询:查询结果为自定义类型,如 User 等,或该类型做为元素的集合类型,如 List<User>等。
查询结果为单个对象的 queryForObject()与查询结果为List 的 query()。
pubic T queryForObject (String sql, RowMapper<T> m , Object... args)
pubic List<T> query (String sql, RowMapper<T > m, Object... args)
注意, RowMapper 为记录映射接口,用于将查询结果集中每一条记录包装为指定对象。
该接口中有一个方法需要实现:
public Object mapRow(ResultSet rs, int rowNum)
参数 rowNum 表示总的结果集中当前行的行号,但参数 rs 并不表示总的结果集,而是表示 rowNum 所代表的 当前行的记录所定义的结果集,仅仅是当前行的结果。
一般,该方法体中就是实现将查询结果中当前行的数据包装为一个指定对象。
多例
JdbcTemplate 对象是多例的,即系统会为每一个使用模板对象的线程(方法)创建一个JdbcTemplate 实例,并且在该线程(方法)结束时,自动释放 JdbcTemplate 实例。所以在每次使用 JdbcTemplate 对象时,都需要通过 getJdbcTemplate()方法获取。
spring-web
问题:如何创建spring容器
考虑1:doPost()中创建容器------每提交一次请求都会创建容器对象--排除
考虑2:init()方法在servlet创建中执行(一个servlet中有一个init,但一个应用中不仅有一个servlet,还可以有好多种servlet)--排除
考虑3:应用启动时:不好捕获--排除
考虑4:ServletContext:初始化是一个事件,创建一个listener可以捕获到这个事件,在这里创建容器。--可行
又一个问题:
创建好容器时,怎么用?
放在ServletContext中的域属性空间,设置为application--全局属性
web实现
加入了servlets包
public class RegisterServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String ageStr = request.getParameter("age");
Integer age = Integer.valueOf(ageStr);
Student student = new Student(name, age);
// 获取到Spring容器对象
String acKey = WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE;
ApplicationContext ac = (ApplicationContext)
this.getServletContext().getAttribute(acKey);
System.out.println("ac = " + ac);
// 从Spring容器中获取到Service对象
IStudentService service = (IStudentService) ac.getBean("studentService");
// 调用Service的addStudent()完成插入
service.addStudent(student);
request.getRequestDispatcher("/welcome.jsp").forward(request, response);
}
}