MyBatis 基础

Posted 程序一家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis 基础相关的知识,希望对你有一定的参考价值。


一、概述

支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架,严格上说应该是一个SQL 映射框架。

消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。

将接口和 Java 的 POJOs(Plain Ordinary Java Objects,普通的 Java 对象)映射成数据库中的记录。

前身是iBatis,MyBatis在iBatis的基础上面,对代码结构进行了大量的重构和简化


GitHub:https://github.com/mybatis

mybaits-3 : MyBatis框架

generator:代码生成器

spring : MyBatis 和Spring 的集成组件

sping-boot-starter:MyBatis 和Spring boot 集成组件

mybatispse: MyBatis 的 Eclipse 插件


三、中文文档

http://www.mybatis.org/mybatis-3/zh/index.html


四、MyBatis 框架图


接口层

为用户提供获取配置接口和 CRUD 操作的API


数据处理层

MyBatis 底层发送SQL 前参数映射和执行SQL后结果集封装处理


基础支撑层

MyBatis 配置加载和连接,事物,缓存等管理


五、MyBatis 操作流程图

MyBatis 基础



六、快速开始

1 引入jar包

   驱动包:mysql-connector-java-*.jar

   核心包:mybatis-*jar


2 配置mybatis-cfg.xml

文件放至classpath路径

<?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全局配置信息 -->
<configuration>
   <!-- 配置默认使用的环境(开发,测试,生产) -->
   <environments default="dev">
       <!-- 当前执行环境 ,事务,数据源 -->
       <environment id="dev">
           <!-- 配置事务:
                   JDBC 真实类型: org.apache.ibatis.transaction.jdbc.JdbcTransaction -->

           <transactionManager type="JDBC"/>
           <!-- 数据源:
             POOLED 真实类型:org.apache.ibatis.datasource.pooled.PooledDataSource -->

           <dataSource type="POOLED">
               <!-- 配置连接数据库的四要素 -->
               <property name="driver" value="com.mysql.jdbc.Driver" />
               <property name="url" value="jdbc:mysql:///jdbcdemo" />
               <property name="username" value="root" />
               <property name="password" value="admin" />
           </dataSource>
       </environment>
   </environments>
   <!-- 配置映射文件 -->
   <mappers>
       <mapper resource="com/ITRoad520/hello/domain/UserMapper.xml"/>
   </mappers>
</configuration>


3 创建表,模型

package com.ITRoad520.hello.domain;
@Getter
@Setter
public class User {
   private Long id;
   private String name;
   private BigDecimal salary;
}


4 在模型包下创建Mapper映射文件

暂时存放在模型路径,命名"模型+Mapper.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">

<!-- 配置映射
    namespace:使用模型全限定名+Mapper :作为映射文件的区别需唯一
-->

<mapper namespace="com.ITRoad520.hello.domain.UserMapper">
</mapper>


5 配置Mapper文件的查询操作

<mapper namespace="com.ITRoad520.hello.domain.UserMapper">
 <!--
     DQL 操作都使用select 标签
     id: sql 当前sql语句的唯一标识
     resultType:将查询到的一行数据封装成指定类型
     #{xx} OGNL 表达式获取传入的参数来设置sql参数
  -->

 <select id="get" resultType="com.ITRoad520.hello.domain.User">
      SELECT * FROM t_user WHERE id=#{id}
 </select>
</mapper>


6 执行操作

@Test
public void testGet() throws Exception {
   // 1 创建SqlSessionFactory的构建工具
   SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
   // 2 读取核心配置文件转入输入流
   InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
   // 3 通过工厂构建工具和核心配置文件构建SqlSessionFactory,类DataSource
   SqlSessionFactory factory = builder.build(is);
   // 4 通过工厂打开session,相同之前的Connection
   SqlSession session = factory.openSession();
   // 5 通过Mapper配置文件的namespace+sql的id指定要执行的sql语句,传入参数
   User user = session.selectOne("com.ITRoad520.hello.domain.UserMapper.get",1L);
   // 6 关闭资源
   session.close();
   System.out.println(user);
}


七、mybatis-cfg.xml

   查看文档xml配置

MyBatis 基础


八、映射文件

查看文档映射文件

MyBatis 基础

