MyBatis的基本操作(02)-----Seeeion.commit引起事务的提交,多条件查询,智能标签的应用,ResultMap结果映射

Posted 风骚少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis的基本操作(02)-----Seeeion.commit引起事务的提交,多条件查询,智能标签的应用,ResultMap结果映射相关的知识,希望对你有一定的参考价值。

一,为什么session.commit()可以引起事务的提交?

进入commit()方法查看源码

进入SqlSession.class文件之后,Ctrl+H弹出右边的框,选择DeFaultSqlSession

找到COMMIt()方法的重载,ctrl+左键进入源码进行下一步的剖析

在最底层的commit()方法里边进行了事务的提交,所以SqlSession.commit()方法可以引起事务的提交

 

二,ResultMap的结果映射

注意:ResultMap不可以和ResultType共存

为什么使用ResultMap?  

主要解决数据表中的列名和数据库实体类的属性名不一致的问题

ResultMap的使用步骤:

在映射文件中,创建一个节点

这里的property对应的是实体类的属性名,column对应的是数据表中的列名

在select节点中,将ResultType改为ResultMap并将值改为创建好的节点的id属性值

三,多条件查询

1.普通的多条件查询

//多条件查询
    public List<book> selectMultMap(Map<String,Object> map);
  <!--多条件查询-->
    <select id="selectMultMap" resultMap="myBook">
        select * from book where bookName like \'%\' #{bookName} \'%\' and bookprice>#{bookprice}
    </select>
 @Test
    public void test4(){

        SqlSession sqlSession= MyBatisUtil.getSession();
        IBookDao mapper = sqlSession.getMapper(IBookDao.class);
        Map<String,Object> map=new HashMap<String,Object>();

        map.put("bookName","");
        map.put("bookprice",100);
        List<book> books = mapper.selectMultMap(map);
        for(book item:books){
            System.out.println(item.getBookName());
        }

        sqlSession.close();
    }

 

 

2.多条件索引查询

 

//多条件索引查询
    public List<book> selectMultIndex(String bookname,Integer bookprice);
  <!--多条件索引查询-->
    <select id="selectMultIndex" resultMap="myBook">
        select * from book where bookName like \'%\' #{0} \'%\' and bookprice>#{1}
    </select>
 @Test
    public void test5(){

        SqlSession sqlSession= MyBatisUtil.getSession();
        IBookDao mapper = sqlSession.getMapper(IBookDao.class);

        List<book> list = mapper.selectMultIndex("", 300);
        for(book item:list){
            System.out.println(item.getBookName());
        }
        sqlSession.close();
    }e[\'

 

 

 

四,添加后返回自增列的值

 当我们需要拿到新添加的列的主键Id的时候:

在<insert>节点中,在书写一个<selectKey>节点

!!!需要注意的是:由于主键Id是自增的,在Sql语句中我们是不用添加的,所以这里声明的keyProperty的作用就是将其赋给Id

 

 

五,工具类、

 

将一些重复性很大的代码放在一个类中,调用时直接通过类的方法来调用,减少代码的书写量

 

例如:将这几行代封装在一个类,以后需要用到时就不需要在进行书写,直接调用

 

String path="mybatis-config.xml";

            InputStream is= Resources.getResourceAsStream(path);
            SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
            SqlSession sqlSession =factory.openSession();

 

public class MyBatisUtil {


    static String path="mybatis-config.xml";
     static InputStream is;
    static SqlSessionFactory factory;

    static {
        try {
            is= Resources.getResourceAsStream(path);
            factory=new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSession(){
        return factory.openSession(true);
    }
}

 

 

六,智能标签

智能标签分为:

if  where  foreaachArray[数组类型]  foreachList<包装类型Integer>  foreachList<自定义类型>

//智能标签if查询
    public List<book> selectIf(book bok);
    //foreach array
    public List<book> foreachArray(int[] ids);
    //foreach List
    public List<book> foreachArrayList(List<Integer> list);
    //foreach 自定义类型
    public List<book> foreachArrayBook(List<book> list);


if where

 <select id="selectIf" resultMap="myBook">
    SELECT * from book
    <where>
        <if test="bookName!=null">
            and bookName like \'%\' #{bookName} \'%\'
        </if>
        <if test="bookprice!=null">
            and bookprice>#{bookprice}
        </if>
    </where>
</select>

foreaachArray[数组类型]  foreachList<包装类型Integer>  foreachList<自定义类型>

 <!--数组-->
    <select id="foreachArray" resultMap="myBook">
        SELECT * from book
        <where>
           bookId IN
            <foreach collection="array" open="(" close=")" separator="," item="myid">
                #{myid}
            </foreach>
        </where>
    </select>
    <!--List集合-->
    <select id="foreachArrayList" resultMap="myBook">
        SELECT * from book
        <where>
            bookId IN
            <foreach collection="list" open="(" close=")" separator="," item="myid">
                #{myid}
            </foreach>
        </where>
    </select>
    <!--自定义类型的List集合-->
    <select id="foreachArrayBook" resultMap="myBook">
        SELECT * from book
        <where>
            bookId IN
            <foreach collection="list" open="(" close=")" separator="," item="books">
                #{books.bookId}
            </foreach>
        </where>
    </select>

 

以上是关于MyBatis的基本操作(02)-----Seeeion.commit引起事务的提交,多条件查询,智能标签的应用,ResultMap结果映射的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis-02:CRUD操作配置解析

MyBatis 学习总结 02 对表执行增删改查(CRUD)操作 OLD

e774. 创建JList组件

02_基本的crud操作

02-mybatis-plus更新操作&自动填充&乐观锁

MyBatis的基本操作(02)-----Seeeion.commit引起事务的提交,多条件查询,智能标签的应用,ResultMap结果映射