Mybatis学习记录(三)--Mybatis配置文件详解

关于mybatis的配置文件,主要有两个,一个是SqlMapperConfig.xml文件一个是mapper.xml文件,分别对这两个进行深入全面学习.

一.SqlMapperConfig.xml文件

1.标签概况

在SqlMapperConfig.xml中主要有以下标签,其中环境集合environments和spring整合后废除不用.objectFactory和plugins不经常使用.

  • properties(属性)
  • settings(全局配置参数)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • environments(环境集合属性对象)
  • environment(环境子属性对象)
  • transactionManager(事务管理)
  • dataSource(数据源)
  • mappers(映射器)

2.properties

此标签主要用来引用额外的properties文件,用来解耦xml和其他特殊的配置参数,比如对于数据库的配置,可以单独创建一个db.properties文件来保存

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/shopdemo
jdbc.username=root
jdbc.password=123456

然后在配置文件中使用$符号来引用

<?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">
<configuration>
        <!--这里引入我们的配置文件-->
    <properties resource="db.properties">
        <!--这里面也可以单独定义参数-->
        <property name="" value=""/>
    </properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <!--这里使用${}来调用配置文件里面的参数-->
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

</configuration>

如果使用这种方式就要了解mybatis对外部参数引用的过程,不然如果命名一样的参数会出现覆盖现象

1. 在 properties 元素体内定义的属性首先被读取。

2. 然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。

3. 最后读取parameterType传递的属性,它会覆盖已读取的同名属性。

因此,通过parameterType传递的属性具有最高优先级,resource或 url 加载的属性次之,最低优先级的是 properties 元素体内定义的属性。

3.settings

这个是mybatis运行参数的配置,运行参数将会影响mybatis的运行行为。具体可配置的如下表.

4.typeAliases

这个是配置类型别名,一般针对自己写的pojo类,因为写全部的类路径名实在是太长了,用这个定义下会省事很多.

1.预设别名

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal

2.自定义别名

    <typeAliases>
        <!--单个映射配置-->
        <typeAlias type="com.aust.model.User"/>
        <!--映射包内的所有文件,默认别名为java文件类名,首字母大小写均可,但一般小写-->
        <package name="com.aust.model"/>
    </typeAliases>

5.typeHandlers

类型处理器用于java类型和jdbc类型映射,这个一般mybatis自带的类型处理器基本上满足日常需求,不需要单独定义。具体转换可以查询相关文档

6.objectFactory

MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。默认情况下,我们不需要配置,mybatis会调用默认实现的objectFactory。

7.plugin

plugins 是一个可选配置。mybatis中的plugin其实就是个interceptor, 它可以拦截Executor 、ParameterHandler 、ResultSetHandler 、StatementHandler 的部分方法,处理我们自己的逻辑。Executor就是真正执行sql语句的东西, ParameterHandler 是处理我们传入参数的,还记得前面讲TypeHandler的时候提到过,mybatis默认帮我们实现了不少的typeHandler, 当我们不显示配置typeHandler的时候,mybatis会根据参数类型自动选择合适的typeHandler执行,其实就是ParameterHandler 在选择。ResultSetHandler 就是处理返回结果的。

8.mappers

//使用相对于类路径的资源
<mapper resource="sqlmap/User.xml" />

//使用完全限定路径
<mapper url="file:///D:\workspace_spingmvc\mybatis_01\config\sqlmap\User.xml" />

//使用mapper接口类路径,也就是说使用mapper代理开发dao
<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
//注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

//注册指定包下的所有mapper接口,也就是说使用mapper代理开发dao
<package name="cn.itcast.mybatis.mapper"/>
//注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

二.Mapper.xml文件

1.输入类型parameterType

输入类型可以为简单类型,pojo类,hashmap等.

1.传递简单类型

mybatis会根据预设别名typeAliases来自动解析类型

//传入简单类型int
<select id="findUserById" parameterType="int" resultType="com.aust.model.User">
        SELECT * FROM user WHERE id=#{id}
    </select>

2.传入hashmap

传入hashmap的话,则#和$取出的参数都是hashmap中的key

