MyBatis-03 MyBatis XML方式之select元素


概述

撸完Mybatis-02Mybatis XML方式概述及配置步骤之后,准备工作准备完毕,就可以开始学习具体的用法了。我们先来看下select元素


select用法

权限系统中,几个常见的业务,需要查询出系统中的用户、角色、权限等数据, 纯JDBC时,需要写查询语句,并且对结果集进行手工处理,将结果映射到对象的属性中。 而如果使用Mybatis,只需要在XML中添加一个select元素,写一个SQL,做一些简单的配置,就可以将结果集映射到对象中。


根据用户id查询用户信息

1.UserMapper接口中添加接口方法

package com.artisan.mybatis.xml.mapper;

import com.artisan.mybatis.xml.domain.SysUser;

public interface UserMapper {
    /**
     * 
     * 
     * @Title: selectSysUserById
     * 
     * @Description: 通过ID查询系统用户
     * 
     * @param id
     * @return
     * 
     * @return: SysUser
     */
    SysUser selectSysUserById(Long id);

}

因为ID是主键,所以只可能查询出一个SysUser ,所以selectSysUserById直接返回SysUser对象即可。


2. UserMapper.xml中配置resultMap和select元素

首先查看下数据库SysUser的字段

这里写图片描述

再来看下SysUser实体类中的属性

这里写图片描述

数据库字段和实体类中的属性名称不一致,两种方式

  • 配置resultMap 映射 (selectSysUserById演示)

  • 通过别名的方式 (selectAll 演示)


配置之前,先来探讨一个问题: 前面创建接口和XML时提到过,接口和XML是通过将namespace设置为接口的全限定名来进行关联的,那么接口中的方法和XML又是怎么关联的呢?

Mybatis 是通过 xml中的select标签的ID和接口名称一致这种方式将接口方法和XML中定义的SQL语句关联起来的,如果接口方法中没有和XML 中的id属性相对应的值,启动程序便会报错。

映射XML和接口的命名需要符合如下规范:

  • 当只是用XML而不适用接口的时候,namespace的值可以设置为任意不重复的名称

  • 标签的id属性在任何时候都不能出现英文句号,并且同一个命名空间下不能出现重复的id

  • 因为接口方法是可以重载的,所以接口中可以出现多个同名但参数不同的方法,但是xml中的id不能重复。

搞清了这些,我们来配置UserMapper.xml

<?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接口和XML文件关联的时候, namespace的值就需要配置成接口的全限定名称 -->
<mapper namespace="com.artisan.mybatis.xml.mapper.UserMapper">

    <!-- 通过resultMap标签配置Java对象和查询结果列的对应关系 -->
    <resultMap id="userMap" 
               type="com.artisan.mybatis.xml.domain.SysUser">
        <id column="id" property="id" />
        <result property="userName" column="user_name" />
        <result property="userPassword" column="user_password" />
        <result property="userEmail" column="user_email" />
        <result property="userInfo" column="user_info" />
        <result property="headImg" column="head_img" jdbcType="BLOB" />
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP" />
    </resultMap>

    <!-- 通过ID查询系统用户 -->
    <select id="selectSysUserById" parameterType="Long" resultMap="userMap">
        select
            a.id,
            a.user_name,
            a.user_password,
            a.user_email,
            a.user_info,
            a.head_img,
            a.create_time
        from
            sys_user a
        where id = #{id}
    </select>

</mapper>   

解释下XML中的一些标签和属性的作用

  • <select>:映射查询语句使用的标签

  • id : 命名空间的唯一标示,代表这个语句

  • resultMap:用于设置返回值的类型和映射关系

  • #{id}: Mybatis SQL中使用预编译参数的一种方式,大括号中的id是传入的参数名。 表示使用preparedstatement设置占位符号并将输入变量id传到sql。


下面看下接口方法的返回值要如何定义

接口中定义的返回值类型必须和XML中配置的ResultType类型一致,否则就会因为类型不一致而抛出异常。 返回值类型是有XML中的resultType(或者resultMap中的type)决定的,不是由接口中所写的返回值类型决定的(这里我们建的是XML方式,先忽略注解的情况)


查询全部的SysUser

添加接口方法

/**
     * 
     * 
     * @Title: selectAll
     * 
     * @Description: 查询全部的SysUser
     * 
     * @return
     * 
     * @return: List<SysUser>
     */
    List<SysUser> selectAll();

