01_SqlMapConfig.xml配置文件解释

mybatis相关配置 - 图2A.官方说明文档
mybatis相关配置 - 图3http://www.mybatis.org/mybatis-3/zh/configuration.html
mybatis相关配置 - 图4B.SqlMapConfig.xml中配置的内容和顺序如下:
mybatis相关配置 - 图5properties(属性)
mybatis相关配置 - 图6settings(设置)
mybatis相关配置 - 图7mybatis相关配置 - 图8typeAliases( 类 型 别 名 ) typeHandlers(类型处理器)
mybatis相关配置 - 图9objectFactory(对象工厂)
mybatis相关配置 - 图10plugins(插件)
mybatis相关配置 - 图11environments(环境配置)
mybatis相关配置 - 图12environment(环境变量)
mybatis相关配置 - 图13transactionManager(事务管理器)
mybatis相关配置 - 图14dataSource(数据源)
mybatis相关配置 - 图15databaseIdProvider(数据库厂商标识)
mybatis相关配置 - 图16mappers(映射器)
mybatis相关配置 - 图17C.常用属性
properties
settings
typeAliases
mappers

02_Mybatis连接池

mybatis相关配置 - 图18在Mybatis中也有连接池技术,但是它采用的是自己的连接池技术。在 Mybatis 的
SqlMapConfig.xml配置文件中,通过来实现Mybatis 中连接池的配置。
mybatis相关配置 - 图19Mybatis连接池分类
mybatis相关配置 - 图20
mybatis相关配置 - 图21可以看出 Mybatis 将它自己的数据源分为三类:
mybatis相关配置 - 图22UNPOOLED 不使用连接池的数据源
mybatis相关配置 - 图23POOLED 使用传统的javax.sql.DataSource规范中的连接池
mybatis相关配置 - 图24JNDI 使用 JNDI 实现的数据源

mybatis相关配置 - 图25mybatis相关配置 - 图26具体结构如下:
mybatis相关配置 - 图27
相应地,MyBatis 内部分别定义了实现了 java.sql.DataSource接口的UnpooledDataSource,PooledDataSource 类来表示 UNPOOLED、 POOLED 类型的数据源。
image.png
在这三种数据源中,我们一般采用的是 POOLED 数据源(很多时候我们所说的数据源就是为了更好的管理数据库连接,也就是我们所说的连接池技术) 。

mybatis相关配置 - 图29023_environments标签

