Mybatis08_事务、动态的SQL语句设置

(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();;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MyBatis 中,可以使用动态 SQL 来处理批量插入语句。下面是一个示例: ```xml <insert id="batchInsert" parameterType="java.util.List"> INSERT INTO my_table (column1, column2) VALUES <foreach collection="list" item="item" separator=","> (#{item.column1}, #{item.column2}) </foreach> </insert> ``` 上述代码中,我们使用 `<foreach>` 元素来循环遍历传入的 List 参数,并生成对应的插入语句。每个元素的属性值通过 `#{}` 来引用。在循环过程中,使用 `separator` 属性来指定分隔符,这里使用逗号分隔每个插入语句。 接下来,在 Java 代码中调用这个批量插入语句: ```java List<MyObject> myList = new ArrayList<>(); // 添加要插入的对象到 myList 中 try (SqlSession sqlSession = sqlSessionFactory.openSession()) { MyMapper myMapper = sqlSession.getMapper(MyMapper.class); myMapper.batchInsert(myList); sqlSession.commit(); } catch (Exception e) { // 处理异常 } ``` 上述代码中,首先创建一个包含要插入的对象的 List。然后,通过 SqlSession 和 Mapper 接口来执行批量插入操作。最后,提交事务并处理异常。 注意,需要在 MyBatis 的配置文件中配置你的 Mapper 接口和对应的 SQL 映射。这个示例中的 `MyMapper` 需要定义一个与 XML 中 `<insert>` 标签的 id 属性相同的方法。 这就是使用 MyBatis 进行批量插入的动态 SQL 的基本方法。你可以根据具体需求进行调整和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小镇男孩~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值