<!--测试使用hashmap传入参数-->
    <select id="findUser" parameterType="java.util.HashMap" resultType="com.aust.model.User">
        SELECT * FROM user WHERE id=#{id} AND nickname LIKE ‘%${nickname}%‘
    </select>

测试代码

//测试取出单个
    @Test
    public void findUserTest(){
        //获取sqlsession
        SqlSession session = factory.openSession();
        //创建mapper代理
        UserMapper mapper = session.getMapper(UserMapper.class);
        //利用mapper代理查询
        HashMap<String,Object> map = new HashMap<>();
        map.put("id",1);
        map.put("nickname","牛");
        User u = mapper.findUser(map);
        session.close();
        System.out.println(u);
    }

有问题的就是当hashmap中对应的参数不存在的话,程序并不会报错,而是查不到结果,这里可能引发一些异常

3.传递pojo对象

这个如果没使用typeAliases来映射的话就直接传递完整类路径,使用的话就可以传递简单名称

 <!--根据id查询出用户信息(查询一条数据)-->
    <select id="findUserById" parameterType="int" resultType="com.aust.model.User">
        SELECT * FROM user WHERE id=#{id}
    </select>

2.输出类型resultType

和输入类型用法差不多

1.输出简单类型

<!--输出简单类型int-->
    <select id="findUserCount" parameterType="java.lang.String" resultType="int">
        SELECT COUNT(*) from user WHERE nickname LIKE ‘%${value}%‘
    </select>

要注意的是输出简单类型必须查询出来的结果集有一条记录,最终将第一个字段的值转换为输出类型。

使用session的selectOne可查询单条记录。

2.输出pojo类型

mybatis使用session调用selectOne查询单条记录。和输入方式一样的用法

3.pojo列表

mybatis使用session的selectList方法获取pojo列表。返回数据为List

4.输出hashmap

输出pojo对象可以改用hashmap输出类型,将输出的字段名称作为map的key,value为字段值。

3.输出类型resultMap

resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系,resultMap实质上还需要将查询结果映射到pojo对象中。resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

1.定义resultMap

    <!--id:此resultMap的唯一表示
        type:映射的类型
    -->
    <resultMap id="userMap" type="com.aust.model.User">
        <!--id:该查询记录的唯一标示,也就是主键
            result:普通列映射标示
            column:要映射的查询结果sql列
            property;要映射为pojo的那个属性名
        -->
        <id column="id_" property="id"/>
        <result column="username_" property="username"/>
    </resultMap>

2.使用resultMap

 <!--根据id查询出用户信息(查询一条数据)-->
    <select id="findUserById" parameterType="int" resultMap="userMap">
        SELECT id id_,username username_,password,nickname,status FROM user WHERE id=#{id}
    </select>

从代码可以看出,我给id和username分别起了别名id_,username_,然后返回类型为之前定义的userMap,这样的话查询结果自动会把id_映射为User类的id,username_映射为User类的username.

下一篇关联查询会介绍更多


3.动态sql

通过mybatis提供的各种标签方法实现动态拼接sql。

1.if标签

<!-- 传递pojo综合查询用户信息 -->
    <select id="findUserList" parameterType="user" resultType="user">
        select * from user
        where 1=1
        <if test="id!=null and id!=‘‘">
        and id=#{id}
        </if>
        <if test="username!=null and username!=‘‘">
        and username like ‘%${username}%‘
        </if>
    </select>

2.where标签

where主要解决了上面单纯用if标签还要写where 1=1这样的多余条件的情况.

<select id="findUserList" parameterType="user" resultType="user">
        select * from user
        <where>
        <if test="id!=null and id!=‘‘">
        and id=#{id}
        </if>
        <if test="username!=null and username!=‘‘">
        and username like ‘%${username}%‘
        </if>
        </where>
    </select>

3.foreach标签

foreach遍历集合和数组进行sql语句拼接,看下面例子

SELECT * FROM USERS WHERE username LIKE ‘%张%‘ AND id IN (10,89,16)

有上面这样的sql,那么用foreach假设传了数组a{10,89,16}或者集合a{10,89,16}

<foreach collection="a" open=" and id in(" close=")" item="id" separator="," >
                #{id}
