深入浅出——Mybaties 入门码农避坑必备(一)

Mybatis实战

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • Mybatis实战
  • 前言
  • 一、Mybaties是什么?
  • 二、 Mybatis 的基本使用
    • 1 Mybatis 的 jar 包下载地址
    • 2 Mybatis 的 jar 包介绍
    • 3 核心 API 介绍
      • 3.1核心API
      • 3.2核心 API 工作流程
      • 3.3生命周期
    • 配置环境的总结
  • 总结


前言

Mybatis
例如:随着大数据的不断发展,Mybaties这门技术也越来越重要,很多人都开启了学习框架,本文就介绍了Mybaties的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Mybaties是什么?

      Mybatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用简单的XML或注解来配置和映射原生信息,将jav中的普通对象映射成数据库中的记录。
      简单的说:MyBatis 是一个半自动 ORM 框架,其本质是对 JDBC 的封装。使用 MyBatis重点需要程序员编写 SQL 命令,不需要写一行 JDBC 代码。
      相反Hibernate是一个全自动的ORM框架;因为 Hibernate 创建了 Java 对象和数据库表之间的完整映射,可以完全以面向对象的思想来操作数据库,程序员不需要手写 SQL 语句,而 MyBatis 中还需要手写 SQL 语句,所以是半自动化的,工作量要大于 Hibernate。

为什么半自动化的 Mybatis 比自动化的 Hibernate 受欢迎?

由于MyBatis 需要手写 SQL 语句,所以工作量要大于 Hibernate。但是也正是由于自定义SQL 语句,所以其灵活性、可优化性就超过了 Hibernate;MyBatis 将手写 SQL 语句的工作丢给开发者,可以更加精确的定义 SQL,更加灵活,也便于优化性能。完成同样功能的两条 SQL 语句的性能可能相差十几倍到几十倍,在高并发、快响应要求下的互联网系统中,对性能的影响更明显
深入浅出——Mybaties 入门码农避坑必备(一)_第1张图片
深入浅出——Mybaties 入门码农避坑必备(一)_第2张图片

总之,因为 MyBatis 具有封装少、映射多样化、支持存储过程、可以进行 SQL 语句优
化等特点,符合互联网高并发、大数据、高性能、高响应的要求,使它取代 Hibernate 成
为了 Java 互联网中首选的持久框架。而对于对性能要求不高的比如内部管理系统、ERP 等
可以使用 Hibernate。

使用框架的好处:

  1. 降低代码的重用率
  2. 代码结构的规范化,降低程序员之间沟通以及日后维护的成本
  3. 知识的积累,可以让那些经验丰富的人员去设计框架和领域构件,而不必限于低层编程

二、 Mybatis 的基本使用

1 Mybatis 的 jar 包下载地址

https://github.com/mybatis/mybatis-3/releases

2 Mybatis 的 jar 包介绍

深入浅出——Mybaties 入门码农避坑必备(一)_第3张图片
在这里插入图片描述

3 核心 API 介绍

3.1核心API

SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 的作用是使用构建者模式创建 SqlSessionFactory 接口对象。
SqlSessionFactory
SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession接口对象
SqlSession
如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的commit、rollback 方法提交或者回滚事务
Mapper
映射器。由一个 Java 接口和 XML 文件(或者注解构成),需要给出对应的 SQL 和映射规则,负责发送 SQL 去执行并返回结果

3.2核心 API 工作流程

深入浅出——Mybaties 入门码农避坑必备(一)_第4张图片

3.3生命周期

SqlSessionFactoryBuilder:
该类用来创建 SqlSessionFactory 对象,当 SqlSessionFactory 对象被创建后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域。

SqlSessionFactory:
SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,所以一旦创建了SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,所以可以认为SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。由于 SqlSessionFactory是 一 个 对 数 据 库 的 连 接 池 , 所 以 它 占 据 着 数 据 库 的 连 接 资 源 。 如 果 创建多个SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。因此 SqlSessionFactory 是一个单例,让它在应用中被共享。

SqlSession:
SqlSession 应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。
所以 SqlSession 的最佳的作用域是请求或方法作用域。

Mapper:
由于 SqlSession 的关闭,它的数据库连接资源也会消失,所以它的生命周期应该小于等于 SqlSession 的生命周期。Mapper 代表的是一个请求中的业务处理,所以它应该在一个请求中,一旦处理完了相关的业务,就应该废弃它。
4 Mybatis 的配置文件
https://mybatis.org/mybatis-3/zh/configuration.html
在 Mybatis 中配置文件有两种:
 全局配置文件
 映射配置文件

4.1全局配置文件
全局配置文件的名称是自定义的,在 JavaProject 项目中需要放到 src 目录下。
全局配置文件的作用是完成一些全局性的配置,如:对 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>
</configuration>

4.1.1 properties 标签
Mybatis 配置文件中的属性定义。properties 标签中允许内部定义属性,也可以是外部的properties 文件定义属性。无论是内部定义还是外部定义,都可以使用${name}获取值。
配置文件中内部定义

<properties>
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url"
value="jdbc:mysql://localhost:3306/bjsxt"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>

配置文件中外部定义

<properties resource="db.properties"></properties>

db.properties文件:

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

4.1.2 typeAliases 标签
类型别名可为 Java 类型设置一个缩写名

<typeAliases>
<typeAlias alias="user" type="com.bjsxt.pojo.User" />
</typeAliases>

