MyBatis事务由两种方式控制
JDBC-JDBC代表的数据由JDBC完成
<environment id="development">
<transactionManager type="JDBC" />
</environment>
JDBC典型代码:
SqlSession sesion = sqlSessionFactory.openSession(false);
try{
session = sqlMapper.openSession(false);//默认为false 关闭自动提交
...
session.commit();//提交事务
}catch(Exception e){
session.rollback();//回滚事务
}finally{
session.close(); //关闭session
}
MyBatis增、删、改操作标记分别为:<insert>、<delete>、<update>
MyBatis基础查询标记: <select>、<resultMap>
MANAGED-第三方插件来完成
联合查询:resultMap映射标记 - 一次查询,占用资源大
<resultMap id="JiKeAuthorMap" type="Author">
<id property="authorID" column="authorid" />
<result property="realName" column="realName" />
...
<association property="jikeUser" column="userID" javaType="JiKeUser">
<id property="id" columb="id" />
<result property="userName" column="userName" />
</association>
</resultMap>
id - 一个Id结果;标记结果作为ID可以帮助提高整体效能
result - 注入到字段或JavaBean属性的普通结果
association - 复杂类型的关联
collection - 复杂类型的集合
constructor - 类在实例化时,用来注入结果到构造方法
discriminator - 使用结果值来决定使用哪个结果映射
构造查询:建立构造函数
public JiKeUser(String userName, String password){
super();
this.userName = userName;
this.password = password;
}
改写resultMap
<association property="jikeUser" column="userID" javaType="JiKeUser">
<constructor>
<arg column="userName" javaType="String" />
<arg column="password" javaType="String" />
</constructor>
</association>
子查询: N+1次查询,占用资源可大可小
1.子查询形式的关联 select * from author where userID in (select id from jikeuser)
2.先建立一个子查询
<select id="selectOneUser" parameterType="int" reultType="JiKeUser">
select * from JikeUser where id=#{id}
</select>
3.建立查询
<select id="selectAuthorSub" resultMap="JiKeAuthorSubMap">
select * from author
</select>
子查询的resultMap
<resultMap id="JiKeAuthorSubMap" type="Author">
...
<association property="jikeUser" column="userID" javaType="JiKeUser" select="selectOneUser">
</association>
</resultMap>
懒加载应用:
<settings>
<setting name="lazyLoadingEnabled" value="true" />
<setting name="aggressiveLazyLoading" value="false" />
</settings>
collection标记 - resultMap的子标记,具有property与column、ofType属性
discriminator标记: 某个字段的值来对其他字段进行赋值
主要标识着鉴别器所对应的数据类型
javaType、column属性
Case子属性
示例表:
Id Gender Husband wife
主键 性别 丈夫 妻子
<discriminator javaType="byte" column="gender">
<case value="1">
<result property="husband" column="husband" />
</case>
<case value="2">
<result property="wife" column="wife" />
</case>
</discrimindator>
MyBatis通过不同的标记来生成动态SQL
if标记:
1.建立select
<select id="selectReaderMoney" resultType="jikeReader" parameterType="jikeReader">
select * from reader
where 1 = 1
<if test = "money != null"> //money代表的是reader对象的money属性
and money ># {money} //第一个是SQL表中的字段,第二个是参数
</if>
</select>
2.测试
jikeReader oneReader = new jikeReader();
oneReader.setMoney(200); //去除此行就是全体读者 查询money大于200的会员
List<jikeReader> ap = session.selectList("selectReaderMoney", oneReader);
choose标记:
1.建立select,判断用户名,如果不存在就判断id,最后判断密码不为空
select * from jikeuser where 1 = 1
<choose>
<when test="userName != null">
and userName like #{userName}
</when>
...
<otherwise>
and password is not null
</otherwise>
</choose>
2.测试
JiKeUser oneUser = new JiKeUser();
oneUser.setUserName("%j%");
oneUser.setId(5);
List<JiKeUser> ap = session.selectList("selectJiKeUserChoose", oneUser);
where标记: 智能化标记
select * from jikeuser
<where>
<if test="userName != null">
userName like #{userName}
</if>
<if test="id != null">
and id =#{id}
</if>
</where>
set标记:智能化标记
update JiKeUser
<set>
<if test="userName != null">userName=#{userName},</if>
<if test="password != null">password=#{password},</if>
</set>
where id=#{id}
trim标记:格式化标记 可以与其他标记组合完成where与set标记功能
prefix 前缀增加
suffix 后缀增加
prefixOverrides 自动判断前置
suffixOverrides 自动判断后置
代替set
<trim prefi="SET" suffix="WHERE id=#{id}" suffixOverrides=",">
<if test="userName != null and userName != '' ">
userName = #{userName},
</if>
...
</trim>
代替where
select * from jikeuser
<trim prefix="where" prefixOverrides="and|or">
<if test="userName != null">
and userName like #{userName}
</if>
<if test="id != null">
and id=#{id}
</if>
</trim>
foreach标记: 循环查询
<foreach item="item" index="index" collection="list" open="("separator="," close=")">
#{item}
</foreach>
item 每一次迭代结果
collection 循环集合或指定类型
separator 元素之间的分隔符,可选
open 开始符号
close 关闭符号
index list和数组的序号可选
select * from jikeuser
<where>
id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</where>
测试:
ArrayList<Integer> ides=new ArrayList();
ides.add(2);
...
List<JiKeUser> ap = session.selectList("selectJiKeUserForeach", ides);
循环赋值
1.insert中的foreach,使用集合一次增加多个用户
insert into jikeUser (userName, password) value
<foreach item="item" index="key" collection="list" open="" separator="," close="">
(#{item.userName},#{item.password})
</foreach>
2.测试
ArrayList<JiKeUser> jkuList=new ArrayList();
...
session.insert("insertJiKeUserForeach",jkuList);
session.commit();
MVC-Model View Controller
Model(模型)表示应用程序核心(比如数据库记录列表)
View(视图)显示数据(数据库记录)
Controller(控制器)处理输入(写入数据库记录)-从视图读取数据-向模型发送数据
比较常用的MVC框架有Struts、SpringMVC
MVC模式的优缺点:
优点->耦合性低,重用性高,生命周期成本低,部署快,可维护性高,有利于软件工程化管理
缺点->没有明确的定义,不适合小型、中等规模的应用程序,增加系统结构和实现的复杂性,
视图与控制器之间的过于紧密的链接,视图对模型数据的低效率访问,一般高级的界面工具或构造器不支持模式
SpringMVC
基于MVC设计理念,采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性、灵活性
在数据绑定、视图解析、本地化处理及静态资源处理上都有许多不俗的表现
围绕DispatcherServlet为核心展开,它负责截获请求并将其分派给相应的处理器处理
SpringMVC是基于Model2实现的技术框架
Model2=jsp + servlet + javaBean是经典的MVC模型的Web应用变体
JDBC-JDBC代表的数据由JDBC完成
<environment id="development">
<transactionManager type="JDBC" />
</environment>
JDBC典型代码:
SqlSession sesion = sqlSessionFactory.openSession(false);
try{
session = sqlMapper.openSession(false);//默认为false 关闭自动提交
...
session.commit();//提交事务
}catch(Exception e){
session.rollback();//回滚事务
}finally{
session.close(); //关闭session
}
MyBatis增、删、改操作标记分别为:<insert>、<delete>、<update>
MyBatis基础查询标记: <select>、<resultMap>
MANAGED-第三方插件来完成
联合查询:resultMap映射标记 - 一次查询,占用资源大
<resultMap id="JiKeAuthorMap" type="Author">
<id property="authorID" column="authorid" />
<result property="realName" column="realName" />
...
<association property="jikeUser" column="userID" javaType="JiKeUser">
<id property="id" columb="id" />
<result property="userName" column="userName" />
</association>
</resultMap>
id - 一个Id结果;标记结果作为ID可以帮助提高整体效能
result - 注入到字段或JavaBean属性的普通结果
association - 复杂类型的关联
collection - 复杂类型的集合
constructor - 类在实例化时,用来注入结果到构造方法
discriminator - 使用结果值来决定使用哪个结果映射
构造查询:建立构造函数
public JiKeUser(String userName, String password){
super();
this.userName = userName;
this.password = password;
}
改写resultMap
<association property="jikeUser" column="userID" javaType="JiKeUser">
<constructor>
<arg column="userName" javaType="String" />
<arg column="password" javaType="String" />
</constructor>
</association>
子查询: N+1次查询,占用资源可大可小
1.子查询形式的关联 select * from author where userID in (select id from jikeuser)
2.先建立一个子查询
<select id="selectOneUser" parameterType="int" reultType="JiKeUser">
select * from JikeUser where id=#{id}
</select>
3.建立查询
<select id="selectAuthorSub" resultMap="JiKeAuthorSubMap">
select * from author
</select>
子查询的resultMap
<resultMap id="JiKeAuthorSubMap" type="Author">
...
<association property="jikeUser" column="userID" javaType="JiKeUser" select="selectOneUser">
</association>
</resultMap>
懒加载应用:
<settings>
<setting name="lazyLoadingEnabled" value="true" />
<setting name="aggressiveLazyLoading" value="false" />
</settings>
collection标记 - resultMap的子标记,具有property与column、ofType属性
discriminator标记: 某个字段的值来对其他字段进行赋值
主要标识着鉴别器所对应的数据类型
javaType、column属性
Case子属性
示例表:
Id Gender Husband wife
主键 性别 丈夫 妻子
<discriminator javaType="byte" column="gender">
<case value="1">
<result property="husband" column="husband" />
</case>
<case value="2">
<result property="wife" column="wife" />
</case>
</discrimindator>
MyBatis通过不同的标记来生成动态SQL
if标记:
1.建立select
<select id="selectReaderMoney" resultType="jikeReader" parameterType="jikeReader">
select * from reader
where 1 = 1
<if test = "money != null"> //money代表的是reader对象的money属性
and money ># {money} //第一个是SQL表中的字段,第二个是参数
</if>
</select>
2.测试
jikeReader oneReader = new jikeReader();
oneReader.setMoney(200); //去除此行就是全体读者 查询money大于200的会员
List<jikeReader> ap = session.selectList("selectReaderMoney", oneReader);
choose标记:
1.建立select,判断用户名,如果不存在就判断id,最后判断密码不为空
select * from jikeuser where 1 = 1
<choose>
<when test="userName != null">
and userName like #{userName}
</when>
...
<otherwise>
and password is not null
</otherwise>
</choose>
2.测试
JiKeUser oneUser = new JiKeUser();
oneUser.setUserName("%j%");
oneUser.setId(5);
List<JiKeUser> ap = session.selectList("selectJiKeUserChoose", oneUser);
where标记: 智能化标记
select * from jikeuser
<where>
<if test="userName != null">
userName like #{userName}
</if>
<if test="id != null">
and id =#{id}
</if>
</where>
set标记:智能化标记
update JiKeUser
<set>
<if test="userName != null">userName=#{userName},</if>
<if test="password != null">password=#{password},</if>
</set>
where id=#{id}
trim标记:格式化标记 可以与其他标记组合完成where与set标记功能
prefix 前缀增加
suffix 后缀增加
prefixOverrides 自动判断前置
suffixOverrides 自动判断后置
代替set
<trim prefi="SET" suffix="WHERE id=#{id}" suffixOverrides=",">
<if test="userName != null and userName != '' ">
userName = #{userName},
</if>
...
</trim>
代替where
select * from jikeuser
<trim prefix="where" prefixOverrides="and|or">
<if test="userName != null">
and userName like #{userName}
</if>
<if test="id != null">
and id=#{id}
</if>
</trim>
foreach标记: 循环查询
<foreach item="item" index="index" collection="list" open="("separator="," close=")">
#{item}
</foreach>
item 每一次迭代结果
collection 循环集合或指定类型
separator 元素之间的分隔符,可选
open 开始符号
close 关闭符号
index list和数组的序号可选
select * from jikeuser
<where>
id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</where>
测试:
ArrayList<Integer> ides=new ArrayList();
ides.add(2);
...
List<JiKeUser> ap = session.selectList("selectJiKeUserForeach", ides);
循环赋值
1.insert中的foreach,使用集合一次增加多个用户
insert into jikeUser (userName, password) value
<foreach item="item" index="key" collection="list" open="" separator="," close="">
(#{item.userName},#{item.password})
</foreach>
2.测试
ArrayList<JiKeUser> jkuList=new ArrayList();
...
session.insert("insertJiKeUserForeach",jkuList);
session.commit();
MVC-Model View Controller
Model(模型)表示应用程序核心(比如数据库记录列表)
View(视图)显示数据(数据库记录)
Controller(控制器)处理输入(写入数据库记录)-从视图读取数据-向模型发送数据
比较常用的MVC框架有Struts、SpringMVC
MVC模式的优缺点:
优点->耦合性低,重用性高,生命周期成本低,部署快,可维护性高,有利于软件工程化管理
缺点->没有明确的定义,不适合小型、中等规模的应用程序,增加系统结构和实现的复杂性,
视图与控制器之间的过于紧密的链接,视图对模型数据的低效率访问,一般高级的界面工具或构造器不支持模式
SpringMVC
基于MVC设计理念,采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性、灵活性
在数据绑定、视图解析、本地化处理及静态资源处理上都有许多不俗的表现
围绕DispatcherServlet为核心展开,它负责截获请求并将其分派给相应的处理器处理
SpringMVC是基于Model2实现的技术框架
Model2=jsp + servlet + javaBean是经典的MVC模型的Web应用变体