</foreach>
  • collection:传入的数组或者集合名称
  • open:遍历开始前加入的前缀,这里是AND id IN (
  • close:遍历结束加入的后缀,这里是)
  • item:要遍历的项目,为pojo的时候,取出参数就要用#{pojo.属性名}
  • separator:每个项目之间的分隔符

如果传递的为数组的话,里面还有有个index属性,来表示数组的下标

4.sql片段

Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的

sql片段用sql标签包裹起来

<sql id="query_user_where">
    <if test="id!=null and id!=‘‘">
        and id=#{id}
    </if>
    <if test="username!=null and username!=‘‘">
        and username like ‘%${username}%‘
    </if>
</sql>

引用方式

如果引用的为其他mapper.xml的片段,则需要使用 namespace.sql片段名

时间: 2024-10-14 16:54:43

Mybatis学习记录(三)--Mybatis配置文件详解的相关文章

MyBatis 学习记录5 MyBatis的二级缓存

主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自己配置开启. 如上图,需要在configuration里去开启. 其次在需要用到二级缓存的Mapper的配置里做一些操作,如下图,增加一个cache节点 至此就可以在UserMapper上开启二级缓存了. 当MaBatis初始化的时候,需要解析各种XML配置来生成SQLSessionFactory,

MyBatis学习笔记2--配置环境详解

1.MyBatis-config.xml详解 一个完整的配置文件如下所示 <configuration> <!-- <properties resource="jdbc.properties"/> --> <properties> <property name="jdbc.driverClassName" value="com.mysql.jdbc.Driver"/> <prope

Python学习记录3-函数参数详解

参数详解 参数分类 普通参数 默认参数 关键字参数 收集参数 普通参数 定义时直接定义变量名 调用的时候直接把变量或者值放入指定位置 def 函数名 (参数1, 参数2, ....): 函数体 # 调用 函数名 (value1, value2, ....) # 调用的时候,具体值参考的是位置,按位置赋值 默认参数 形参带有默认值 调用的时候,如果没有对相应形参赋值,则使用默认值 def func_name(p1=v1, p2=v2, ....): func_block #调用1 func_nam

Ansible自动化运维学习之五:Ansible配置文件详解与调优

一.常用参数详解本文对 https://blog.51cto.com/8355320/2471354 的参数配置进行了扩充.Ansible默认配置文件为/etc/ansible/ansible.cfg,配置文件中可以对ansible进行各项参数的调整,包括并发线程.用户.模块路径.配置优化等,常用参数如下: [defaults] inventory = /etc/ansible/hosts 被控端IP信息列表: library = /usr/share/my_modules/ Ansible默认

SpringMVC学习总结(三)——Controller接口详解(2)

4.5.ServletForwardingController 将接收到的请求转发到一个命名的servlet,具体示例如下: package cn.javass.chapter4.web.servlet; public class ForwardingServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Servle

深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)[转]

上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)>我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根节点下面,可配置properties.typeAliases.plugins.objectFactory.objectWrapperFactory.settings.environments.databaseIdProvider.typeHandlers.mappers这些节点.那么本次,就会先介绍prope

MyBatis系列:二、配置文件详解

本文会详细介绍MyBatis的常用配置 1.properties节点 <properties resource="mybatis-config.properties"> <property name="username" value="dev_user"/> <property name="password" value="123456"/> </propertie

Mybatis学习记录(二)--Mybatis开发DAO方式

mybatis开发dao的方法通常用两种,一种是传统DAO的方法,一种是基于mapper代理的方法,下面学习这两种开发模式. 写dao之前应该要对SqlSession有一个更加细致的了解 一.mybatis的SqlSession使用范围 SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产

zepto学习(三)之详解

zepto Zepto就是jQuery的移动端版本, 可以看做是一个轻量级的jQuery github地址: https://github.com/madrobby/zepto 官方地址: http://zeptojs.com/ 中文版地址: http://www.css88.com/doc/zeptojs_api/ 注意点: Zepto的设计目的是提供 jQuery 类似的API,但并不是100%覆盖 jQuery jQuery的底层是通过DOM来实现效果的, zepto.js 是用css3