mybatis中的XML文件配置->mybatis-config.xml+XxxxMapper.xml-SQL

本文深入解析MyBatis的核心配置文件mybatis-config.xml,包括properties、settings、typeAliases、typeHandlers和environments等内容。同时,详细介绍了SQL映射文件XxxMapper.xml的使用,包括基本元素、参数类型如HashMap的处理、结果集映射resultMap的配置等,帮助读者掌握MyBatis的配置与SQL映射技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一.mybatis-config.xml-配置文件详解

1.说明

2.properties 属性

3.settings 全局参数定义--》通常使用默认

 4.typeAliases 别名处理器

5.typeHandlers 类型处理器

 6.environments 环境

二.XxxxMapper.xml-SQL 映射文件

1.XxxMapper.xml-基本介绍

2.XxxMapper.xml-详细说明

2.1基本使用

3.parameterType(输入参数类型) 

4.传入 HashMap

5.resultMap(结果集映射)

注意事项和细节


一.mybatis-config.xml-配置文件详解

1.说明

1.1 mybatis 的核心配置文件 (mybatis-config.xml) ,比如配置 jdbc 连接信息,注册 mapper
等等 , 我们需要对这个配置文件有详细的了解

2.properties 属性

通过该属性,可以指定一个外部的 jdbc.properties 文件,引入我们的 jdbc 连接信息

代码演示

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
jdbc.user=root
jdbc.pwd=hong
jdbc.driver就是key值,名字随便起

当然使用一个配置文件在另外一个文件中自然需要引入(在前面引入)


    <!--引入外部的jdbc.properties-->
    <properties resource="jdbc.properties"/>
                <property name="driver" value="${jdbc.driver}"/>         
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.pwd}"/>

3.settings 全局参数定义--》通常使用默认

这是mybatis中极为重要的调整设置,他们会改变mybatis的运行时行为

 4.typeAliases 别名处理器

1. 别名是为 Java 类型命名一个短名字。它只和 XML 配置有关,用来减少类名重复的部分
2. 如果指定了别名 , 我们的 MappperXxxx.xml 文件就可以做相应的简化处理
3. 注意指定别名后,还是可以使用全名的
    <!--配置别名-->
    <typeAliases>
        <!--<typeAlias type="com.hong.entity.Monster" alias="Monster"/>-->

        <!--
            如果一个包下有很多的类,我们可以直接引入包,这样
            该包下面的所有类名,可以直接使用
        -->
        <package name="com.hong.entity"/>
    </typeAliases>

就可以直接使用类名操作了

5.typeHandlers 类型处理器

1. 用于 java 类型和 jdbc 类型映射
2. Mybatis 的映射基本已经满足,不太需要重新定义
3. 这个我们使用默认即可,也就是 mybatis 会自动的将 java jdbc 类型进行转换 .
4. java 类 型 和 jdbc 类 型 映 射 关 系 一 览 [ 手 册 ]
https://mybatis.org/mybatis-3/zh/configuration.html#typeHandlers

 6.environments 环境

1. resource 注册 Mapper 文件: XXXMapper.xml 文件(常用,使用过)

<!--        这里会引入(注册)我们的Mapper.xml文件-->
<!--        <mapper resource="com/hong/mapper/MonsterMapper.xml"/>-->

2. class:接口注解实现(使用过) 

        <!--解读
           1. 如果是通过注解的方式,可不再使用 MonsterMapper.xml
           2. 但是需要在mybatis-config.xml注册/引入含注解的类
           3. 如果没有引入,不能使用
        -->
        <mapper class="com.hong.mapper.MonsterAnnotation"/>

3. url:外部路径,使用很少,不推荐, <mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />

4. package 方式注册 :<package name="com.hong.mapper"/> 


<!--        <package name="com.hong.mapper"/>-->

         解读
            1. 当一个包下有很多的Mapper.xml文件和基于注解实现的接口时,为了方便,我们可以以包方式进行注册
           2. 将下面的所有xml文件和注解接口 都进行注册

二.XxxxMapper.xml-SQL 映射文件

1.XxxMapper.xml-基本介绍

1 MyBatis 的真正强大在于它的语句映射 ( XxxMapper.xml 配置 ), 由于它的异常强大 ,
果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。
MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。
2 SQL 映射文件常用的几个顶级元素(按照应被定义的顺序列出):
cache – 该命名空间的缓存配置。
cache-ref – 引用其它命名空间的缓存配置。
resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
parameterType - 将会传入这条语句的参数的类全限定名或别名
sql – 可被其它语句引用的可重用语句块。
insert – 映射插入语句。
update – 映射更新语句。
delete – 映射删除语句。
select – 映射查询语句。

2.XxxMapper.xml-详细说明

2.1基本使用

1. insert delete update select 这个我们在前面讲解过,分别对应增删改查的方法和 SQL
语句的映射 .
2. 如何获取到刚刚添加的 Monster 对象的 id 主键 [ 前面使用过了 ]

3.parameterType(输入参数类型) 