也可以指定一个包名,MyBatis 会在包名下面搜索需要的Java Bean

<typeAliases>
<package name="com.bjsxt.pojo"/>
</typeAliases>

4.1.4.1 transactionManager 节点
事务处理器。
在MyBatis 中有两种类型的事务管理器(也就是type="[JDBC|MANAGED]")
JDBC :这个配置直接使用了JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED :不做事务处理。
4.1.4.2 dataSource 标签
dataSource 元素使用标准的JDBC 数据源接口来配置JDBC 连接对象的资源。
UNPOOLED:使用直连。
POOLED:使用池连。
JNDI :使用JNDI 方式连接
4.1.5 mapper 标签
指定映射配置文件
使用相对于类路径指定映射配置文件

<mappers>
<mapper resource="com/zhang/mapper/UserMapper.xml"/>
</mappers>

使用filter:///协议指定映射配置文件

<mappers>
<mapper
url="file:///D:\code\mybatis\src\com\zhang\mapper\UserMapper.xml"
/>
</mappers>

指定映射接口

<mappers>
<mapper class="com.zhang.mapper.UserMapper"/>
</mappers>

通过包名指定映射接口

<mappers>
<package name="com.zhang.mapper"/>
</mappers>

4.2映射配置文件
映射配置文件主要是用来编写sql 语句的,结果集的映射关系的指定,以及缓存的一些配置等等。
深入浅出——Mybaties 入门码农避坑必备(一)_第5张图片

<?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.zhang.mapper.UserMapper">
</mapper>

4.2.1 resultMap 标签
指定查询结果集与对象的映射关系,是最复杂也是最强大的标签。
id:唯一标识。
type:类的完全名, 或者一个类型别名

<resultMap id="userMapper" type="com.zhang.pojo.User">
   <id property="userid" column="user_id"/>
   <result property="username" column="user_name"/>
</resultMap>

4.2.1.1 id 标签
指定主键中的值,用于标识一个结果映射。

4.2.1.2 result 标签
指定非主键中的值,用于标识一个结果映射。

4.2.1.3 association 标签
通常用来映射一对一的关系。

4.2.1.4 collection 标签
通常用来映射一对多的关系。

4.2.2 select 标签
查询语句。
id:当前查询语句的唯一标识,该属性的值不能重复。
parameterType:指定参数类型。该属性是可选属性。因为MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数。
resultType:期望从这条语句中返回结果的类全名或别名。
resultMap:使用resultMap 标签来处理结果集映射。

<select id="selectUser" parameterType="int" resultType="com.zhang.pojo.User">
    select * from users where userid = #{userid}
</select>

4.2.3 insert 标签
添加语句。
id:当前添加语句的唯一标识,该属性的值不能重复。
parameterType:指定参数类型,可以给定别名。该属性是可选属性。

<insert id="insertUser" parameterType="com.zhang.pojo.User">
insert into users values(default ,#{username},#{usersex})
</insert>

4.2.4 update 标签
更新语句。
id:当前更新语句的唯一标识,该属性的值不能重复。
parameterType:指定参数类型,可以给定别名。该属性是可选属性。

<update id="updateUser" parameterType="com.bjsxt.pojo.User">
update users set username=#{username},usersex=#{usersex} where
userid =#{userid}
</update>

4.2.5 delete 标签
删除语句。
id:当前删除语句的唯一标识,该属性的值不能重复。
parameterType:指定参数类型,可以给定别名。该属性是可选属性。

<delete id="deleteUser" parameterType="int">
    delete from users where userid = #{userid}
</delete>

4.2.6 sql 标签
可以用来定义可重用的SQL 代码片段。通过标签引入该片段。
id:当前SQL 片段的唯一标识,该属性的值不能重复。

<sql id="userColumns">
userid,username,usersex
</sql>
<select id="selectUser" parameterType="int" resultType="com.zhang.pojo.UserMapper">
select <include refid="userColumns"/> from users
</select>

配置环境的总结

第一步是,首先要配置全局配置文件
全局配置的单独文件头已在上面记录,小伙伴们可以复古一波;
本人的全局配置文件代码如下:(可借鉴哈)

<?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>
    <!--引入db文件-->
    <properties resource="db.properties"></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>
        <environment id="text">
            <transactionManager type="JDBC"></transactionManager>
            <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 class="com.zhang.Mapper.UserMapper"/>
    </mappers>
</configuration>

第二步是配置映射配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD com.zhang.Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhang.Mapper.UserMapper">
    <resultMap id="userMapper" type="com.zhang.POJO.Users">
        <id property="userid" column="userid"/>
        <result property="username" column="username"/>
        <result property="usersex" column="usersex"/>
    </resultMap>
    <select id="selectUsers" parameterType="int" resultType="com.zhang.POJO.Users">
        select * from users where userid = ${userid}
    </select>
    <insert id="insertUser" parameterType="com.zhang.pojo.User">
        insert into users values(default ,#{username},#{usersex})
    </insert>

</mapper>

需要注意的地方是namespace那里的配置是否正确,刚入门的小伙伴可能会在全局配置文件中的Mapper标签配置错误;如果在运行代码时出现找不到配置文件的记得回头看看Mapper标签是否正确哈;

总结

提示:以上就是本人对Mybatis的总结,第一部分已过一万字,第二部分将于3天后更新哈,喜欢的小伙伴,关注收藏哈:

你可能感兴趣的