我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java MyBatis传出参数resultType和resultMap解读

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java MyBatis传出参数resultType和resultMap解读

MyBatis输出参数 resultType 和 resultMap

我们需要在 mybatis-config.xml 文件中加如下配置

<!--定义别名-->
    <typeAliases>
        <!--
            第一种方式:
            指定一个类型一个自定义别名
            type:自定义类型的全限定名称
            alias:别名
        -->
        <typeAlias type="com.mycompany.domain.User" alias="user" />
        <typeAlias type="com.mycompany.vo.ViewUser" alias="vUser" />
 
        <!--
          第二种方式
          <package> name是包名, 这个包中的所有类,类名就是别名(类名不区分大小写)
        -->
        <package name="com.mycompany.domain" />
        <package name="com.mycompany.vo" />
 
    </typeAliases>

文件完全内容如下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
 
<!--
    mybatis的主配置文件:主要定义了数据库的配置信息,SQL映射文件的位置
    1、约束文件
        <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
        mybatis-3-config.dtd:约束文件名称
    2、configuration:根标签
-->
<configuration>
 
    <!-- settings:mybatis全局行为 -->
    <settings>
        <!-- 设置mybatis输出日志 -->
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
 
    <!--定义别名-->
    <typeAliases>
        <!--
            第一种方式:
            指定一个类型一个自定义别名
            type:自定义类型的全限定名称
            alias:别名
        -->
        <typeAlias type="com.mycompany.domain.User" alias="user" />
        <typeAlias type="com.mycompany.vo.ViewUser" alias="vUser" />
 
        <!--
          第二种方式
          <package> name是包名, 这个包中的所有类,类名就是别名(类名不区分大小写)
        -->
        <package name="com.mycompany.domain" />
        <package name="com.mycompany.vo" />
 
    </typeAliases>
 
    <!--
        环境配置:数据库的连接信息
            default:必须和某个environment的id值一样
            告诉mybatis使用哪个数据库的连接信息(访问哪个数据库)
    -->
    <environments default="development">
 
        <!--
            environment:一个数据库的配置,环境
            id:一个唯一值(可自定义,表示环境的名称)
         -->
        <environment id="development">
            <!--
                transactionManaer:mybatis的事务类型
                    type:JDBC(表示使用JDBC中的Connection对象的commit,rollback做事务处理)
            -->
            <transactionManager type="JDBC"/>
            <!--
                dataSource:表示数据源,连接数据库的
                    type:表述数据源的类型,POOLED表示使用连接池
            -->
            <dataSource type="POOLED">
                <!--
                   driver, user, username, password 是固定的,不能自定义。
                -->
                <!-- 数据库驱动类名 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!-- 连接数据库的URL字符串 -->
                <property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
                <!-- 访问数据库的用户名 -->
                <property name="username" value="root"/>
                <!-- 访问数据库的密码 -->
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
 
        <!--表示线上的数据库,是项目真实使用的库-->
        <environment id="online">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/onlinedb"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
 
    </environments>
 
    <!-- sql mapper(SQL映射文件)的位置 -->
    <mappers>
        <!--
            一个mapper标签指定一个文件的位置
                从类路径开始的路径信息(target/classes)类路径
        -->
        <mapper resource="com/mycompany/dao/UserDao.xml"/>
    </mappers>
</configuration>

一、resultType

执行 sql 得到 ResultSet 转换的类型,使用类型的完全限定名或别名

1、简单类型

UserDao接口文件

public User selectUserByUserId(@Param("userId") Integer id);
 
List<User> selectMultiParam(@Param("username") String userName,
                                @Param("userage") Integer age);

UserDao.xml文件