配置UserMapper.xml

<!-- 通过全部的系统用户 -->
    <select id="selectAll" resultType="com.artisan.mybatis.xml.domain.SysUser">
        select
            a.id id,
            a.user_name userName,
            a.user_password userPassword,
            a.user_email userEmail,
            a.user_info userInfo,
            a.head_img headImg,
            a.create_time createTime
        from
            sys_user a
    </select>

我们看到这个接口中对应方法的返回类型为 List<SysUser> , 为什么不是SysUser呢?

当返回值最多只有1个结果的时候(可以是0个),可以将接口返回值定义为SysUser,而不是List<SysUser>

当执行的SQL返回多个结果时,必须使用List<SysUser> 或者SysUser[] 作为返回值,如果使用SysUser,会抛出TooManyResultsException异常。

观察一下UserMapper.xml中的selectSysUserById和selectAll的区别

selectSysUserById使用了resultMap来设置结果映射,而selectAll使用resultType直接指定了返回结果的类型。 可以发现,如果使用resultType来设置返回结果的类型,需要在SQL中为所有列名和属性名不一致的列设置别名,通过设置别名使最终的查询结果和resultType指定对象的属性名保持一致,进而实现自动映射.


单元测试

基础测试类BaseMapperTest

这个类用于被继承,主要功能是加载配置文件,提供获取SqlSession的方法

在src/test/java中创建包 com.artisan.mybatis.xml.mapper

package com.artisan.mybatis.xml.mapper;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.junit.BeforeClass;

public class BaseMapperTest {

    private static Logger logger = Logger.getLogger(BaseMapperTest.class);
    private static SqlSessionFactory sessionFactory;