● parameterType( 输入参数类型 )
1. 传入简单类型,比如按照 id Monster( 前讲过 )
2. 传入 POJO 类型,查询时需要有多个筛选条件
3. 当有多个条件时,传入的参数就是 Pojo 类型的 Java 对象 , 比如这里的 Monster 对象
4. 当传入的参数类是 String 时,也可以使用 ${} 来接收参数

● parameterType- 应用案例
案例 1: 请查询 id = 1 或者 name = ' 白骨精 ' 的妖怪
案例 2: 请查询 name 中 包含 " 牛魔王 " 的妖怪

代码:案例1

   //通过id 或者名字查询
    public List<Monster> findMonsterByNameORId(Monster monster);
<mapper namespace="com.hong.mapper.MonsterMapper">

    <!--
    1. 配置/实现public List<Monster> findMonsterByNameORId(Monster monster);
    2. 通过id 或者名字查询
    3. `id` = #{id} `id`表示表的字段名 #{id} 中的id表示你传入的Monster对象的属性名
    -->
    <select id="findMonsterByNameORId" parameterType="Monster" resultType="Monster">
        SELECT * FROM `monster` WHERE `id` = #{id} OR `name` = #{name}
    </select>
</mapper>
    public void findMonsterByNameORId() {
        Monster monster = new Monster();
        monster.setId(1);
        monster.setName("狐狸精-100");
        List<Monster> monsters =
                monsterMapper.findMonsterByNameORId(monster);

        for (Monster m : monsters) {
            System.out.println("m-" + m);
        }

        if (sqlSession != null) {
            sqlSession.close();
        }

        System.out.println("操作成功~");
    }

案例二:

    <!--
    1. 配置/实现 public List<Monster> findMonsterByName(String name);
    2. 请查询 name 中 包含 "牛魔王" 的妖怪 - 是模糊查询
    3. 模糊查询的使用 取值 需要 ${value} 取值
    -->
    <select id="findMonsterByName" parameterType="String" resultType="Monster">
        SELECT * FROM `monster` WHERE `name` LIKE '%${name}%'
    </select>
    public void findMonsterByName() {

        List<Monster> monsters = monsterMapper.findMonsterByName("牛魔王");
        for (Monster monster : monsters) {
            System.out.println("monster--" + monster);
        }

        if (sqlSession != null) {
            sqlSession.close();
        }

        System.out.println("操作成功~");

    }

4.传入 HashMap

传入 HashMap( 重点 )
1. HashMap 传入参数更加灵活,比如可以灵活的增加查询的属性,而不受限于 Monster
Pojo 属性本身
2. 演示如何遍历一个 List<Map<String,Object>> 的数据类型
传入 HashMap- 应用实例 1
要求:声明一个方法,按传入参数是 HashMap 的方式,查询 id > 10 并且 salary 大于 40
的所有妖怪
1. 修改 MonsterMapper.java, 增加方法接口
//查询 id > 10 并且 salary 大于 40, 要求传入的参数是 HashMap
public List<Monster>
findMonsterByIdAndSalary_PrameterHashMap(Map<String, Object> map);
2. 修改 MonsterMapper.xml
<!-- 实现 findMonsterByIdAndSalary_PrameterHashMap -->
<select id="findMonsterByIdAndSalary_PrameterHashMap" parameterType="map" resultType="Monster">
SELECT * FROM monster
WHERE id > #{id} AND salary > #{salary}
</select>
 public void findMonsterByIdAndSalary_PrameterHashMap() {
        //Diamond types are not supported at language level '5'
        //如何解决.=> 在pom.xml文件中指定编译器版本
        /*
             <!--指定Maven编译器 和 jdk版本-->
            <properties>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
                <java.version>1.8</java.version>
            </properties>
         */

        Map<String, Object> map = new HashMap<>();
        map.put("id", 10);
        map.put("salary", 40);
        List<Monster> monsters =
                monsterMapper.findMonsterByIdAndSalary_PrameterHashMap(map);

        for (Monster monster : monsters) {
            System.out.println("monster--" + monster);
        }

        if (sqlSession != null) {
            sqlSession.close();
        }

        System.out.println("操作成功~");

    }
传入和返回 HashMap- 应用实例
要求:将上面的方法的改成返回参数也以 HashMap 的类型
1. 修改 MonsterMapper.java
//查询 id > 10 并且 salary 大于 40, 要求传入的参数是 HashMap
public List<Map<String, Object>>
findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap(Map<String, Object> map);
2. 修改 MonsterMapper.xml
<!--
1. 配置/实现 public List<Map<String, Object>>
   findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap(Map<String, Object> map);
2. id > 10 并且 salary 大于 40, 要求传入的参数和返回的是HashMap
-->
<select id="findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap" parameterType="map" resultType="map">
    SELECT * FROM `monster`  WHERE `id` > #{id} AND `salary` > #{salary}
