MyBatis初识

前言

JDBC的问题以及MyBatis如何解决

  1. 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。
    解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。
  2. Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
    解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
  3. 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
    解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
  4. 结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象
    解析比较方便。
    解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

ORM模型

==ORM 模型是数据库的表和简单 Java 对象(Plain Ordinary Java Object,简称 POJO)的映射关系模型,主要解决数据库数据和 POJO 对象的相互映射。

常见的ORM模型

  1. MyBatis 是一款 半自动 的ORM 模型,它支持定
    制化SQL、存储过程以及高级映射。(Mybatis需要自己写SQL)
  2. Hibernate 是一个 全自动 的ORM 模
    型,Hibernate 可以自动生成 SQL 语
    句,自动执行。
MyBatis和hibernate的区别
  1. Hibernate使全自动化ORM; Mybatis是半自动化ORM。
  2. Hibernate简化dao层,不用考虑SQL语句的编写和结果映射,重点放在业务逻辑上;Mybatis需要手写SQL语句以及结果映射。
  3. Hibernate是一个重量级的框架,内部生成SQL语句,反射操作太多,导致性能下降;
    Mybatis是一个轻量级的框架,需要自己写sql语句,有较少的反射操作。
  4. Hibernate 不方便做SQL优化,遇到较复杂的SQL语句需要绕过框架实现复杂,
    对多字段的结构进行部分映射困难;
    Mybatis 不仅可以做SQL优化还可以SQL与Java分离,还可以自行编写映射关系,
    复杂的SQL语句Mybatis效率更高

MyBatis

MyBatis是一款ORM模型,支持定制化SQL、存储过程以及高级映射。可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录

MyBatis生命周期

SqlSessionFactoryBuilder :构造器,会根据配置信息生成SqlSessionFactory。
SqlSessionFactory :利用工厂模式生产 SqlSession。
SqlSession :既可以发送 SQL 语句去执行并返回结果,也可以获取 Mapper 的接口。
SQL Mapper :映射器,给出对应的 SQL 和映射规则,负责发送 SQL 和处理结果;


(1)读取MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了
MyBatis 的运行环境等信息,例如数据库连接信息。
(2)加载映射文件。映射文件即SQL 映射文件,该文件中配置了操作数据库的SQL 语句,
需要在MyBatis 配置文件mybatis-config.xml 中加载。mybatis-config.xml 文件可以
加载多个映射文件,每个文件对应数据库中的一张表。
(3)构造会话工厂:通过MyBatis 的环境等配置信息构建会话工厂SqlSessionFactory。
(4)创建会话对象:由会话工厂创建SqlSession 对象,该对象中包含了执行SQL 语句的
所有方法。
(5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据
SqlSession 传递的参数动态地生成需要执行的SQL 语句,同时负责查询缓存的维护。
(6)MappedStatement 对象:在 Executor 接口的执行方法中有一个
MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL
语句的id、参数等信息。
(7)输入参数映射:输入参数类型可以是Map、List 等集合类型,也可以是基本数据类型
和POJO 类型。输入参数映射过程类似于JDBC 对preparedStatement 对象设置参数
的过程。
(8)输出结果映射:输出结果类型可以是Map、List 等集合类型,也可以是基本数据类
型和POJO 类型。输出结果映射过程类似于JDBC 对结果集的解析过程。

MyBatis的使用

  1. 引入mybatis-config.xml配置文件(该配置文件主要是连接数据库所需的配置信息)
  2. 引入Mapper映射文件(配置SQL语句和映射的配置文件)
  3. 创建MyBatisUtil(用来创建MyBatis的数据库SqlSession会话类)
  4. 创建SqlSession类访问数据库(创建出 SqlSession后,利用 SqlSession访问数据库)
  5. 输出结果(查询数据库的学生表信息,并输出学生姓名和学生学号。

主配置文件代码:

<?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>
<!-- 和spring整合后 environments将废除 -->
    <environments default="development">
        <environment id="development">
        <!-- 使用JDBC事务管理,事务控制由mybatis -->
            <transactionManager type="JDBC"/>
            <!-- 数据库连接池,由mybatis提供 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/wwt?serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

< configuration>:标识配置文件的起始,所有配置信息都存放在这里。
< enviroments>:配置数据库环境信息,注册数据源,配置数据库事务。
< enviroment>:单个环境信息的标识
< transactionManager >:配置数据库事务。
< environment >:单个环境信息的标识。
< transactionManager >:配置数据库事务。
< dataSource >:配置环境信息中数据源连接的信息。
< property >:配置环境信息的属性。
< mappers > :用来在MyBatis初始化的时候引入映射器。
  用相对路径引入映射器:
在这里插入图片描述
  注册指定包下所有mapper接口:
在这里插入图片描述
  用文件定位符引入映射器:
在这里插入图片描述
  后两种方法法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
< typeAliases >:别名,将虚拟表映射为java中的实体类的对象时使用。
在这里插入图片描述

优化主配置文件:

    在主配置文件中直接配置数据库信息可能会被窃取,所以使用物理隔离的方法,将数据库信息存放在properties配置文件中,通过< properties >< /properties>属性获取数据。
1.下图为properties配置文件内容:

2.在< configuration>属性下方加入该标签

3.将< dataSource >中的value值替换为${ properties文件中的name }
在这里插入图片描述

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="test">
<!-- namespace是命名空间, 作用是对sql进行分类化管理-->
<!-- 如果使用mapper代理的方式进行开发,namespace会有特殊的作用-->
  <select id="findUserById" parameterType="int" resultType="com.apes.bean.User">
     select * from userinfo where id=#{id}
  </select>
</mapper>

在映射文件中会配置很多sql语句通过select标签执行数据库的查询

  1. id:标识映射文件中的sql语句
    由于将sql语句封装到mappedStatement对象中,所以id也称作statement的id
  2. parameterType:输入参数的类型
  3. #{}表示一个占位符
    #{id}:其中id表示接收参数的名称,如果参数类型是基本数据类型,名称可以随意
  4. resultType:指定sql查询结果所输出的java对象类型

MyBatisUtil代码:

public class DaoUtil {
	public static SqlSessionFactory sqlSessionFactory = null;
	static {
		InputStream inputStream = null;
		try {
			inputStream = Resources.getResourceAsStream("mybatis-config.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static SqlSession getSqlSession() {
		return sqlSessionFactory.openSession();
	}
	public static void closeSqlSession(SqlSession sqlSession) {
		sqlSession.close();
	}
}

测试示例

public class UserTest {
	public static void main(String[] args) {
		SqlSession sqlSession = DaoUtil.getSqlSession();
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	    User user = userMapper.findUserById(1);
	}
}
  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值