mybatis映射文件详解

KLQ 2020-07-13 16:19:21 java常见问答 6360

你对于mybatis映射文件有多了解呢?下面的文章要给大家讲到的就是和这方面相关的内容,下面一起来详细的看一下吧。

在映射文件当中,mapper元素是映射文件的根元素,其他的标签都是它的子元素。

select

用于映射查询语句,从数据库当中读出数据,组装数据给业务开发人员。

上面的语句当中,唯一标识为findCustomerById。

它接受一个Integer类型的参数,并且返回一个Customer类型的对象。

下面是它的常见属性:

常见属性

insert

用于映射插入语句,在执行完语句之后,返回一个表示插入记录数的整数。

它的常见属性除了包含select的属性之外,还有另外的三种属性:

三种属性

实例代码:

<insert id="addCustomer" parameterType="com.itheima.po.Customer" keyProperty="id" useGeneratedKeys="true">
        INSERT INTO t_customer(username,jobs,phone) VALUES (#{username}, #{jobs}, #{phone})
</insert>
@Test
    public void addCustomerTest() throws Exception {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        Customer customer = new Customer();
        customer.setUsername("keke");
        customer.setJobs("student");
        customer.setPhone("13553423238");
        int rows = sqlSession.insert("com.itheima.mapper.CustomerMapper.addCustomer", customer);
        System.out.println(customer.getId());
        if(rows > 0) {
            System.out.println("您成功插入了"+rows+"条数据");
        }else {
            System.out.println("执行插入操作失败!!!");
        }
        sqlSession.commit();
        sqlSession.close();
    }

insert和update有一个子标签selectKey。

下面的话,用selectKey标签来实现主键自动增长,以此来解释它的作用:

<insert id="addCustomer" parameterType="com.itheima.po.Customer">
    <selectKey keyProperty="id" resultType="Integer" order="BEFORE">
        select if(max(id) is null, 1, max(id)+1) as new newId from t_customer
    </selectKey>
    INSERT INTO t_customer(id,username,jobs,phone) VALUES (#{id},#{username}, #{jobs}, #{phone})

</insert>

selectKey元素有keyProperty,resultType,order和statementType,order属性能够设置成BEFORE和AFTER,BEFORE会先执行selectKey,再执行插入语句,AFTER会先执行插入语句,再执行selectKey。

update和delete

update映射更新语句,执行之后返回一个整数,表示更新的条数。

delete映射删除语句,执行之后返回一个整数,代表删除的条数。

它的属性基本上是和select相同的。

sql

可以用SQL标签定义一段SQL语句,之后,可以用include标签进行重用。

如下:

<sql id="customerId">
        FROM t_customer WHERE id = #{id}
    </sql>
<select id="findCustomerById" parameterType="Integer" resultType="com.itheima.po.Customer">
        SELECT * 
    
    <include refid="customerId"/>
</select>

resultMap

表示结果映射集,定义映射规则,级联的更新以及定义类型的转换等。

元素结构:

<resultMap id="" type="">
    <constructor>
        <!-- 类在实例化时,用来注入结果到构造方法中-->
        <idArg></idArg>
        <!-- ID参数;标记结果作为ID -->
        <arg/>
        <!-- 注入到构造方法的一个普通结果 -->
    </constructor>
    <id/>
    <!-- 用来表示哪个列是主键 -->
    <result/>
    <!-- 注入到字段或JavaBean属性的普通结果 -->
    <association property="" />
    <!-- 用于一对一关联 -->
    <discriminator javaType="">
        <!-- 使用结果值来决定哪个结果集映射 -->
        <case value=""></case>
        <!-- 基于某些值的结果映射 -->
    </discriminator>
</resultMap>

实例代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.UserMapper">
    <resultMap id="resultMap" type="com.itheima.po.User">
        <id property="id" column="t_id"/>
        <result property="name" column="t_name"/>
        <result property="age" column="t_age"/>
    </resultMap>
    <select id="findAllUser" resultMap="resultMap">
        SELECT * FROM t_user
    </select>
</mapper>

写一个相应的测试方法:

@Test
    public void findAllUserTest() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List
<User> list = sqlSession.selectList("com.itheima.mapper.UserMapper.findAllUser");
        for (User user : list) {
            System.out.println(user);
        }
        sqlSession.close();
    }

运行结果:

DEBUG [main] - ==>  Preparing: SELECT * FROM t_user 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 3
User [id=1, name=lucy, age=25]
User [id=2, name=lili, age=20]
User [id=3, name=jim, age=20]

以上的内容你都了解了吗?更多相关知识,可以继续关注奇Q工具网的常见问题栏目来进行了解呢。

推荐阅读:

mybatis分页查询如何实现?实现方式整理

mybatis逆向工程详解,什么是逆向工程?

mybatis配置开启自动下划线转驼峰命名详解