MyBatis简介

发布于:2022-12-28 ⋅ 阅读:(492) ⋅ 点赞:(0)

什么是MyBatis?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

  1. MyBatis前身是iBatis,本是Apache的一个开源的项目

  2. 官方网站 http://mybatis.org

  3. mybaits是什么

    • ORM框架(O:对象,R:关系,M:映射) ,同类产品Hibernate

      • ORM框架建立java语言中O(对象)与数据库中的R(数据表)之间的M(对应的关系),可以编程方式去操作数据库

    • 实体类和SQL语句之间建立映射关系

  4. 特点

    • 基于SQL语法,简单易学

    • 能了解底层封装过程

    • SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度

    • 方便程序代码调试

Hello MyBatis

添加mybatis支持

​
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.zking.mybatis</groupId>

<artifactId>mybatis01</artifactId>

<version>1.0-SNAPSHOT</version>

<dependencies>

<!-- mybatis -->

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis</artifactId>

<version>3.4.6</version>

</dependency>

<!-- mysql driver -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.47</version>

</dependency>

<!--测试-->

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.13</version>

<scope>test</scope>

</dependency>

<!--日志-->

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-log4j12</artifactId>

<version>1.7.29</version>

</dependency>

</dependencies>

<build>

<resources>

<resource>

<directory>src/main/java</directory>

<includes>

<include>**/*.properties</include>

<include>**/*.xml</include>

</includes>

<filtering>false</filtering>

</resource>

<resource>

<directory>src/main/resources</directory>

<includes>

<include>**/*.properties</include>

<include>**/*.xml</include>

</includes>

<filtering>false</filtering>

</resource>

</resources>

<plugins>

<!-- java编译插件 -->

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.8.1</version>

<configuration>

<encoding>utf-8</encoding>

<source>1.8</source>

<compilerVersion>1.8</compilerVersion>

<target>1.8</target>

</configuration>

</plugin>

</plugins>

</build>

</project>

​

resources:默认情况下,不会编译src文件夹中的配置文件

核心配置文件

核心配置文件的名称可以任意,这里取名为mybatis-config.xml,可以从mybatis源码中得到

​
<?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>

<!--resource="database.properties" 加载类路径中的database.properties文件 -->

<properties resource="database.properties"/>

<settings>

<setting name="logImpl" value="SLF4J"/>

</settings>

<typeAliases>

<!-- <typeAlias type="User" alias="user"/> -->

<!--package会使用 Bean 的首字母小写的非限定类名来作为它的别名 -->

<package name="com.zking.ssm.pojo"/>

</typeAliases>

<!-- 环境配置 -->

<environments default="development">

<environment id="development">

<!--事务管理,有JDBC:由mybatis自身管理事务;MANAGED:由容器管理 -->

<transactionManager type="JDBC"/>

<!-- 数据源,有UNPOOLED非连接池,POOLED连接池,JNDI数据源 -->

<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>

<mappers>

<!-- <mapper resource="com/zking/ssm/dao/UserMapper.xml"/> -->

<!--

package name的方式要求

1)接口与映射文件在一个包下

2)接口与映射文件相同

-->

<package name="com.zking.ssm.dao"/>

</mappers>

</configuration>

​

创建实体类-POJO

public class User {

private Integer id; // id

private String userCode; // 用户编码

private String userName; // 用户名称

private String userPassword; // 用户密码

private Integer gender; // 性别

private Date birthday; // 出生日期

private String phone; // 电话

private String address; // 地址

private Integer userRole; // 用户角色

private Integer createdBy; // 创建者

private Date creationDate; // 创建时间

private Integer modifyBy; // 更新者

private Date modifyDate; // 更新时间

...

Mapper接口

public interface UserMapper {

/**

* 方法名要与Mapper.xml文件中的id相同

* 返回类型与resultXXX类型相匹配

*

* 查询用户表记录数

*/

public int count();

/**

* 查询用户列表

*/

public List<User> getUserList();

}

不是必须,但一般采用Mapper接口发送SQL

SQL映射文件(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命名空间 的功能

1)保证SQL标识唯一

2)与接口路径相同-->

<mapper namespace="com.zking.ssm.dao.UserMapper">

<select id="count" resultType="int">

select count(1) from smbms_user

</select>

<!--

resultType:类型为集合中的对象类型

-->

<select id="getUserList" resultType="User">