    @BeforeClass
    public static void init() {
        try {
            // 根据mybatis的配置文件创建sqlSessionFactory
            String config = "mybatis-config.xml";
            Reader reader = Resources.getResourceAsReader(config);

            sessionFactory = new SqlSessionFactoryBuilder().build(reader);
            logger.info("sessionFactory bulit successfully");

            reader.close();
            logger.info("reader close successfully");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession() {
        return sessionFactory.openSession();
    }

}
package com.artisan.mybatis.xml.mapper;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Assert;
import org.junit.Test;

import com.artisan.mybatis.xml.domain.SysUser;

/**
 * 
 * 
 * @ClassName: UserMapperTest
 * 
 * @Description: UserMapperTest 单元测试类
 * 
 * @author: Mr.Yang
 * 
 * @date: 2018年4月14日 下午1:59:31
 */
public class UserMapperTest extends BaseMapperTest {

    private static Logger logger = Logger.getLogger(UserMapperTest.class);

    @Test
    public void selectSysUserByIdTest() {
        logger.info("selectSysUserByIdTest");
        // 获取SqlSession
        SqlSession sqlSession = getSqlSession();
        try {
            // 获取UserMapper接口
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 调用selectSysUserById方法,查询id=1的用户
            SysUser sysUser = userMapper.selectSysUserById((long) 1);
            // sysUser不为空
            Assert.assertNotNull(sysUser);
            // userName = "admin"
            Assert.assertEquals("admin", sysUser.getUserName());
            logger.info(sysUser);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
            logger.info("sqlSession close successfully ");
        }
    }

    @Test
    public void selectAllTest() {
        logger.info("selectAllTest");
        // 获取SqlSession
        SqlSession sqlSession = getSqlSession();
        try {
            // 获取UserMapper接口
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 调用selectAll,查询全部用户
            List<SysUser> userList = userMapper.selectAll();
            // 结果不为空
            Assert.assertNotNull(userList);
            // 结果大于0
            Assert.assertTrue(userList.size() > 0);

            logger.info("userList总数为:" + userList.size());
            for (SysUser sysUser : userList) {
                logger.info(sysUser);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
            logger.info("sqlSession close successfully ");
        }
    }

}

输出日志:

2018-04-15 14:11:47,623  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-15 14:11:47,627  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-15 14:11:47,630  INFO [main] (UserMapperTest.java:29) - selectSysUserByIdTest
2018-04-15 14:11:48,258 DEBUG [main] (BaseJdbcLogger.java:142) - ==>  Preparing: select a.id, a.user_name, a.user_password, a.user_email, a.user_info, a.head_img, a.create_time from sys_user a where id = ? 
2018-04-15 14:11:48,347 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 1(Long)
2018-04-15 14:11:48,379 TRACE [main] (BaseJdbcLogger.java:148) - <==    Columns: id, user_name, user_password, user_email, user_info, head_img, create_time
2018-04-15 14:11:48,380 TRACE [main] (BaseJdbcLogger.java:148) - <==        Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0
2018-04-15 14:11:48,385 DEBUG [main] (BaseJdbcLogger.java:142) - <==      Total: 1
2018-04-15 14:11:48,386  INFO [main] (UserMapperTest.java:41) - SysUser [id=1, userName=admin, userPassword=123456, userEmail=admin@artisan.com, userInfo=管理员用户, headImg=[18, 49, 35, 18, 48], createTime=Fri Apr 13 21:12:47 BOT 2018]
2018-04-15 14:11:48,392  INFO [main] (UserMapperTest.java:46) - sqlSession close successfully 
2018-04-15 14:11:48,393  INFO [main] (UserMapperTest.java:52) - selectAllTest
2018-04-15 14:11:48,402 DEBUG [main] (BaseJdbcLogger.java:142) - ==>  Preparing: select a.id id, a.user_name userName, a.user_password userPassword, a.user_email userEmail, a.user_info userInfo, a.head_img headImg, a.create_time createTime from sys_user a 
2018-04-15 14:11:48,403 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 
2018-04-15 14:11:48,404 TRACE [main] (BaseJdbcLogger.java:148) - <==    Columns: id, userName, userPassword, userEmail, userInfo, headImg, createTime
2018-04-15 14:11:48,405 TRACE [main] (BaseJdbcLogger.java:148) - <==        Row: 1, admin, 123456, admin@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0
2018-04-15 14:11:48,407 TRACE [main] (BaseJdbcLogger.java:148) - <==        Row: 1001, test, 123456, test@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0
2018-04-15 14:11:48,412 DEBUG [main] (BaseJdbcLogger.java:142) - <==      Total: 2
2018-04-15 14:11:48,412  INFO [main] (UserMapperTest.java:65) - userList总数为:2
2018-04-15 14:11:48,413  INFO [main] (UserMapperTest.java:67) - SysUser [id=1, userName=admin, userPassword=123456, userEmail=admin@artisan.com, userInfo=管理员用户, headImg=[18, 49, 35, 18, 48], createTime=Fri Apr 13 21:12:47 BOT 2018]
2018-04-15 14:11:48,413  INFO [main] (UserMapperTest.java:67) - SysUser [id=1001, userName=test, userPassword=123456, userEmail=test@artisan.com, userInfo=测试用户, headImg=[18, 49, 35, 18, 48], createTime=Fri Apr 13 21:12:47 BOT 2018]
2018-04-15 14:11:48,414  INFO [main] (UserMapperTest.java:73) - sqlSession close successfully 

全局属性mapUnderscoreToCamelCase

在数据库中,由于大部分数据库设置不区分大小写,一次下画线方式的命名很常见,比如user_name, user_email . 在Java中,一般都是用驼峰式命名,比如userName,userEmail

因为数据库和Java中的这两种命名方式很常见,为此Mybatis提供了一个全局属性mapUnderscoreToCamelCase,通过配置这个属性为true可以自动将下画线方式命名的数据库列映射到java对象驼峰式命名属性中。 这个属性默认为false,若想使用,需要在mybatis全局配置文件中settings节点下增加如下配置

<!-- 通过配置这个属性为true可以自动将下画线方式命名的数据库列映射到java对象驼峰式命名属性中 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>

1.增加UserMapper接口

// 仅仅是为了测试mapUnderscoreToCamelCase 全局属性
SysUser selectUserByIdUseMapUnderscoreToCamelCase(Long id);

2.配置UserMapper.xml

<!-- 通过ID查询系统用户 ,配合mapUnderscoreToCamelCase设置为true -->
<select id="selectUserByIdUseMapUnderscoreToCamelCase" parameterType="Long" resultType="com.artisan.mybatis.xml.domain.SysUser">
        select
            a.id,
            a.user_name,
            a.user_password,
            a.user_email,
            a.user_info,
            a.head_img,
            a.create_time
        from
            sys_user a
        where id = #{id}
    </select>

注意使用的是resultType ,而不是resutlMap

3.单元测试

@Test
    public void selectUserByIdUseMapUnderscoreToCamelCaseTest() {
        logger.info("selectUserByIdUseMapUnderscoreToCamelCaseTest");
        // 获取SqlSession
        SqlSession sqlSession = getSqlSession();
        try {
            // 获取UserMapper接口
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 调用selectSysUserById方法,查询id=1的用户
            SysUser sysUser = userMapper.selectUserByIdUseMapUnderscoreToCamelCase((long) 1001);
            // sysUser不为空
            Assert.assertNotNull(sysUser);
            // userName = "admin"
            Assert.assertEquals("test", sysUser.getUserName());
            logger.info(sysUser);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
            logger.info("sqlSession close successfully ");
        }
    }

日志

2018-04-15 14:23:39,196  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-15 14:23:39,200  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-15 14:23:39,204  INFO [main] (UserMapperTest.java:79) - selectUserByIdUseMapUnderscoreToCamelCaseTest
2018-04-15 14:23:39,802 DEBUG [main] (BaseJdbcLogger.java:142) - ==>  Preparing: select a.id, a.user_name, a.user_password, a.user_email, a.user_info, a.head_img, a.create_time from sys_user a where id = ? 
2018-04-15 14:23:39,896 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 1001(Long)
2018-04-15 14:23:39,932 TRACE [main] (BaseJdbcLogger.java:148) - <==    Columns: id, user_name, user_password, user_email, user_info, head_img, create_time
2018-04-15 14:23:39,933 TRACE [main] (BaseJdbcLogger.java:148) - <==        Row: 1001, test, 123456, test@artisan.com, <<BLOB>>, <<BLOB>>, 2018-04-13 21:12:47.0
2018-04-15 14:23:39,936 DEBUG [main] (BaseJdbcLogger.java:142) - <==      Total: 1
2018-04-15 14:23:39,939  INFO [main] (UserMapperTest.java:96) - sqlSession close successfully 

多表关联查询

需求一: 根据用户id返回该用户所拥有的角色,返回的结果为角色集合,结果只有角色的信息即可,不用包含其他字段信息。

根据我们的数据模型可知,涉及到3个表, sys_user 、sys_role 、sys_user_role 。

1.UserMapper接口增加接口方法
    /**
     * 
     * 
     * @Title: selectRoleByUserId
     * 
     * @Description: 根据用户ID查询用户角色
     * 
     * @param userId
     * @return
     * 
     * @return: List<SysRole>
     */
    List<SysRole> selectRoleListByUserId(Long userId);
2. UserMapper.xml 配置语句
    <!-- 根据用户ID查询用户角色 -->
    <select id="selectRoleListByUserId" parameterType="Long"  resultType="com.artisan.mybatis.xml.domain.SysRole">
        SELECT
            c.id,
            c.role_name roleName,
            c.enabled,
            c.create_by createBy,
            c.create_time createTime
        FROM
             sys_user a
        JOIN sys_user_role b ON a.id = b.user_id
        JOIN sys_role c ON b.role_id = c.id
        WHERE
            a.id = #{userId}
    </select>
3. 单元测试
@Test
    public void selectRoleListByUserIdTest() {
        logger.info("selectRoleListByUserIdTest");
        // 获取SqlSession
        SqlSession sqlSession = getSqlSession();
        try {
            // 获取UserMapper接口
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 调用selectRoleListByUserId方法,查询用户id=1的角色
            List<SysRole> roleList = userMapper.selectRoleListByUserId((long) 1);
            // roleList不为空
            Assert.assertNotNull(roleList);
            // roleList > 0
            Assert.assertTrue(roleList.size() > 0);

            logger.info(roleList);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
            logger.info("sqlSession close successfully ");
        }
    }

选中方法名,运行单元测试

2018-04-15 15:45:39,368  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-15 15:45:39,373  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-15 15:45:39,377  INFO [main] (UserMapperTest.java:103) - selectRoleListByUserIdTest
2018-04-15 15:45:40,086 DEBUG [main] (BaseJdbcLogger.java:142) - ==>  Preparing: SELECT c.id, c.role_name roleName, c.enabled, c.create_by createBy, c.create_time createTime FROM sys_user a JOIN sys_user_role b ON a.id = b.user_id JOIN sys_role c ON b.role_id = c.id WHERE a.id = ? 
2018-04-15 15:45:40,212 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 1(Long)
2018-04-15 15:45:40,262 TRACE [main] (BaseJdbcLogger.java:148) - <==    Columns: id, roleName, enabled, createBy, createTime
2018-04-15 15:45:40,263 TRACE [main] (BaseJdbcLogger.java:148) - <==        Row: 1, 管理员, 1, 1, 2018-04-13 21:12:46.0
2018-04-15 15:45:40,269 TRACE [main] (BaseJdbcLogger.java:148) - <==        Row: 2, 普通用户, 1, 1, 2018-04-13 21:12:46.0
2018-04-15 15:45:40,270 DEBUG [main] (BaseJdbcLogger.java:142) - <==      Total: 2
2018-04-15 15:45:40,271  INFO [main] (UserMapperTest.java:116) - [SysRole [id=1, roleName=管理员, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null], SysRole [id=2, roleName=普通用户, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null]]
2018-04-15 15:45:40,287  INFO [main] (UserMapperTest.java:121) - sqlSession close successfully 

符合数据库中的记录 。
这里写图片描述


需求二:假设有个需求(仅仅为了说明用法):以需求一为基础,不仅要包含sys_role的信息,同时还要包含当前用户的部分信息(不考虑嵌套的情况)

比如增加查询列 user_name , user_email 这个时候该如何设置resultType呢?

两种简单的方法

  • 第一种方法是在SysRole对象中直接添加userName,userEmail属性,这样仍然使用SysRole作为返回值

  • 第二种方法创建一个子类继承SysRole,将userName,userEmail作为子类的属性,将resultType的返回对象设置为子类 。 (这种方式适合在需要少量的额外字段时使用,如果需要其他表中大量列的时候就不合适了。)

在不考虑嵌套XML配置的情况下,我们来演示下第一种方法

1.SysRole添加 SysUser属性
/**
* 用户信息
*/
private SysUser user;

setter/getter
2.UserMapper.xml

增加


    <!-- 根据用户ID查询用户角色 ,增加sys_user中的部分字段 -->
    <select id="selectRoleListByUserIdMoreInfo" parameterType="Long"  resultType="com.artisan.mybatis.xml.domain.SysRole">
        SELECT
            c.id,
            c.role_name roleName,
            c.enabled,
            c.create_by createBy,
            c.create_time createTime,
            a.user_name as 'user.userName',
            a.user_email as 'user.userEmail'
        FROM
             sys_user a
        JOIN sys_user_role b ON a.id = b.user_id
        JOIN sys_role c ON b.role_id = c.id
        WHERE
            a.id = #{userId}
    </select>

注意看查询列增加的两行

a.user_name as 'user.userName',
a.user_email as 'user.userEmail'

这里设置别名的时候,使用的是“user.属性名”,user是SysRole中刚刚增加的属性,userName和userEmail是SysUser对象的属性,通过这种方式可以直接将值赋给user字段中的属性

3.单元测试
@Test
    public void selectRoleListByUserIdMoreInfoTest() {
        logger.info("selectRoleListByUserIdMoreInfoTest");
        // 获取SqlSession
        SqlSession sqlSession = getSqlSession();
        try {
            // 获取UserMapper接口
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 调用selectRoleListByUserId方法,查询用户id=1的角色
            List<SysRole> roleList = userMapper.selectRoleListByUserIdMoreInfo((long) 1);
            // roleList不为空
            Assert.assertNotNull(roleList);
            // roleList > 0
            Assert.assertTrue(roleList.size() > 0);

            logger.info(roleList);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
            logger.info("sqlSession close successfully ");
        }
    }

日志

2018-04-15 17:56:06,453  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-15 17:56:06,457  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-15 17:56:06,460  INFO [main] (UserMapperTest.java:127) - selectRoleListByUserIdMoreInfoTest
2018-04-15 17:56:06,987 DEBUG [main] (BaseJdbcLogger.java:142) - ==>  Preparing: SELECT c.id, c.role_name roleName, c.enabled, c.create_by createBy, c.create_time createTime, a.user_name as 'user.userName', a.user_email as 'user.userEmail' FROM sys_user a JOIN sys_user_role b ON a.id = b.user_id JOIN sys_role c ON b.role_id = c.id WHERE a.id = ? 
2018-04-15 17:56:07,085 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 1(Long)
2018-04-15 17:56:07,119 TRACE [main] (BaseJdbcLogger.java:148) - <==    Columns: id, roleName, enabled, createBy, createTime, user.userName, user.userEmail
2018-04-15 17:56:07,119 TRACE [main] (BaseJdbcLogger.java:148) - <==        Row: 1, 管理员, 1, 1, 2018-04-13 21:12:46.0, admin, admin@artisan.com
2018-04-15 17:56:07,124 TRACE [main] (BaseJdbcLogger.java:148) - <==        Row: 2, 普通用户, 1, 1, 2018-04-13 21:12:46.0, admin, admin@artisan.com
2018-04-15 17:56:07,126 DEBUG [main] (BaseJdbcLogger.java:142) - <==      Total: 2
2018-04-15 17:56:07,126  INFO [main] (UserMapperTest.java:140) - [SysRole [id=1, roleName=管理员, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=SysUser [id=null, userName=admin, userPassword=null, userEmail=admin@artisan.com, userInfo=null, headImg=null, createTime=null], privilegeList=null], SysRole [id=2, roleName=普通用户, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=SysUser [id=null, userName=admin, userPassword=null, userEmail=admin@artisan.com, userInfo=null, headImg=null, createTime=null], privilegeList=null]]
2018-04-15 17:56:07,133  INFO [main] (UserMapperTest.java:145) - sqlSession close successfully 

为了更加直观,我们在Assert.assertNotNull(roleList); 加上断点,调测一下,如下图所示

这里写图片描述


小结

Select元素的用法总结到此,接下来我们来开启insert元素的用法

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Mybatis-Plus可以使用注解的方式来代替XML文件,这样可以减少开发人员的工作量,提高开发效率。同时,Mybatis-Plus还提供了一些方便的工具类和方法,使得开发更加简单和快捷。因此,使用Mybatis-Plus可以让开发更加高效和便捷。 ### 回答2: mybatis-plus是基于mybatis的一个增强工具,其致力于简化mybatis的开发流程,其中之一的特点就是开发者可以不需要编写繁琐的XML文件即可完成CRUD操作。 mybatis开发中,我们需要按照数据表的结构编写对应的实体类、Mapper接口和XML文件,对于简单的查询可以直接在Mapper接口中通过注解实现,但对于大多数复杂的SQL操作,还是需要编写XML文件来实现。然而,这种方式会使得程序结构变得复杂,且XML文件的维护和调试也很麻烦,为此mybatis-plus提供了一种更加方便和简单的方式:使用注解代替XMLmybatis-plus的Mapper接口中提供了多种注解,包括@Insert、@Update、@Delete、@Select等等。使用这些注解可以直接在Mapper接口中完成CRUD操作,并且还可以使用@Param注解来传递参数。例如,一个简单的查询可以这样实现: @Select("SELECT * FROM user WHERE id = #{id}") User getUserById(@Param("id") Long id); 使用这种方式,就可以避免编写XML文件,不仅可以简化开发流程,还可以使程序结构变得更加清晰,易于维护和调试。当然,如果需要执行较为复杂的SQL语句,mybatis-plus也提供了一些高级用法,可以在不编写XML文件的情况下实现。 总之,mybatis-plus的不用写XML文件的特点使得开发变得更为简洁高效,提高了程序的可读性和可维护性,让开发者可以更加专注于业务逻辑的处理。 ### 回答3: mybatis-plus是基于mybatis的一个增强工具,可以极大地优化和简化mybatis的使用,其中之一便是省去了编写繁琐的xml文件。 目前,mybatis的使用方式一般是通过编写mapper接口和xml文件,其中mapper接口用于定义SQL语句,而xml文件则用于存放具体的SQL语句。这种方式需要我们手动编写大量的xml文件,而且xml文件的编写难免会遇到各种问题,容易出错。mybatis-plus则完全摆脱了这个麻烦。 mybatis-plus使用的方式是通过注解来实现,它提供了一系列的注解来帮助我们完成SQL语句的编写,这些注解包括@TableName、@TableId、@TableField等,在使用过程中,我们只需要在实体类中添加这些注解,然后调用mybatis-plus中提供的方法即可完成CRUD操作,非常简单方便。 除了简化了SQL语句的编写外,mybatis-plus还提供了很多其他的便利,如自动分页、代码生成器、性能分析等等,这些功能大大提高了开发效率和代码的可读性和可维护性。 总结起来,mybatis-plus的使用不需要编写繁琐的xml文件,省去了大量的力气,使开发更为简单快捷,同时提供了更多的实用功能,非常适合在项目中使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小小工匠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值