注意:<select> 标签需配置 resultType 作为结果数据封装的类型

crud 标签的 parameterType 可不用填写


九、抽取MyBatisUtil

由于每次操作只需要新开一个SqlSession就可以操作,工厂构建类对象和工厂类对象没必要每次操作都去新创建,所以可以抽取工具类来获取SqlSession对象

public abstract class MyBatisUtil {
   private static SqlSessionFactory factory;
   static {
       try {
           // 读取全局的配置文件
           InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
           // 通过 SqlSessionFactoryBuilder 加载配置文件构建 SqlSessionFactory 对象
           factory = new SqlSessionFactoryBuilder().build(inputStream);
       } catch (IOException e) {
           System.out.println("SqlSessionFactory 构建失败...");
       }
   }

   // 获取SqlSession对象
   public static SqlSession openSession() {
       return factory.openSession();
   }
}


十、引入日志框架Log4j

由于看不到 MyBatis 底层做某个操作时发送的SQL和参数,对后台调试程序有一定的影响,好在MyBatis底层已经把操作记录起来了,我们只需要去打开即可

1、引入 log4j 相关 jar 包

     log4j-1.2.17.jar

     slf4j-api-1.7.25.jar 

     slf4j-log4j12-1.7.25.jar

2、加入配置文件 log4j.properties

# 全局日志配置
log4j.rootLogger=ERROR, stdout
# 包日志,修改com开始的路径为需要打印日志的包路径
log4j.logger.com.ITRoad520.hello=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

 操作即可看到日志信息


十一、Mybatis 拓展

1.别名设置

由于在映射文件中设置参数类型和结果类型时需要能找到填写的类型就需要写类的全限定名,但是类的全限定名很长,所以Mybatis给一些常用的类型设置了别名可以直接使用,然后用户自定义的类型如果也需要使用别名来处理就需要自定配置别名和真实类型的映射。配置需要在mybatis-cfg,xml 核心配置文件中。配置如下。

<typeAliases>
 <!-- 给单个类型设置别名 -->
 <!--!<typeAlias alias="User" type="com.ITRoad520.domain.User"/>-->
<!-- 包下的所有类型设置别名,别名为类的简单名称 -->
<package name="com.ITRoad520.domain"/>
</typeAliases>

配置了别名之后映射文件的parameterType 和resultType 等需要配置类型的地方都可以使用别名而不用配置类的全限定名。


2.抽取db.propertis

   将连接数据库的四要素抽取出来,因为四要素是修改最频繁的,为了防止修改时动到核心配置文件,也为了体现模块化和责任分离思想。所以把四要素抽取出来。

do.properties

# db.properties 配置信息
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdemo
username=root
password=admin


mybatis-cfg.xml 中引入db.properties

<!-- 引入配置文件 -->
<configuration>
  <properties resource="db.properties"/>
  ...
</configuration>


mybatis-cfg.xml 使用配置文件的属性

<dataSource type="POOLED">
   <!-- 使用${} 引用配置文件的属性-->
   <property name="driver" value="${driver}" />
   <property name="url" value="${url}" />
   <property name="username" value="${username}" />
   <property name="password" value="${password}" />
</dataSource>


3.结果集映射配置

当数据库中表的列名和需要封装成的Java对象的属性不相同时,配置映射让MyBatis可以通过配置的映射将数据对应的封装到Java 对象中.

<!-- type:将一行数据封装成什么类型,可用配置好的别名 -->
<resultMap id="baseMap" type="com.ITRoad520.domain.User">
 <id property="id" column="uid" />
 <result property="name" column="uname"/>
 <result property="password" column="upassword"/>
</resultMap>
<!-- 引用resultMap -->
<select id="selectUsers" resultMap="baseMap">
 SELECT uid, uname, upassword FROM t_user  WHERE uid = #{id}
</select>


  常见错误

Mapper Statement collection does not contain value

Paremeter Maps collection does not contain value

以上是关于MyBatis 基础的主要内容,如果未能解决你的问题,请参考以下文章

mybatis学习(39):动态sql片段

SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

mybatis动态sql片段与分页,排序,传参的使用

MyBatis动态SQL标签用法

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

[vscode]--HTML代码片段(基础版,reactvuejquery)