image.png
mybatis相关配置 - 图31mybatis相关配置 - 图32在environments标签中,可以有多个environment子标签
transactionManager标签
mybatis相关配置 - 图33配置mybatis的事务管理器
mybatis相关配置 - 图34JDBC:依赖于从数据源得到的连接来管理事务

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608190451764-4294f778-9575-4841-aea2-c17028b1e00f.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个事务,而是让容器来管理事务的整个生命周期.<br />![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608190454311-808b6595-2a93-4fb7-9078-6005726f5c4b.png#align=left&display=inline&height=19&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=4&status=done&style=none&width=4)![](https://cdn.nlark.com/yuque/0/2020/png/8396355/1608190450405-2c5d382b-b225-486d-9185-7ddae1b7039c.png#align=left&display=inline&height=15&margin=%5Bobject%20Object%5D&originHeight=19&originWidth=5&status=done&style=none&width=4)dataSource标签<br />设置数据源<br /> UNPOOLED:没有使用连接池,每次使用时新建一个连接,使用完后销毁连接<br />POOLED:使用连接池<br />演示代码
  1. <environments default="development1">
  2. <environment id="development1">
  3. <transactionManager type="JDBC"></transactionManager>
  4. <dataSource type="POOLED">
  5. <property name="driver" value="${driverClass}"/>
  6. <property name="url" value="${jdbcUrl}"/>
  7. <property name="username" value="${user}"/>
  8. <property name="password" value="${password}"/>
  9. </dataSource>
  10. </environment>
  11. <environment id="development2">
  12. <transactionManager type="MANAGED"></transactionManager>
  13. <dataSource type="UNPOOLED">
  14. <property name="driver" value="${driverClass}"/>
  15. <property name="url" value="${jdbcUrl}"/>
  16. <property name="username" value="${user}"/>
  17. <property name="password" value="${password}"/>
  18. </dataSource>
  19. </environment>
  20. </environments>


04_properties标签

mybatis相关配置 - 图35配置mybatis属性值配置
方式一: 直接在properties标签中配置
方式二: 在外部配置文件配置,通过properties标签加载
方式一和方式二,方式二的优先级更高
方式一

  1. <properties resource="jdbc.properties">
  2. <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  3. <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/day27"/>
  4. <property name="user" value="root"/>
  5. <property name="password" value="root"/>
  6. </properties>

mybatis相关配置 - 图36方式二

  1. <properties resource="jdbc.properties">
  2. </properties>

mybatis相关配置 - 图37不管是方式1还是方式2,都使用${}调用

  1. <environments default="development">
  2. <environment id="development">
  3. <transactionManager type="JDBC"></transactionManager>
  4. <dataSource type="POOLED">
  5. <property name="driver" value="${driverClass}"/>
  6. <property name="url" value="${jdbcUrl}"/>
  7. <property name="username" value="${user}"/>
  8. <property name="password" value="${password}"/>
  9. </dataSource>
  10. </environment>
  11. </environments>

05_typeAliases标签

mybatis相关配置 - 图38为 Java 类型设置一个别名
方式一: 给指定类设置别名
方式二: 给指定包下的所有类设置别名
方式一

  1. <typeAliases>
  2. <typeAlias type="com.qzw.bean.User" alias="user"></typeAlias>
  3. </typeAliases>

方式二

  1. <typeAliases>
  2. <package name="com.qzw.bean"/>
  3. </typeAliases>



mybatis相关配置 - 图39MyBatis内置别名
mybatis相关配置 - 图40

mybatis相关配置 - 图41

06_mappers标签

mybatis相关配置 - 图42mybatis相关配置 - 图43:使用相对于类路径的资源如:
mybatis相关配置 - 图44:使用接口类路径
mybatis相关配置 - 图45如:
mybatis相关配置 - 图46注意:要求接口名称和映射文件名称相同,且放在同一个目录中。
mybatis相关配置 - 图47mybatis相关配置 - 图48:注册指定包下的所有接口如:.
mybatis相关配置 - 图49注意:要求接口名称和映射文件名称相同,且放在同一个目录中。

07_核心配置文件之plugins插件

mybatis相关配置 - 图50MyBatis可以使用第三方的插件对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据
mybatis相关配置 - 图51开发步骤
mybatis相关配置 - 图52导入PageHelper包
mybatis相关配置 - 图53
mybatis相关配置 - 图54mybatis相关配置 - 图55在Mybatis核心配置文件中配置PageHelper插件测试分页数据
mybatis相关配置 - 图56在Mybatis核心配置文件中配置PageHelper插件

  1. <plugins>
  2. <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
  3. </plugins>


mybatis相关配置 - 图57代码测试
只需要在查询数据库之前,使用startPage(int pageNum, int pageSize)方法

  1. ...
  2. PageHelper.startPage(1,2);
  3. ...

08_映射配置文件之parameterType属性

mybatis相关配置 - 图58给sql语句传入参数。将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的。默认 值 为 未 设 置
paramType参数的类型
mybatis相关配置 - 图59简单数据类型
mybatis相关配置 - 图60包含int,String等。只能传入一个参数。
mybatis相关配置 - 图61复杂数据类型
mybatis相关配置 - 图62javaBean实体类, Map。可以传入多个参数
mybatis相关配置 - 图63案例演示
mybatis相关配置 - 图64根据id查询用户
mybatis相关配置 - 图65根据账户和密码查询用户
映射文件

  1. <select id="selectUserByUsernameAndPassword" parameterType="user" resultType="user">
  2. select * from tb_user where username = #{username} and password = #{password}
  3. </select>
  4. <select id="selectUserByUsernameAndPassword1" parameterType="map" resultType="user">
  5. select * from tb_user where username = #{username} and password = #{password}
  6. </select>

测试代码

  1. @Test
  2. public void selectUserByUsernameAndPassword() throws Exception {
  3. ......
  4. User user = new User();
  5. user.setUsername("wangwu");
  6. user.setPassword("wangwu");
  7. List < User > userList = userDao.selectUserByUsernameAndPassword(user);
  8. ......
  9. }
  10. @Test
  11. public void selectUserByUsernameAndPassword1() throws Exception {
  12. ......
  13. Map < String, String > map = new HashMap < > ();
  14. map.put("username", "wangwu");
  15. map.put("password", "wangwu");
  16. List < User > userList = userDao.selectUserByUsernameAndPassword1(map);
  17. ......
  18. }


09_映射配置文件之resultType属性

mybatis相关配置 - 图66sql语句执行后返回结果类型。从这条语句中返回的期望类型的类的完全限定名或别名。
mybatis相关配置 - 图67mybatis相关配置 - 图68resultType参数的类型
mybatis相关配置 - 图69返回JavaBean类型
mybatis相关配置 - 图70返回List类型
mybatis相关配置 - 图71返回Map类型
mybatis相关配置 - 图72案例演示
mybatis相关配置 - 图73resultType为map,返回单条记录,key为属性名,值为属性值。

  1. <select id="selectUserById" parameterType="int" resultType="map">
  2. select * from tb_user where id = #{id}
  3. </select>


mybatis相关配置 - 图74结果为:
mybatis相关配置 - 图75

mybatis相关配置 - 图76resultType为map,返回多条记录,key为任意一属性,值为对象类型,不过key需要通过@MapKey(“hotelName”)指定对象中一个属性名为key

  1. //映射文件
  2. <select id="selectUserList" resultType="map">
  3. select * from tb_user
  4. </select>
  5. //dao代码@MapKey("id")
  6. Map
  7. <Integer,Object> selectUserList() throws Exception;

mybatis相关配置 - 图77结果为:

mybatis相关配置 - 图78


10_映射配置文件-resultMap属性

mybatis相关配置 - 图79resultType可以将查询结果映射为pojo,但需要pojo类的属性名和sql查询的字段名称一致方可映射成功。
mybatis相关配置 - 图80mybatis相关配置 - 图81如果sql查询字段名和pojo类的属性名不一致,可以通过resultMap将字段名和属性名作一个对应 关 系 . resultMap可以实现将查询结果映射为复杂类型的pojo,比如实现一对一查询和一对多查询。

11_映射配置文件-sql片段

mybatis相关配置 - 图82在开发中,SQL的拼接很常见,有很多的sql具有重复性高的特点,这时最好把重复的sql抽取出来,作为公用的sql片段。
mybatis相关配置 - 图83语法
mybatis相关配置 - 图84定义sql片段

  1. <sql id="片段名">
  2. sql语句
  3. </sql>

mybatis相关配置 - 图85引用sql片段

  1. <include refid="片段名"></include>

mybatis相关配置 - 图86案例演示
mybatis相关配置 - 图87查询出所有记录,返回字段值需要有:p_name、p_age
mybatis相关配置 - 图88模糊查询出所有记录,返回字段值需要有:p_name、p_age

12_动态sql之if标签

mybatis相关配置 - 图89mybatis 映射文件中,if标签判断字符串相等与否
语法

  1. <if test="OGNL表达式">
  2. sql语句
  3. </if>





mybatis相关配置 - 图90案例演示
mybatis相关配置 - 图91没有使用if标签

  1. <select id="selectUserByUsernameAndPassword" parameterType="user" resultType="user">
  2. select * from tb_user where username = #{username} and password = #{password}
  3. </select>

mybatis相关配置 - 图92以上案例存在一些问题:当username和password其中任意一个没有值,那么就找不到记录
mybatis相关配置 - 图93使用if标签

  1. <select id="selectUserByUsernameAndPassword" parameterType="user" resultType="user">
  2. select * from tb_user where 1 = 1
  3. <if test="username != null and username != ''"> and username = #{username}
  4. </if>
  5. <if test="password != null and password != ''">
  6. and password = #{password}
  7. </if>
  8. </select>

13_动态sql之where标签

映射文件中的where标签可以省略’where 1 = 1’和’第一个if语句中的and或or’
语法

  1. <where>
  2. sql语句
  3. </where>

mybatis相关配置 - 图94案例演示

  1. <select id="selectUserByUsernameAndPassword" parameterType="user" resultType="user">
  2. select * from tb_user
  3. <where>
  4. <if test="username != null and username != ''">
  5. username = #{username}
  6. </if>
  7. <if test="password != null and password != ''">
  8. and password = #{password}
  9. </if>
  10. </where>
  11. </select>


14_动态sql之foreach标签

mybatis相关配置 - 图95向sql传递数组或List,mybatis使用foreach解析.
语法

<foreach collection="" open="" separator="" close="" item=""> sql语句 </foreach>

mybatis相关配置 - 图96collection:如果是数组值为array,如果是集合值为list
mybatis相关配置 - 图97open:设置开头
mybatis相关配置 - 图98separator:设置间隔
mybatis相关配置 - 图99close:设置结尾
mybatis相关配置 - 图100item:元素名案例演示
mybatis相关配置 - 图101根据一组id值查询记录
mybatis相关配置 - 图102使用数组
mybatis相关配置 - 图103使用集合

//使用数组
<select id="selectUserListByIds1" parameterType="int[]" resultType="user"> 
      select * from tb_user

    <where>
        <foreach collection="array" separator="," open="id in (" close=")" item="id">
                        #{id}
                </foreach>
        <!‐‐
                <foreach collection="array" separator="or" item="id"> id = #{id}
                </foreach>
‐‐></where>
</select>

//使用集合
<select id="selectUserListByIds2" parameterType="list" resultType="user"> 
      select * from tb_user
    <where>
      <foreach collection="list" separator="," open="id in (" close=")" item="id">
                #{id}
        </foreach>
    </where>
</select>