</select>
3. 修改 MonsterMapperTest.java
    public void findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap() {

        Map<String, Object> map = new HashMap<>();
        map.put("id", 10);
        map.put("salary", 40);
        List<Map<String, Object>> monsterList =
                monsterMapper.findMonsterByIdAndSalary_PrameterHashMap_ReturnHashMap(map);

        //取出返回的结果-以map取出
        //回顾java基础,map遍历
        for (Map<String, Object> monsterMap : monsterList) {
            //System.out.println("monsterMap-" + monsterMap);

            //遍历monsterMap(方式1) ,取出属性和对应值
            //Set<String> keys = monsterMap.keySet();
            //for (String key : keys) {
            //    System.out.println(key + "=>" + monsterMap.get(key));
            //}

            //遍历monsterMap(方式2) ,取出属性和对应值
            for (Map.Entry<String, Object> entry : monsterMap.entrySet()) {
                System.out.println(entry.getKey() + "==>" + entry.getValue());
            }
            System.out.println("------------------------");
        }

        if (sqlSession != null) {
            sqlSession.close();
        }

        System.out.println("操作成功~");

    }

5.resultMap(结果集映射)

基本介绍
当实体类的属性和表的字段名字不一致时,我们可以通过 resultMap 进行映射,从而屏蔽
实体类属性名和表的字段名的不同 .

简单理解:就是当数据库中的字段名和我们pojo的属性名不一样的时候(因为我们在填写对应的xml文件的时候#{}要和属性名一样),使用resultMap 做一个专门的映射指定就可以找到了。我理解为就是将数据库的字段改变成属性的名字。

举例:

User表字段:

`user_id` INT NOT NULL AUTO_INCREMENT, 
`user_email` VARCHAR(255) DEFAULT '',
 `user_name` VARCHAR(255) DEFAULT '',

pojo类属性:

private Integer user_id;
private String username;
private String useremail;

xml中的配置(主要就在这里) 

<mapper namespace="com.hong.mapper.UserMapper">

    <!--
    1、配置方法public void addUser(User user);
    2、完成添加用户的任务, 注意这里user属性和表的字段名不一致
    -->
    <insert id="addUser" parameterType="User">
        INSERT INTO `user` (`user_email`,`user_name`)
        VALUE (#{useremail}, #{username})
    </insert>

    <!--
    1. 配置方法public List<User> findAllUser();
    2. 返回所有的user信息
    3. 按照传统的方式完成,会出现什么问题?=> 如果对象属性名和表字段相同时,就会设置值, 如果不同, 就会是默认值
    4. 我们可以使用resultMap来解决
    5. resultMap : 表示我们要定义一个resultMap
    6. id="findAllUserMap"  => id 就是程序员指定的resultMap id ,后面通过id可以使用他
    7. type="User" , 就是你需要返回的对象类型
    8. result column="user_email" property="useremail":  column="user_email" 表的字段名, property="useremail" 对象属性名
    9. resultMap="findAllUserMap" 表示使用我们定义的 resultMap , 通过id关联
    -->
    <resultMap id="findAllUserMap" type="User">
        <result column="user_email" property="useremail"/>
        <result column="user_name" property="username"/>
    </resultMap>
    <select id="findAllUser" resultMap="findAllUserMap">
        SELECT * FROM `user`
    </select>


    <!--使用表字段别名,来解决表的字段名和对象属性名,不一致问题, 可以用,但是我们仍然推荐使用resultmap-->
    <!--<select id="findAllUser" resultType="User">-->
    <!--    SELECT user_id ,user_name AS username,user_email AS useremail FROM `user`-->
    <!--</select>-->
</mapper>

测试

public class UserMapperTest {

    //属性
    private SqlSession sqlSession;
    private UserMapper userMapper;

    //初始化
    @Before
    public void init() {

        sqlSession = MyBatisUtils.getSqlSession();
        userMapper = sqlSession.getMapper(UserMapper.class);

    }

    @Test
    public void addUser() {
        User user = new User();
        user.setUsername("jack");
        user.setUseremail("jack@qq.com");

        userMapper.addUser(user);

        //如果是增删改, 需要commit()
        if(sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }

        System.out.println("操作OK~");
    }

    @Test
    public void findAllUser() {
        List<User> users = userMapper.findAllUser();
        for (User user : users) {
            System.out.println("user--" + user);
        }

        if(sqlSession != null) {
            sqlSession.close();
        }

        System.out.println("操作OK~");
    }

注意事项和细节

1 、解决表字段和对象属性名不一致 , 也支持使用字段别名--》复用性不高
  <!--使用表字段别名,来解决表的字段名和对象属性名,不一致问题, 可以用,但是我们仍然推荐使用resultmap-->
    <!--<select id="findAllUser" resultType="User">-->
    <!--    SELECT user_id ,user_name AS username,user_email AS useremail FROM `user`-->
    <!--</select>-->
2 、说明:如果是 MyBatis-Plus 处理就比较简单 , 可以使用 注解 @TableField 来解决
实体字段名和表字段名不一致的问题,还可以使用 @TableName 来解决 实体类名和表名
不一致的问题​​​​​​​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

海绵hong

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

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

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

打赏作者

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

抵扣说明:

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

余额充值