导入封装工具类包
------ 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
开发
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>
------ 含特殊符号查询 (<,<=,>,>=)
--- 使用实体引用(< ≤ > ≥ …)
--- 使用 <![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”/>