初学Mybatis笔记

本文档详述了MyBatis的基本概念、发展历程、特点,以及如何进行HelloWorld实践,包括环境配置、创建映射接口和SQL映射文件。接着深入讲解了MyBatis全局配置文件的各个属性和配置项,如properties、settings、typeAliases、typeHandlers、plugins、environments、databaseIdProvider和mappers。还介绍了MyBatis的映射文件和动态SQL,包括insert、update、delete、select的使用,以及参数传递和结果映射。最后讨论了MyBatis的缓存机制、逆向工程和PageHelper分页插件的使用,以及SSM(Spring、SpringMVC、MyBatis)框架的整合步骤。
摘要由CSDN通过智能技术生成

文章目录

一、Mybatis简介

1.1 MyBatis历史

  1. MyBatis是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code旗下, iBatis3.x 正式更名为MyBatis ,代码于2013年11月迁移到Github
  2. iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis 提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

1.2 MyBatis简介

  1. MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
  2. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
  3. MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
  4. Mybatis 是一个 半自动的ORM(Object Relation Mapping)框架

1.3 下载网址

[https://github.com/mybatis/mybatis-3/](https://github.com/mybatis/mybatis-3/)

1.4 为什么要使用MyBatis – 现有持久化技术的对比

  1. JDBC

    ① SQL夹在Java代码块里,耦合度高导致硬编码内伤

    ② 维护不易且实际开发需求中sql有变化,频繁修改的情况多见

  2. Hibernate和JPA

    ① 长难复杂SQL,对于Hibernate而言处理也不容易

    ② 内部自动生产的SQL,不容易做特殊优化

    ③ 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降

  3. MyBatis

    ① 对开发人员而言,核心sql还是需要自己优化

    ② sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据

二、Mybatis HelloWorld

2.1 开发环境的准备

  1. 导入MyBatis框架的jar包、Mysql驱动包、log4j的jar包

    myBatis-3.4.1.jar
    mysql-connector-java-5.1.37-bin.jar
    log4j.jar

  2. 导入log4j 的配置文件,内容如下(一般不进行修改):

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
     
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
     
     <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
       <param name="Encoding" value="UTF-8" />
       <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
       </layout>
     </appender>
     <logger name="java.sql">
       <level value="debug" />
     </logger>
     <logger name="org.apache.ibatis">
       <level value="info" />
     </logger>
     <root>
       <level value="debug" />
       <appender-ref ref="STDOUT" />
     </root>
    </log4j:configuration>
    

2.2 创建测试表

  • 使用的是mysql 8.0 版本,

      CREATE DATABASE mybatis;
      
      USE mybatis;
      
      DROP TABLE IF EXISTS tbl_employee;
      
      CREATE TABLE tbl_employee(
      	`id` INT(11) PRIMARY KEY AUTO_INCREMENT,
      	`name` VARCHAR(50),
      	`gender` CHAR(1),
      	`email` VARCHAR(100)
      );
    

2.3 创建javaBean

  • Employee.java(具体方法略)

     public class Employee {
     
     	private Integer id;
     	private String name;
     	private String gender;
     	private String email;
     
     }
    

2.4 创建MyBatis的全局配置文件

  • mybatis-config.xml:

      <?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="mysql_jdbc.properties"></properties>
      	
      	<!-- 配置全局环境,default:当前使用的环境 -->
      	<environments default="development">
      	
      		<!-- 配置单个环境,id是唯一表示 -->
      		<environment id="development">
      			<transactionManager type="JDBC" />
      			<dataSource type="POOLED">
      				<property name="driver" value="${mysql.driver}" />
      				<property name="url" value="${mysql.url}" />
      				<property name="username" value="${mysql.username}" />
      				<property name="password" value="${mysql.password}" />
      			</dataSource>
      		</environment>
      	</environments>
      	
      	<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
      	<mappers>
      		<!-- 注册mapper.xml文件 -->
      		<!-- <mapper resource="com/lipu/mybatis01/mapper/EmployeeMapper.xml" /> -->
      		
      		<!-- 注册接口,接口中可以使用@Select等标识 -->
      		<!-- <mapper class="com.lipu.mybatis01.mapper.EmployeeMapper"/> -->
      		
      		<!-- 常用:基于包的批量注册,mapper.java接口和mapper.xml需要在同一个包内 -->
      		<package name="com.lipu.mybatis01.mapper"/>
      	</mappers>
      </configuration>
    
  • mysql_jdbc.properties

      mysql.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
      mysql.driver=com.mysql.cj.jdbc.Driver
      mysql.username=root
      mysql.password=root
    

2.5 创建Employee的映射接口

  • EmployeeMapper.java:

      public interface EmployeeMapper {
      	
      	public abstract Employee getEmpById(Integer id);
      
      }
    

2.6 创建Employee的sql映射文件

  • EmployeeMapper.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">
      <mapper namespace="com.lipu.mybatis01.mapper.EmployeeMapper">
      	
      	<!-- public abstract Employee getEmpById(Integer id); -->
      	<select id="getEmpById" resultType="com.lipu.mybatis01.bean.Employee">
      		select * from tbl_employee where id = #{id}
      	</select>
      </mapper>
    

2.7 测试类

  • MybatisTest .java:

      public class MybatisTest {
      
      	@Test
      	public void test1() throws IOException {
      		String resource = "mybatis-config.xml";
      		InputStream inputStream = Resources.getResourceAsStream(resource);
      
      		// 获取SqlSessionFactory对象
      		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      
      		// 获取sqlSession实例,能直接执行已经映射的sql语句
      		SqlSession sqlSession = sqlSessionFactory.openSession();
      
      		try {
      			Employee employee = sqlSession.selectOne("com.lipu.mybatis01.mapper.EmployeeMapper.selectOne", 1);
      			System.out.println(employee);
      		} finally {
      			sqlSession.close();
      		}
      
      	}
      
      	@Test
      	public void test02() throws IOException {
      		String resource = "mybatis-config.xml";
      		InputStream inputStream = Resources.getResourceAsStream(resource);
      
      		// 1. 获取SqlSessionFactory对象
      		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      
      		// 2. 获取sqlSession实例,能直接执行已经映射的sql语句
      		SqlSession sqlSession = sqlSessionFactory.openSession();
      
      		try {
      			// 3. 获取接口的实现类对象,会自动为接口创建一个代理对象,代理对象去实现增删改查方法
      			EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
      			Employee employee = mapper.getEmpById(1);
      			System.out.println(mapper.getClass());
      			System.out.println(employee);
      		} finally {
      			sqlSession.close();
      		}
      
      	}
      
      }
    

2.8 最终项目框架图:

mybatis框架结果

三、 MyBatis全局配置文件

3.1 MyBatis全局配置文件简介

  1. The MyBatis configuration contains settings and properties that have a dramatic effect on how MyBatis behaves.

  2. 文件结构如下

    configuration 配置 
    	properties 属性
    	settings 设置
    	typeAliases 类型命名
    	typeHandlers 类型处理器
    	objectFactory 对象工厂
    	plugins 插件
    	environments 环境 
    		environment 环境变量 
    			 transactionManager 事务管理器
    			dataSource 数据源
    	databaseIdProvider 数据库厂商标识
    	mappers 映射器
    

3.2 properties属性

  1. 可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来配置(可外部配置和引用外部资源文件)

  2. 外部配置:

     <properties>
          <property name="driver" value="com.mysql.jdbc.Driver" />
          <property name="url" 
                  value="jdbc:mysql://localhost:3306/mybatis" />
          <property name="username" value="root" />
          <property name="password" value="root" />
      </properties>
    
  3. 引用资源文件:

     <!-- 
     		properties: 引入外部的属性文件
     			resource: 从类路径下引入属性文件 
     			url:  引入网络路径或者是磁盘路径下的属性文件
     -->
     <properties resource="jdbc.properties" ></properties>
    

    jdbc.properties:

     jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
     jdbc.driver=com.mysql.cj.jdbc.Driver
     jdbc.username=root
     jdbc.password=root
    
  4. 在environment元素的dataSource元素中为其动态设置

     <environments default="mysql">
     		<environment id="mysql">
     			<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>
    

3.3 settings设置

  1. 这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

  2. 包含如下的setting设置:

    <settings>
    <setting name="cacheEnabled" value="true"/>//是否使用二级缓存
    <setting name="lazyLoadingEnabled" value="true"/>//是否启用懒加载,需配合aggressiveLazyLoading一起使用
    <setting name="aggressiveLazyLoading" value="false"/>//是否关闭主动加载,配合lazyLoadingEnabled
    <setting name="multipleResultSetsEnabled" value="true"/>//是否允许从一条语句返回多个结果集(需要兼容驱动程序: allowMultiQueries=true)
    <setting name="useColumnLabel" value="true"/>//是否使用列标签而不是列名
    <setting name="useGeneratedKeys" value="false"/>//允许JDBC支持生成的键(需要驱动的兼容性支持)
    <setting name="autoMappingBehavior" value="PARTIAL"/>//指定MyBatis是否以及如何自动将列映射到字段/属性。NODE: 禁止自动映射; PARTIAL:自动映射结果集,不映射嵌套结果;FULL:自动映射包含嵌套在内的各种复杂的结果集
    <setting name="autoMappingUnknownColumnBehavior" value="NONE"/>//指定检测到自动映射目标的未知列(或未知属性类型)时的行为。NONE: 不处理; WARNING: 在日志中输出警告信息(依赖于日志); FAILING: 映射失败,抛出异常;
    <setting name="defaultExecutorType" value="SIMPLE"/>//配置默认执行器,SIMPLE: 不做特殊处理; REUSE: 再次使用已编译语句; BATCH:批处理 ;
    <setting name="defaultStatementTimeout" value="null"/>//设置驱动程序等待数据库响应的秒数。
    <setting name="defaultFetchSize" value="100"/>
    <setting name="safeRowBoundsEnabled" value="false"/>
    <setting name="mapUnderscoreToCamelCase" value="false"/>//是否将下划线设置为驼峰命名法
    <setting name="localCacheScope" value="SESSION"/>
    <setting name="jdbcTypeForNull" value="OTHER"/>
    <setting name="lazyLoadTriggerMethods"
               value="equals,clone,hashCode,toString"/>// 指定哪个对象的方法触发延迟加载
    </settings>
    

3.4 typeAliases 别名处理

  1. 类型别名是为 Java 类型设置一个短的名字,可以方便我们引用某个类。(别名不区分大小写)

     <typeAliases>
      	<typeAlias type="com.atguigu.mybatis.beans.Employee"
                    alias="emp"/>
     </typeAliases>
    
  2. 类很多的情况下,可以批量设置别名这个包下的每一个类创建一个默认的别名,就是简单类名小写

     <typeAliases>
      	<package name="com.atguigu.mybatis.beans"/>
     </typeAliases>
    
  3. MyBatis已经取好的别名

    mybatis默认别名

3.5 typeHandlers 类型处理器

  1. 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型

  2. MyBatis中提供的类型处理器:

    typehandler

  3. 日期和时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值