select * from smbms_user

</select>

</mapper>

​

创建测试类

public class FirstTest {

@Test

public void testCount() throws Exception{

// FirstTest.class.getResourceAsStream("资源文件路径");

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);

SqlSession sqlSession = sqlSessionFactory.openSession();

//SqlSession的两种使用方式之一:通过SqlSession实例直接运行映射的SQL语句

int count = sqlSession.selectOne("com.zking.ssm.dao.UserMapper.count");

sqlSession.close();

System.out.println(count);

}

}
  • 读取核心配置文件mybatis-config.xml

  • 创建SqlSessionFactory对象,读取配置文件

  • 创建SqlSession对象

  • 调用mapper文件进行数据操作

MyBatis框架优缺点

  1. 优点

    • 与JDBC相比,减少了50%以上的代码量

    • 最简单的持久化框架,小巧并简单易学

    • SQL代码从程序代码中彻底分离,可重用

    • 提供XML标签,支持编写动态SQL

    • 提供映射标签,支持对象与数据库的ORM字段映射

  2. 缺点

    • SQL语句编写工作量大,对开发人员有一定要求

    • 数据库移植性差

MyBatis基本要素

MyBatis的核心对象

  • SqlSessionFactoryBuilder

  • SqlSessionFactory

  • SqlSession

核心配置文件

mybatis-config.xml,名称可以任意

映射文件

XXXMapper.xml

  1. SqlSessionFactoryBuilder----build()--->2.SqlSessionFactory---openSession()--->3.SqlSession

  2. SqlSessionFactoryBuilder

    • 用过即丢,其生命周期只存在于方法体内

    • 可重用其来创建多个 SqlSessionFactory 实例

    • 负责构建SqlSessionFactory,并提供多个build方法的重载

  3. SqlSessionFactory

    • SqlSessionFactory是每个MyBatis应用的核心。作用:创建SqlSession实例

    • 作用域:Application,生命周期与应用的生命周期相同

    • 单例:存在于整个应用运行时,并且同时只存在一个对象实例

  4. SqlSession

    • 包含了执行SQL所需的所有方法

    • 对应一次数据库会话,会话结束必须关闭

    • 线程级别,不能共享

  5. SqlSession的两种使用方式

    • 通过SqlSession实例直接运行映射的SQL语句

    • 基于Mapper接口方式操作数据

SqlSession的两种使用方式

SqlSession发送Sql;

主要就是“配置文件(xml)+映射文件(mapper)+实体类(pojo)+测试类(test)”

Mapper 接口发送 SQL;

主要就是“配置文件(xml)+映射文件(mapper)+实体类(pojo) + Dao(接口)+测试类(test)”

DAO中的接口

public interface UserMapper {

/**

* 方法名要与Mapper.xml文件中的id相同

* 返回类型与resultXXX类型相匹配

*

* 查询用户表记录数

*/

public int count();

/**

* 查询用户列表

*/

public List<User> getUserList();

}

DAO中的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命名空间 的功能

1)保证SQL标识唯一

2)与接口路径相同-->

<mapper namespace="com.zking.ssm.dao.UserMapper">

<select id="count" resultType="int">

select count(1) from smbms_user

</select>

<!--

resultType:类型为集合中的对象类型

-->

<select id="getUserList" resultType="User">

select * from smbms_user

</select>

</mapper>

​

测试类

public class SecondTest {

@Test

public void testCount() throws Exception{

// FirstTest.class.getResourceAsStream("资源文件路径");

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

//SqlSessionFactoryBuilder用来创建多个SqlSessionFactory;生命周期,即用即丢

//SqlSessionFactory用来创建SqlSession实例;单例,生命周期,整个应用

SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);

//SqlSession包含了执行SQL所需的所有方法,对应一次数据库会话,会话结束必须关闭,线程级别,不能共享;

SqlSession sqlSession = sqlSessionFactory.openSession();

//SqlSession的两种使用方式之二:基于Mapper接口方式操作数据

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

int count = userMapper.count();

sqlSession.close();

System.out.println(count);

}

}

mybatis-config.xml 系统核心配置文件

  • configuration 配置

    • properties 可以配置在Java 属性配置文件中

    • settings 修改 MyBatis 在运行时的行为方式

    • typeAliases 为 Java 类型命名一个别名(简称)

    • typeHandlers 类型处理器

    • objectFactory 对象工厂

    • plugins 插件

    • environments 环境

    • environment 环境变量

    • transactionManager 事务管理器

    • dataSource 数据源

    • mappers 映射器