<!--
    resultType:
            表示结果类型,SQL语句执行后得到ResultSet结果集,遍历这个结果集得到的Java对象类型
            值写Java对象的全限定名称
    1、resultType="vUser"
        mybatis-config.xml文件中第一种方式
        指定一个类型一个自定义别名
            type:自定义类型的全限定名称
            alias:别名
    2、resultType="ViewUser"
        mybatis-config.xml文件中第二种方式:
          <package> name是包名, 这个包中的所有类,类名就是别名(类名不区分大小写)
    注:
        resultType="User" 如果一个项目中有多个User类文件,会报错
        Could not resolve type alias 'User'.  Cause: java.lang.ClassNotFoundException: Cannot find class: User
    -->
    <select id="selectUserByUserId" resultType="User">
        select user_id,user_name,email,age
        from user
        where user_id = #{userId}
    </select>
 
    <!--多个参数,使用@Param命名-->
    <select id="selectMultiParam" resultType="com.mycompany.domain.User" >
        select user_id,user_name,email,age
        from user
        where user_name = #{username} or age = #{userage}
    </select>

TestMyBatis测试类

@Test
    public void testSelectUserByUserId(){
        try {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            User user = userDao.selectUserByUserId(1);
            System.out.println("user="+user);
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    @Test
    public void testSelectMultiParam(){
        try {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            List<User> userList = userDao.selectMultiParam("zhangsan",20);
            for(User user: userList){
                System.out.println("用户="+user);
            }
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2、Map类型

UserDao接口文件

//定义方法返回Map
    Map<Object,Object> selectMapById(Integer id);
UserDao.xml文件

<select id="selectMapById" resultType="java.util.HashMap">
        select user_id,user_name,email,age
        from user
        where user_id=#{userId}
    </select>

TestMyBatis测试类

@Test
    public void testSelectMapById(){
        try {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            Map<Object,Object> map = userDao.selectMapById(1);
            System.out.println("map=="+map);
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3、对象类型

UserDao接口文件

ViewUser selectUserReturnViewUser(@Param("userId") Integer id);

UserDao.xml文件

<!--
        1、resultType="vUser"
        mybatis-config.xml文件中第一种方式
        指定一个类型一个自定义别名
            type:自定义类型的全限定名称
            alias:别名
        2、resultType="ViewUser"
        mybatis-config.xml文件中第二种方式:
          <package> name是包名, 这个包中的所有类,类名就是别名(类名不区分大小写)
    -->
    <select id="selectUserReturnViewUser" resultType="ViewUser">
        select user_id,user_name
        from user
        where user_id = #{userId}
    </select>

TestMyBatis测试类

@Test
    public void testSelectUserReturnViewUser(){
        try {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            ViewUser user = userDao.selectUserReturnViewUser(1);
            System.out.println("ViewUser="+user);
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

注:

(1)如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身

(2)resultType 和 resultMap,不能同时使用

(3)resultType="User" 如果一个项目中有多个User类文件,会报错

Could not resolve type alias 'User'. Cause: java.lang.

ClassNotFoundException: Cannot find class: User

此时最好指定全限定名称

二、resultMap

resultMap 可以自定义 sql 的结果和 java 对象属性的映射关系;更灵活的把列值赋值给指定属性

常用在列名和 java 对象属性名不一样的情况

使用方式:

(1)先定义 resultMap,指定列名和属性的对应关系

(2)在<select>中把 resultType 替换为 resultMap

列名和Java对象属性名不一样时,有两种处理方式

(1)使用resultMap映射

(2)resultType的默认原则是 同名的列值赋值给同名的属性, 使用列别名(java对象的属性名)

如下Java类属性

public class User {
    private int userId;
    private String userName;
    private String email;
    private int age;
}
 
 
public class MyUser {
    private int myUserId;
    private String myUserName;
    private String myUserEmail;
    private int myUserAge;
}

UserDao接口文件


    List<User> selectAllUsers();
 
    List<MyUser> selectMyUser();
 
    List<MyUser> selectDiffColProperty();

UserDao.xml文件

<!--使用resultMap
        (1)先定义resultMap
        (2)在select标签,使用resultMap来引用定义
        id:自定义名称,表示定义的这个resultMap
        type:java类型的全限定名称
    -->
    <resultMap id="userMap" type="com.mycompany.domain.User">
        <!--列名和java属性的关系
            注解列,使用id标签
            column :列名(数据库表字段列名)
            property:java类型的属性名
        -->
        <!-- 主键列使用 id 标签-->
        <id column="user_id" property="userId" />
        <!-- 非主键列使用 result 标签-->
        <result column="user_name" property="userName" />
        <result column="email" property="email" />
        <result column="age" property="age" />
    </resultMap>
 
    <select id="selectAllUsers" resultMap="userMap">
        select user_id,user_name,email,age
        from user
        where user_id=#{userId}
    </select>
 
    <resultMap id="myUserMap" type="com.mycompany.domain.MyUser">
        <id column="user_id" property="myUserId" />
        <result column="user_name" property="myUserName" />
        <result column="email" property="myUserEmail" />
        <result column="age" property="myUserAge" />
    </resultMap>
 
    <!--列名和属性名不一样:第一种方式
        使用resultMap映射
    -->
    <select id="selectMyUser" resultMap="myUserMap">
        select user_id,user_name,email,age
        from user
    </select>
 
    <!--列名和属性名不一样:第二种方式
       resultType的默认原则是 同名的列值赋值给同名的属性, 使用列别名(java对象的属性名)
    -->
    <select id="selectDiffColProperty" resultType="com.mycompany.domain.MyUser">
        select user_id as myUserId ,user_name as myUserName, email as myUserEmail , age myUserAge
        from user
    </select>

TestMyBatis测试类

@Test
    public void testSelectAllUsers(){
        try {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            List<User> userList = userDao.selectAllUsers();
            for(User user: userList){
                System.out.println("用户="+user);
            }
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    @Test
    public void testSelectMyUser(){
        try {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            List<MyUser> userList = userDao.selectMyUser();
            for(MyUser user: userList){
                System.out.println("MyUser用户="+user);
            }
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    @Test
    public void testSelectDiffColProperty(){
        try {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            List<MyUser> userList = userDao.selectDiffColProperty();
            for(MyUser user: userList){
                System.out.println("MyUser用户="+user);
            }
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

三、模糊 like 

模糊查询的实现有两种方式, 一是 java 代码中给查询数据加上“%” ; 二是在 mapper 文件 sql 语句的条件位置加上“%”

UserDao接口文件


    List<User> selectLikeOne(String name);
 
    
    List<User> selectLikeTwo(String name);

UserDao.xml文件

<!--第一种 like ,java代码指定 like的内容-->
    <select id="selectLikeOne" resultType="com.mycompany.domain.User">
        select user_id, user_name, email, age
        from user
        where user_name like #{user_name}
    </select>
 
    <!--第二种方式:在mapper文件中拼接 like的内容-->
    <select id="selectLikeTwo" resultType="com.mycompany.domain.User">
        select user_id, user_name, email, age
        from user
        where user_name like "%" #{user_name} "%"
    </select>

TestMyBatis测试类

 @Test
    public void testSelectLikeOne(){
        try {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            //like的内容
            String name = "%li%";
            List<User> userList = userDao.selectLikeOne(name);
            for(User user: userList){
                System.out.println("User用户="+user);
            }
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    @Test
    public void testSelectLikeTwo(){
        try {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            //like的内容
            String name = "li";
            List<User> userList = userDao.selectLikeTwo(name);
            for(User user: userList){
                System.out.println("User用户="+user);
            }
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java MyBatis传出参数resultType和resultMap解读

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java MyBatis传出参数resultType和resultMap解读

这篇文章主要介绍了Java MyBatis传出参数resultType和resultMap解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-21

解决js传中文参数到java后台出现乱码问题

在js中传中文到java后端时,参数中有中文时,后端获取到的值是乱码。解决方法如下:1、先在js中传值时把参数编码,然后再传值到后端var userName=encodeURI(userName);2、在后端获取该值后,再用进行解码userName= java
解决js传中文参数到java后台出现乱码问题
2017-10-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录