Struts2与mybatis整合开发过程

Struts2与mybatis整合开发过程

  1. 新建一个WEB项目
  2. 搭建环境
    2.1 导入jar包
    2.1.1.1 struts2 jar包
    核心jar包
    ------struts2-core-2.3.15.1.jar
    2.1.1.2 第三方依赖jar
    ------ commons-fileupload-1.3.jar
    ------ commons-io-2.0.1.jar
    ------ commons-lang3-3.1.jar
    ------ commons-lagging-1.1.3.jar
    ------ freemarker-2.3.19.jar
    ------ javassist-3.11.0.GA.jar
    ------ ognl-3.0.6.jar
    ------ xwork-core-2.3.15.1.jar
    2.1.2.1 mybatis jar包
    核心jar
    ------ mybatis-3.2.2.jar
    ------ ojdbc5.jar
    日志jar
    ------ log4j.jar —为显示mybatis运行过程,可不用
    2.2 引入配置文件
    2.2.1 struts2 配置文件
    ------ struts.xml —放置在项目src根目录下
    2.2.2 mybatis 配置文件
    ------ mybatis-config.xml —放置在项目src根目录下
    ------ oracle.properties —连接数据库的小配置文件
    ------ log4j.properties —放置在项目src根目录下,日志功能的配置文件
    2.3 初始化配置
    2.3.1 struts2 初始化配置
    在WEB-INF.xml文件中配置struts2的核心过滤器(告诉tomcat服务器使用了struts2框架)
    ----------------------------------------------------------------------------------------------------------

    struts2

    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter



    struts2
    /*

    ----------------------------------------------------------------------------------------------------------
    2.3.2 mybatis 初始化配置
    在mybatis-config.xml文件中配置
--------------------------------------------------------------------------------------------------------------------------------
  1. 导入封装工具类包
    ------ MybatisUtil —获取SqlSession封装代码
    //1 创建工具类SqlSessionFactoryBuilder 对象 — 读取文件
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    //2 获取读取文件的字符流/字节流
    Reader reader = Resources.getResourceAsReader(“mybatis-config.xml”);
    //InputStream is = Resources.getResourceAsStream(“mybatis-config.xml”);
    //3 获取SqlSessionFactory 对象 — 封装配置文件的数据信息
    SqlSessionFactory factory = builder.build(reader);
    //SqlSessionFactory factory = builder.build(is);
    //4 获取SqlSession
    SqlSession session = factory.openSession();
    //5 获取接口类型对象 — 翻译代码
    XxxxDAO xDAO = session.getMapper(XxxxDAO.class);
    //6 调用方法
    List list = xDAO.queryAll();
    //7 提交------增删改
    session.commit();
    //8 释放资源
    session.close();
    ------线程绑定
    ThreadLocal

  2. 开发
    MVC开发思想
    ------ 由设计者人为的将项目划分为
    M(model 模型层)、V(view 视图层)、C(controller 控制层)
    ------ 协同开发,提高效率,解耦和
    4.1 建表
    —单表
    —多表
    注意:1、 外键的定义位置
    2、 多对多时,注意使用中间表拆分成两个一对多(或者说是一个多对一与一个一对多)
    4.2 建实体类
    —单表
    —多表
    双向一对一:互相保留对方一个引用
    单向一对一:在关系的主要方保留一个引用,若无法分清主次,则使java类之间的关系方向与数据库保持一致
    双向一对多:多的一方保留一个引用,一的一方保留一个集合引用
    单向一对多:只一的一方保留一个集合引用
    单向多对一:只多的一方保留一个引用
    双向多对多:互相保留对方一个集合引用
    单向多对多:只一方保留对方的一个集合引用
    在mybatis-config.xml文件中进行实体类的别名定义

<!-- 设置别名 -->
<typeAliases>
<typeAlias type="实体类的地址" alias="别名"></typeAlias>
<!-- 如果有多个实体类的话就再加 -->
</typeAliases>
4.3 建DAO接口
4.4 配置mapper映射文件,实现DAO接口
<mapper namespace="要实现的DAO接口全限定名">
	<!--  使用缓存 -->
	<cache></cache>
	<!-- 增 -->
	<insert id="要实现的方法名" parameterType="接收的参数类型>
	<selectKey resultType="int" keyProperty="id" order="BEFORE">
	SELECT 序列名 from dual
	</selectKey>
	insert into 表名 values(#{id},字段1。。)
</insert>
	----注:若某个属性可以传入空值,则需为该属性指定jdbcType
	常用:DATE VARCHAR NUMERIC TIMESTAMP
			#{字段名,jdbcType=该字段类型}
	<!-- 删 -->
	<delete id=”要实现的方法名” parameterType=”传递的参数类型”>
         delete from 表名 where id =#{id}
</delete>
	<!-- 改 -->
	<update id=”要实现的方法名” parameterType=”传递的参数类型”>
         update 表名
<!--第一种-->
         <set>
                   <if test=”name != null”>name=#{name},</if>
		</set>
<!--第二种-->
			<trim prefix=”set” suffixOverrides=”,”>
                   <if test=”name != null”>name=#{name},</if>
</trim>
where id=#{id}
</update>
	<!-- 查 -->
<sql id=”select_xxxtable”>
         select id,name,password
</sql>
<!--返回值属性不包含对象 -->
<select id=”要实现的方法名” parameterType=”传递的参数类型” resultType=”返回的参数类型”>
<!--方法一 -->
<include refid=”select_xxxtable”>
<!--方法二 -->
select * from xxxtable
<!--第一种-->
         <where>
                   <if test=”name != null”>name=#{name}</if>
                   <if test=”password != null”>and password=#{password}</if>
</where>
<!--第二种-->
<trim prefix=”where” suffixOverrides=”and/or”>
                   <if test=”name != null”>name=#{name}</if>
                   <if test=”password != null”>and password=#{password}</if>
</trim>
</select>
<!--返回值中包含对象 -->
<resuleMap id=”随便取(最好望文知义)” type=”返回的对象类型(集合中的元素)”>
<id column=”查询结果集中对应的主键字段名” property=”实体类中对应的属性名”/>
<result column=”查询结果集中对应的普通字段名” property=”实体类中对应的属性名”/>
<!—关系属性为一个对象引用 -->
<association property=”关系属性名” javaType=”关系属性类型”>
<id column=”查询结果集中对应的主键字段名” property=”实体类中对应的属性名”/>
<result column=”查询结果集中对应的普通字段名” property=”实体类中对应的属性名”/>
</association>
<!—关系属性为一个集合引用 -->
<collection property=”关系属性名” ofType=”关系属性类型”>
<id column=”查询结果集中对应的主键字段名” property=”实体类中对应的属性名”/>
<result column=”查询结果集中对应的普通字段名” property=”实体类中对应的属性名”/>
</collection>
</resultMap>
<select id=”要实现的方法名” parameterType=”传递的参数类型” resultMap=”resultMap的id”>
<!--方法一 -->
<include refid=”select_xxxtable”>
<!--方法二 -->
select *
from xxxtable
<!--第一种-->
         <where>
                   <if test=”name != null”>name=#{name}</if>
                   <if test=”password != null”>and password=#{password}</if>
</where>
<!--第二种-->
<trim prefix=”where” suffixOverrides=”and/or”>
                   <if test=”name != null”>name=#{name}</if>
                   <if test=”password != null”>and password=#{password}</if>
</trim>
</select>
------ 模糊查询 
Eg.   where name like ‘%’|| name=#{name} ||’%’
                或者在java类中进行字符串的拼接
------ 多参查询                            
                                               --- 使用下标指定参数              eg. Where name=#{0} and password=#{1}
                                               --- 使用注解 @Param(value=”name”) / @Param(“name”)
                                               --- 使用Map集合
                                                        Map<String,String> map = new Map<String,String>();
                                                        map.put(key,value);
                                                        <select>
                                                        select * from Xxxtable where name=#{key1} and password=#{key2}
                                                        </select>
                                     ------ 含特殊符号查询 (<,<=,>,>=)
                                               --- 使用实体引用(&lt; &le; &gt; &ge; …)
                                               --- 使用 <![CDATA[ … ]]>
                                     ------ 实体类属性名与查询结果集中字段名不一致时---为字段名定义别名
</mapper>
	注册mapper映射文件 --- 在mubatis-config.xml文件中配置
<mappers>
<mapper resource="com/baizhi/dao/XxxDAOImpl.xml"></mapper>
</mappers>
4.5 建service接口
4.6 实现service接口
------ 获取SqlSession   --- MybatisUtil.openSession();
------ 获取DAO接口对象
------ 调用DAO层方法
------ 增删改需要事务控制  --- session.commit();
------ 释放资源   --- MybatisUtil.close();
4.7 建action
------ 实现Action/继承ActionSupport
------ 接收客户端参数通过实例变量
------ 值栈使用
*定义拦截器(看需求)
------ 一般拦截器
--- 实现Interceptor/继承AbstractInterceptor
--- 实现interceptor方法
------ 方法拦截器
--- 继承MethodFilterInterceptor
--- 实现doIntercept方法

4.8 配置struts.xml文件
<struts>
<package name=”随意取,唯一,建议望文知义” extends=”struts-default” namespace=”/…”>
         <!-- 定义拦截器 -->
<interceptors>
<interceptor name=”随意取,唯一,建议望文知义” class=”拦截器全限定名”/>
<!—定义方法拦截器 -->
<interceptor name=”随意取,唯一,建议望文知义” class=”拦截器全限定名”>
         <param name=”excludeMethods/includeMethods”>…</param>
</interceptor>
<!—定义拦截器栈 -->
<interceptor-stack name=”随意取,唯一,建议望文知义”>
         <interceptor-ref name=”defaultStack”></interceptor-ref>
         <interceptor-ref name=”自定义拦截器name”></interceptor-ref>
</interceptor-stack>
</interceptors>
<!--全局跳转 -->
         <global-results>
                   <result name=”” type=””>/…</result>
</global-results>
         <action name=”随意取,本包唯一,建议望文知义” class=”Action类的全限定名”>
                   <!—引入拦截器 -->
                   <interceptor-ref name=”所定义的拦截器/拦截器栈的name”/y>
                   
<!-- 同包中:actionàjsp  -->
                   <result name=”success” type=”dispatcher”>/xxx.jsp</result>
                   <result name=”success” type=”redirect”>/xxx.jsp</result>
                   
<!--  同包中:actionàaction  -->
<result name=”success” type=”chain”> actionName </result>
<result name=”success” type=”redirectAction”> actionName </result>
<!--  跨包:actionàaction  -->
<result name=”success” type=”chain/redirectAction”>
         <param name=”namespace”>/包名</param>
         <param name=”actionName”>action名</param>
</result>
------ 注意:  actionàjsp没有跨包跳转
         </action>
</package>
</struts>

4.9 创建前台页面jsp/html
创建view层
----- struts2标签
--- 导入标签 ---<%@ taglib uri=”/struts-tags” prefix=”s”%>
--- 单个展示数据 --- <s:property value=”OGNL表达式获取值”/>
--- 条件展示数据
         ---<s:if test=”OGNL表达式(boolean)”>…</if>
         ---<s:elseif test=” OGNL表达式(boolean)”>…</elseif>
         ---<s:else test=” OGNL表达式(boolean)”>…</else>
--- 循环展示数据
         ---<s:iterator value=” OGNL表达式获取值(list,set,map)”>
                   <s:property value=” OGNL表达式取值”>        
			</iterator>  	 --- url重写
                              ---静态资源路径: <s:url value=”…/xxx.jsp”/>
---后台action路径: <s:url action=”action的url”/>
                                     --- 日期展示
--- <s:date name=” OGNL表达式取值” format=”yyyy-MM-dd”/>
                                     --- 转存作用域
--- <s:set value=”要转存的数据” scope=”转存到哪个作用域” name=”数据在作用域中的名字”>
                                     --- 汇总多个action处理结果 --- 不支持重定向
                 --- <s:action name=”actionName” executeResult=”true”/>
					<s:action name=”actionName1” executeResult=”true”/>
                     <s:action name=”actionName2” executeResult=”true”/>


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值