properties

  1. 配置properties元素的两种方式

    • 通过外部指定的方式(database.properties),实现动态配置

    • 直接配置为xml,实现动态配置

  2. 通过外部指定的方式(database.properties),实现动态配置

    • 配置properties的resource属性

<properties resource="database.properties"/>

......

<dataSource type="POOLED">

<property name="driver" value="${driver}"/>

<property name="url" value="${url}"/>

<property name="username" value="${user}"/>

<property name="password" value="${password}"/>

</dataSource>
  1. 直接配置为xml,实现动态配置

    • 配置property的name和value

<properties>

<property name="driver" value="com.mysql.jdbc.Driver"/>

<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>

<property name="user" value="root"/>

<property name="password" value="root"/>

</properties>

......

<dataSource type="POOLED">

<property name="driver" value="${driver}"/>

<property name="url" value="${url}"/>

<property name="username" value="${user}"/>

<property name="password" value="${password}"/>

</dataSource>

resource属性值的优先级高于property子节点配置的值

settings元素

  1. 用来修改MyBatis运行时的行为方式

  2. 主要是MyBatis的一些全局配置属性的设置

设置项

描述

允许值

默认值

cacheEnabled

对在此配置文件下的所有cache 进行全局性开/关设置

true | false

true

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载

true | false

true

autoMappingBehavior

MyBatis对于resultMap自动映射匹配级别

NONE | PARTIAL | FULL

PARTIAL

logImpl

指定 MyBatis 所用日志的具体实现,未指定时将自动查找。

SLF4J | LOG4J | LOG4J2

未设置

typeAliases

  1. 类型别名

  2. 仅仅只关联XML配置,简写冗长的Java类名

<typeAliases>

<typeAlias alias="User" type="cn.smbms.pojo.User"/>

</typeAliases>

单独为每个类指定别名

<typeAliases>

<package name ="cn.smbms.pojo" />

</typeAliases>

自动给指定包下的类取别名,别名首字母小写

environments

  1. 表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上

  2. 子元素节点:environment,但是必须指定其中一个为默认运行环境(通过default指定)

  3. 每个SqlSessionFactory实例只能选择一个运行环境

<environments default="development">

<environment id="development">

<transactionManager type="JDBC"/>

<dataSource type="POOLED">

<property name="driver" value="${driver}"/>

<property name="url" value="${url}"/>

<property name="username" value="${user}"/>

<property name="password" value="${password}"/>

</dataSource>

</environment>

<environment id="test">

……

</environment>

</environments>
  1. transactionManager-事务管理器

    • <transactionManager type="[ JDBC | MANAGED ]" />

    • 使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等

    • 使用MANAGED的事务管理机制:这种机制MyBatis自身不会去实现事务管理,而是让程序的容器如(JBOSS,Weblogic)来实现对事务的管理

  2. dataSource

    • dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源

    • 有三种内建的数据源类型<dataSource type=" [UNPOOLED | POOLED | JNDI]" />

      • UNPOOLED,MyBatis 会为每一个数据库操作创建一个新的连接,并关闭它。该方式适用于只有小规模数量并发用户的简单应用程序上

      • POOLED,MyBatis 会创建一个数据库连接池,连接池中的一个连接将会被用作数据库操作。一旦数据库操作完成,MyBatis 会将此连接返回给连接池。在开发或测试环境中,经常使用此种方式。

      • JNDI,MyBatis 从在应用服务器向配置好的 JNDI 数据源 dataSource 获取数据库连接。在生产环境中,优先考虑这种方式。

mappers

  1. 映射器,定义SQL映射语句

  2. 须在配置中引用mapper映射文件

    • 方式一:使用类资源路径获取资源

  3. <!-- 将mapper映射文件加入到系统核心配置文件中 -->

    <mappers>
    
    <mapper resource="cn/smbms/dao/user/UserMapper.xml"/>
    
    </mappers>
    • 方式二:使用URL获取资源

  4. <mappers>
    
    <mapper url="file://E:/sqlmappers/UserMapper.xml"/>
    
    <mapper url="file://E:/sqlmappers/ProviderMapper.xml"/>
    
    </mappers>

 


网站公告

今日签到

点亮在社区的每一天
去签到