文章目录
(1) Mybatis中的事务:
1、SQL中事务的回顾:
什么是事务??
事务的四大特性:ACID
不考虑隔离性会产生的三个问题:
三个问题的解决办法:四种隔离级别
2、Mybatis怎么实现的事务控制
Mybatis是通过sqlSession对象的方法:
commit()方法 实现事务的提交
roolback()方法 实现事务的回滚
怎么实现自动提交??
当我们在测试方法的时候,在生成sqlSession对象的时候,factory.openSession(true);
后面添加了true,会进行自动提交,
不用再通过sqlSession.commit()进行提交
(2) Mybatis映射文件中的SQL深入:
动态的SQL语句:(都是各查询相关的)
当我们处理复杂的业务逻辑的时候,可能面临着不同的查询条件等等
怎么动态的设定查询条件??
Mybatis给我们提供一系列的标签
1、< if>标签
:
<!-- 因为给com.zy.Dao起了别名 该包下的User类类名就是其别名-->
<select id="findUserByConditions" resultType="User" parameterType="User">
<!-- 这个SQL后面不能加分号,为了if标签中的拼接 -->
<!-- 添加where 1=1是为了是该sql语句成真,方面后面的拼接 -->
select * from user where 1=1
<!-- 根据user的username和sex找到同时成立的数据(应为是用and进行拼接的,不是用or)-->
<!-- test里面的username是通过OGNL表达式,调的是传过来的user的username-->
<if test="username != null">
<!-- sql语句中的username是数据库表的列名,#{username}是传过来的user的username-->
and username = #{username}
</if>
<if test="username != null">
and sex = #{sex}
</if>
</select>
注意:
(1) <if>标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法,调的是传过来的user的username
(2) sql语句中的username是数据库表的列名,#{username}是传过来的user的username
(3) where 1=1 的作用~! 是为了使sql语句永远为1,方便在<if>标签中的sql语句中的拼接.
(4) 拼接语句当有值的时候是利用 and 且 进行拼接(当然可以用或 or)
(6) 注意<select>标签下的sql语句不能分号,为了if标签的拼接
2、< where>标签
就是为了解决代替 where 1=1
<where>标签就相当于sql语句中的where条件
<select id="findUserByConditions" resultType="User" parameterType="User">
select * from user
<where>
<if test="username != null">
and username = #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</where>
</select>
3、< foreach>标签
当我们的查询要查询多个的时候:比如要查询 id为 42 43 46的用户的时候
select 字段 from user where id in (42,43,46)
在 QueryVo 中封装一个 List (封装查询条件):
public class QueryVo {
private ArrayList<Integer> ids;
public QueryVo() {
}
public QueryVo( ArrayList<Integer> ids) {
this.ids = ids;
}
public ArrayList<Integer> getIds() {
return ids;
}
public void setIds(ArrayList<Integer> ids) {
this.ids = ids;
}
@Override
public String toString() {
return "QueryVo{" +
", list=" + ids +
'}';
}
}
配置映射文件:
<select id="findUserInIds" resultType="User" parameterType="QueryVo">
select * from user
<!-- 在sql语句后面添加where条件判断 -->
<where>
<!-- ids为形参传过来的queryVo对象的值 queryVo.ids 判断是否有值-->
<if test="ids != null and ids.size() > 0">
<!-- 循环collection item代替得到的集合中的每一个值 -->
<!-- sql语句 以open开始 ,以close结束 中间循环添加 值 并且以separator分开 -->
<foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
<!-- 把什么值,循环添加到sql语句中 -->
#{id}
</foreach>
</if>
</where>
</select>
测试文件:
public static void main(String[] args) throws IOException {
QueryVo queryVo = new QueryVo();
ArrayList<Integer> list = new ArrayList<Integer> ();
list.add(42);
list.add(43);
list.add(46);
queryVo.setIds(list);
InputStream in = Resources.getResourceAsStream("Mybatis_config.xml");
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(in).openSession();
IUserDao iUserDao = sqlSession.getMapper(IUserDao.class);
List<User> all= iUserDao.findUserInIds(queryVo);
for (User temp : all) {
System.out.println(temp.toString());
}
sqlSession.close();
in.close();;
}