mybatis3.0+spring3.0+struts2 整合


mybatis3.0+spring3.0+struts2 整合 作者: 什么向往 http://dejazhan.iteye.com 主要针对mybatis介绍了mybatis的使用 http://www.iteye.com - 做最棒的软件开发交流社区 第 1 / 35 页 本书由ITeye提供的电子书DIY功能自动生成于 2012-10-08 目 录 1. mybatis 1.1 mybatis介绍(一) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 mybatis的SQL映射配置文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3 mybatis3.0+spring3.0+struts2整合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18 1.4 mybatis3.0+spring3.0+struts2整合(json介绍) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31 http://dejazhan.iteye.com 第 2 / 35 页 1.1 mybatis介绍(一) 发表时间: 2012-10-08 什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除 了几乎所有的JDBC代码 和参数的手工设置以及对结果集的检索。MyBatis可以使用简单的 XML或注解用于配置和原始映射,将接口和 Java的POJO(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 每一个MyBatis的应用程序都以一个SqlSessionFactory 对象的实例为核心。SqlSessionFactory 对 象的 实例 可以 通 过SqlSessionFactoryBuilder 对 象 来获 得 。SqlSessionFactoryBuilder 对象可以通过XML配置文 件,或从以往使用惯例中准备好的Configuration类实例中来构建SqlSessionFactory对象。 备注:mybatis指的是ibatis3,它和ibatis2有很大的区别。mybatis3需要jdk1.5以上的支持,因为其中增加了 注解和泛型。 从XML中构建SqlSessionFactory对象 从XML中构建SqlSessionFactory实例,建议使用类路径下的资源文件来配置。 String resource = "Configuration.xml"; Reader reader = Resources.getResourceAsReader(resource); sqlMapper = new SqlSessionFactoryBuilder().build(reader); XML配置文件的内容包含对mybatis系统的核心配置,包含获取数据库连接实例的数据源和决定事务范围和控制 的事务管理器。简单实例如下:写道 http://dejazhan.iteye.com 1.1 mybatis介绍(一) 第 3 / 35 页 在XML中还有很多的信息可以配置,以上实例只是指出最关键的部分。 从SqlSessionFactory中获取sqlsession 现在已经知道了如何获取SqlSessionFactory对象了,我们可以通过代码 写道 SqlSession session = sqlMapper.openSession(); 来获得SqlSession的实例。 http://dejazhan.iteye.com 1.1 mybatis介绍(一) 第 4 / 35 页 SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法。我们可以用SqlSession对象实例来直接 执行已经映射的SQL语句。 SqlSession session = sqlSessionFactory.openSession(); try { BlogMapper mapper = session.getMapper(BlogMapper.class); //映射BlogMapper接口的实现 Blog blog = mapper.selectBlog(101); } finally { session.close(); } 在通过XML文件创建SqlSessionFactory时,在XML文件中,配置了一个基于XML的映射语句 BlogMapper.xml代码如下 http://dejazhan.iteye.com 1.1 mybatis介绍(一) 第 5 / 35 页 http://dejazhan.iteye.com 1.1 mybatis介绍(一) 第 6 / 35 页 1.2 mybatis的SQL映射配置文件 发表时间: 2012-10-08 SQL映射文件有很少的几个顶级元素(按照他们应该被定义的顺序如下)。 • cache - 配置给定命名空间的缓存 • cache-ref – 从其他命名空间引用缓存配置。 • resultMap – 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。 • parameterMap – 已经被废弃了!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移 除。 • sql – 可以重用的SQL块,也可以被其他语句引用。 • insert – 映射插入语句 • update – 映射更新语句 • delete -映射删除语句 • select - 映射查询语句 SELECT 简单的SELECT 语句如下: 写道 这个语句被称作selectPerson,使用一个int (或Integer)类型的参数,并返回一个HashMap类型的对象 #{id}告诉mybatis创建了一个PreparedStatement(预处理语句)参数。在JDBC中,类似的代码如下 写道 http://dejazhan.iteye.com 1.2 mybatis的SQL映射配置文件 第 7 / 35 页 String selectPerson = “SELECT * FROM PERSON WHERE ID=?”; PreparedStatement ps = conn.prepareStatement(selectPerson); ps.setInt(1,id); SELECT的属性还有很多的属性可以配置,具体的如下: • id 在命名空间中唯一的标识符,可以被用来引用这条语句。 • parameterType 将会传入这条语句的参数类的完全限定名或别名。 • resultType 从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可 以包含的类型,而不能是集合本身。使用resultType或resultMap,但不能同时使用。 • resultMap 命名引用外部的resultMap。返回map是MyBatis最具力量的特性,对其有一个很好的理解 的话,许多复杂映射的情形就能被解决了。使用resultMap 或resultType,但不能同时使用 • flushCache 将其设置为true,无论语句什么时候被调用,都会导致缓存被清空。默认值:false。 • useCache 将其设置为true,将会导致本条语句的结果被缓存。默认值:true。 • timeout 这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置 (驱动自行处理)。 • fetchSize 这是暗示驱动程序每次批量返回的结果行数。默认不设置(驱动自行处理)。 • statementType STATEMENT,PREPARED或CALLABLE的一种。这会让MyBatis使用选择使用 Statement,PreparedStatement或CallableStatement。默认值:PREPARED。 • resultSetType FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。默认是不设 置(驱动自行处理)。 insert,update,delete 数据修改语句insert,update和delete在它们的实现中非常相似。 写道 http://dejazhan.iteye.com 1.2 mybatis的SQL映射配置文件 第 8 / 35 页 SQL 这个元素可以被用来定义可重用的SQL代码段,可以包含在其他语句中,例如 写道 id,username,password 这个SQL片段可以被包含在其他语句中,例如: Parameters 这个元素说的直白点就是定义参数。注意一个语句中只能有一个参数。所以参数类型在以后的使用中,可能需 要复杂的类型,比如hashmap,一个复杂的对象等。例如: 写道 insert into users (id, username, password) values (#{id}, #{username}, #{password}) 如果User类型的参数对象传递到了语句中,id、username和password属性将会被查找, 然后它们的值就被传递到预处理语句的参数中。 http://dejazhan.iteye.com 1.2 mybatis的SQL映射配置文件 第 9 / 35 页 resultMap resultMap 元素是MyBatis中最重要最强大的元素。它就是让你远离90%的需要从结果集中取出数据的JDBC代 码的那东西,而且在一些情形下允许你做一些JDBC不支持的事情。事实上,编写相似于对复杂语句联合映射这 些等同的代码,也许可以跨过上千行的代码。ResultMap的设计就是简单语句不需要明确的结果映射,而很多 复杂语句确实需要描述它们的关系。 写道 这个语句查询出来的所有列将会自动映射到HashMap的键上,这个是由resultType的属性来指定的。但是 HashMap不能很好描述一个领域模型。那样你的应用程序将会使用JavaBeans或POJO 来作为领域模型。 例如一个javabean如下 package com.someapp.model; public class User { private int id; private String username; private String hashedPassword; //set和get方法。。。。 } http://dejazhan.iteye.com 1.2 mybatis的SQL映射配置文件 第 10 / 35 页 写道 当然在使用的时候可以不用输入全名,只需在XML的配置文件中进行以下设置。 写道 http://dejazhan.iteye.com 1.2 mybatis的SQL映射配置文件 第 11 / 35 页 缓存 MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。默认情况下是没有开启缓存的,除 了局部的session 缓存。要开启二级缓存,你需要在你的SQL映射文件中添加一行: 这个简单语句的效果如下: 1 映射语句文件中的所有select语句将会被缓存。 2 映射语句文件中的所有insert,update和delete语句会刷新缓存。 3 缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。 4 根据时间表(比如no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新。 5 缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用。 6 缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修 改,而不干扰其他调用者或线程所做的潜在修改。 一个简单的实例如下 写道 这个配置创建了一个FIFO缓存,并每隔60秒刷新,存数结果对象或列表的512个引用,而且返回的对象被认为 是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。 http://dejazhan.iteye.com 1.2 mybatis的SQL映射配置文件 第 12 / 35 页 可用的收回策略有: • LRU – 最近最少使用的:移除最长时间不被使用的对象。 • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。 • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。 • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。 默认的是LRU。 flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况 是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。 size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认 值是1024。 readOnly(只读)属性可以被设置为true 或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因 此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。 这会慢一些,但是安全,因此默认是false。 动态SQL 动态SQL的元素有以下几个: if choose(when,otherwise) trim(where,set) foreach http://dejazhan.iteye.com 1.2 mybatis的SQL映射配置文件 第 13 / 35 页 if 写道 choose, when, otherwise 有时我们不想应用所有的条件,相反我们想选择很多情况下的一种。和Java中的switch语句相似,MyBatis提供 choose元素。 写道 trim, where, set 写道 如果这些条件都没有匹配上将会发生什么?这条SQL结束时就会成这样: http://dejazhan.iteye.com 1.2 mybatis的SQL映射配置文件 第 15 / 35 页 SELECT * FROM BLOG WHERE,从而导致查询失败。 如果仅仅第二个条件匹配,这条SQL结束时就会是这样: SELECT * FROM BLOG WHERE AND title like MyBatis有一个简单的处理,这在90%的情况下都会有用。而在不能使用的地方,你可以自定义处理方式。加上 一个简单的改变,所有事情都会顺利进行: 写道 where元素知道如果由被包含的标记返回任意内容,就仅仅插入“WHERE”。而且,如果以“AND”或 “OR”开头的内容,那么就会跳过WHERE不插入。 http://dejazhan.iteye.com 1.2 mybatis的SQL映射配置文件 第 16 / 35 页 foreach 另外一个动态SQL通用的必要操作是迭代一个集合,通常是构建在IN条件中的 写道 foreach 元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也 允许你指定开放和关闭的字符串,在迭代之间放置分隔符。 http://dejazhan.iteye.com 1.2 mybatis的SQL映射配置文件 第 17 / 35 页 1.3 mybatis3.0+spring3.0+struts2整合 发表时间: 2012-10-08 由于spring暂不支持ibatis3,但是mybatis3自己开发了一套针对spring的支持,所以整合中引入了 mybatis_spring的jar包。 具体的项目结构图如下 在整合之前,参考了不少网上的资料,但是发现其中有过多的配置文件,我在配置中,依靠mybatis本身的映射 机制以及spring的注解机制,把配置文件尽量的减少了。可以参考http://diqizhan.iteye.com/blog/582150的 配置。 http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 18 / 35 页 主要的配置文件applicationContext.xml代码如下: http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 19 / 35 页 使用一个MapperScannerConfigurer,它将会查找类路径下的映射器并自动将它们创建成 MapperFactoryBeans。 basePackage属性是让你为映射器接口文件设置基本的包路径。你可以使用分号或逗号作为分隔符设置多于一 个的包路径 没有必要去指定SqlSessionFactory 或SqlSessionTemplate,因为MapperScannerConfigurer将会创建 MapperFactoryBean,之后自动装配。 @service是用于服务层的类文件。 @Autowired用来注入。 例如 @Autowired private ConsumerMapper consumerMapper; 相当于new了一个ConsumerMapper的类。 http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 20 / 35 页 需要在配置文件中进行以下配置 写道 写道 用来定义javabean的包位置,这样在mybatis的sql映射文件中,就可以该包下的类的简写(首字母小写)来定 义,而不用定义该类的所在包的位置 web.xml 代码如下: http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 21 / 35 页 login.jsp contextConfigLocation /WEB-INF/applicationContext.xml org.springframework.web.context.ContextLoaderListener struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* 主要是配置了项目启动时,加载的配置文件contextConfigLocation的文件,以及struts的一些基本配置。 接下来以一个验证登陆的实例来说明 登陆页面主要代码如下: http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 22 / 35 页 $("#to_submit").click(function(){ $.post( "checkConsumer.action", { account:$("#account").val(), password:$("#password").val(), validation_code:$("#validation_code").val() }, function(data,textStats){ if(data.mess=="success"){ window.location.href="jsp/demo1.jsp"; }else{ $("#message").html(""+data.mess+""); } },"json" ); 我主要用的是jquery的ajax提交,点击id为 to_submit的登陆按钮后,所做的操作是执行 checkConsumer.action。 struts.xml的配置如下: http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 23 / 35 页 login.jsp 由于是ajax的提交,我选择了json格式的返回值,所以在项目中,我还引入了json的jar包。因此在配置中多了 几项内容。 http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 24 / 35 页 如果不需要格式的返回值,那么改为struts的默认格式 login.jsp ConsumerAction.java的代码如下: package com.whatlookingfor.action; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 25 / 35 页 import com.opensymphony.xwork2.ModelDriven; import com.whatlookingfor.domain.Consumer; import com.whatlookingfor.service.ConsumerService; public class ConsumerAction implements ModelDriven{ /** * */ private static final long serialVersionUID = -3532748434595941668L; @Autowired private ConsumerService consumerService; //通过实现ModelDriver接口,获取页面的consumer对象。必须定义个new model。 private Consumer consumer=new Consumer(); private String mess; public String getMess() { return mess; } public void setMess(String mess) { this.mess = mess; } public String checkConsumer() { Consumer consu=new Consumer(); consu=consumerService.getConsumer(consumer); //根据consu对象(数据库查询的信息)与consumer对象(从页面获取的信息),进行登录信息的验证比较 this.mess="密码错误"; return "mess"; } http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 26 / 35 页 /** * 实现ModelDriver的必须实现的方法 * */ public Consumer getModel() { return consumer; } } 该action类 实现了ModelDriven的接口,具体机制,各位到网上去查阅。 在action类中,通过@Autowired 创建了一个ConsumerService的实例。 ConsumerService.java的代码如下 package com.whatlookingfor.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.whatlookingfor.domain.Consumer; import com.whatlookingfor.mapper.ConsumerMapper; @Service public class ConsumerService { http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 27 / 35 页 @Autowired private ConsumerMapper consumerMapper; public Consumer getConsumer(Consumer consumer) { return consumerMapper.getConsumer(consumer); } } @service以及Autowired上面已经大概介绍过。 ConsumerMapper接口类的代码如下: package com.whatlookingfor.mapper; import java.util.List; import com.whatlookingfor.domain.Consumer; /** * @author Administrator * */ public interface ConsumerMapper { /** * * */ http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 28 / 35 页 public Consumer getConsumer(Consumer consumer); } ConsumerMapper.xml代码如下 Consumer.java的代码如下: package com.whatlookingfor.domain; import java.io.Serializable; import com.whatlookingfor.base.PageInfo; public class Consumer extends PageInfo implements Serializable{ /** * http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 29 / 35 页 */ private static final long serialVersionUID = -4075669481168367315L; private String account; private String password; public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } OK,至此,所有的代码已经全部贴完。 数据库就一张表 TB_CONSUMER,有两个字段 account,和password。 主要引入的jar包有spring的核心包,struts2的核心包,mybatis3.0的jar包,mybatis_spring 1.0jar包,json 的jar包(jsonplugin-0.32.jar),使用的时候注意0.32和0.34的区别。 http://dejazhan.iteye.com 1.3 mybatis3.0+spring3.0+struts2整合 第 30 / 35 页 1.4 mybatis3.0+spring3.0+struts2整合(json介绍) 发表时间: 2012-10-08 关于json的介绍 由于项目中使用到了jqgrid组建以及ajax的异步提交等,有时候可能会需要后台往前台返回的是一个json格式的 结果。因此我引入了jsonplugin-0.32的jar包。 json插件提供了一个“json”结果类型来把action序列化成json.如果使用了json拦截器,action将可通过请求 中的json内容组装出来,该拦截器需要遵循以下几条规则: 1. "content-type" 必须为 "application/json" 2. JSON 内容必须是格式良好的, 参考 json.org 中的语法. 3. Action 里必须有欲获取值的属性的相应 public 的 "setter" 方法. 4. 所支持的类型有: 原始类型 (int,long...String), Date, List, Map, 原始类型数组, 其他的类 (将会支持更 多), 和其他类型的数组. 5. JSON 中的任何将要被填入到 list 或 map 中的对象会是 Map 类型(属性映射到值), 任何整数都是 Long 类型, 任何小数会是 Double 类型, 任何数组会是 List 类型. 排除属性 逗号分隔的正则表达式列表可传递给 JSON Result 和 Interceptor(拦截器), 被任何 一个正则表达式匹配的属性 将会在序列化过程时忽略掉: login.password, studentList.*\.sin true login.password, http://dejazhan.iteye.com 1.4 mybatis3.0+spring3.0+struts2整合(json介绍) 第 31 / 35 页 studentList.*\.sin 包含属性 逗号分隔的正则表达式列表可被传递给 JSON Result, 用于限制哪些属性可用于序列化. 只有当能够匹配任何一 个正则表达式的属性才会包含在序列化输出中. 排除属性表达式优先于包含属性的表达式. 那就是说, 如果包含和排除表达式应用于同一个结果, 包含表达式对于 被排除表达式匹配到的属性是不起作用的. ^entries\[\d+\]\.clientNumber, ^entries\[\d+\]\.scheduleNumber, ^entries\[\d+\]\.createUserId 根对象 使用 "root" 属性(OGNL 表达式) 指定被用于序列化的根对象. person.job 举个例子 import java.util.HashMap; import java.util.Map; import com.opensymphony.xwork2.Action; http://dejazhan.iteye.com 1.4 mybatis3.0+spring3.0+struts2整合(json介绍) 第 32 / 35 页 public class JSONExample { private String field1 = "str"; private int[] ints = {10, 20}; private Map map = new HashMap(); private String customName = "custom"; //'transient' fields are not serialized private transient String field2; //fields without getter method are not serialized private String field3; public String execute() { map.put("John", "Galt"); return Action.SUCCESS; } public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } public int[] getInts() { return ints; } public void setInts(int[] ints) { this.ints = ints; } public Map getMap() { return map; } http://dejazhan.iteye.com 1.4 mybatis3.0+spring3.0+struts2整合(json介绍) 第 33 / 35 页 public void setMap(Map map) { this.map = map; } @JSON(name="newName") public String getCustomName() { return this.customName; } } struts的配置文件如下 那么其构造出来的json结果为 { "field1" : "str", "ints": [10, 20], "map": { "John":"Galt" http://dejazhan.iteye.com 1.4 mybatis3.0+spring3.0+struts2整合(json介绍) 第 34 / 35 页 }, "newName": "custom" } http://dejazhan.iteye.com 1.4 mybatis3.0+spring3.0+struts2整合(json介绍) 第 35 / 35 页
还剩34页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 8 人已下载

下载pdf

pdf贡献者

w2wb

贡献于2012-10-24

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf