框架 ---Mybatis 详细概述 及入门程序hibernate对比 no 01.

1.mybatis的介绍

在这里插入图片描述

1.0.1mybatis的优点
在这里插入图片描述

1.0.2传统jdbc编译步骤

1、 加载数据库驱动
2、 创建并获取数据库链接
3、 创建jdbc statement对象
4、 设置sql语句
5、 设置sql语句中的参数(使用preparedStatement)
6、 通过statement执行sql并获取结果
7、 对sql执行结果进行解析处理
8、 释放资源(resultSet、preparedstatement、connection)

存在缺点:
1、 数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。如果使用数据库连接池可解决此问题。
2、 Sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能较大,sql变动需要改变java代码。
3、 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
4、 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。

2.Mybatis架构

在这里插入图片描述

1、 mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

3.Mybatis的入门

mybatis的下载地址:https://github.com/mybatis/

1 需求列表
根据用户ID查询用户信息
根据用户名查找用户列表
添加用户
修改用户
删除用户

  • 根据用户ID查询用户信息

结构结构:

在这里插入图片描述
新建项目加入jar包,加上mysql驱动:

在这里插入图片描述

建立数据库:

在这里插入图片描述

sqlMapConfig.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>
	
	<!-- 和spring整合后 environments配置将废除 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Driver" />
				<property name="url"		
					value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC" />
				<property name="username" value="root" />
				<property name="password" value="123456" />
			</dataSource>
		</environment>
	</environments>
	
	<!--mapper的位置:加载映射文件-->
	<mappers>
		
		<mapper resource="sqlmap/User.xml"></mapper>
	</mappers>
	
</configuration>




创建sql映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"D://mybatis-dtd/dtd/mybatis-3-mapper.dtd">
<mapper namespace="user" >
	<!--id:sql id 语句的唯一标识
	parameterType:入参的数据类型
	resultType:返回结果的数据类型
	#{}是占位符相当于jdbc的?号
		
	-->
	<select id="getuserById" parameterType="int" resultType="com.st.mybatis.pojo.User">
 SELECT
  `id`,
  `username`,
  `birthday`,
  `sex`,
  `address`
	FROM
  `mybatis`.`user`
	WHERE id=#{id1}
	</select>
</mapper>


测试类:

package com.st.mybatis.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.st.mybatis.pojo.User;

public class MybatisTest {
	@Test
	public void testdemo1() throws IOException {
		//创建SqlSessionFactoryBuilder对象
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		//创建核心配置文件的输入流
		InputStream inputstream=Resources.getResourceAsStream("sqlMapConfig.xml");
		//通过输入流创建SqlSessionFactory对象
		SqlSessionFactory sqlSessionFactory=ssfb.build(inputstream);
		//创建SqlSession对象
		SqlSession sqlSession=sqlSessionFactory.openSession();
		//执行查询
		User user=sqlSession.selectOne("user.getuserById", 1);
		//输出结果
		System.out.println(user);
		//释放资源
		sqlSession.close();
		
	}

}

在这里插入图片描述

  • 根据用户名查找用户列表:
    注意:这里${}是字符串拼接指令
	<select id="getuserByuserName" parameterType="String" resultType="com.st.mybatis.pojo.User">
	SELECT
	  `id`,
	 `username`,
	  `birthday`,
 	 `sex`,
 	 `address`
	FROM
	 `user`
	WHERE username LIKE '%${value}'
	</select>
  • 添加用户
  • 略…
  • 修改用户
  • 略…
  • 删除用户
  • 略…

4.Mybatis Dao开发方式:

4.1Dao需求

  • 根据用户ID查询用户信息
  • 根据用户名查找用户列表
  • 添加用户

4.2原始Dao开发方法

略…

4.2.1新建个UserDao接口

4.3动态代理开发(官方推荐)

. 动态代理开发规则:

  1. namespace必需是接口的全路径名。
  2. 接口的方法名必须与sql id一致
  3. 接口的入参parameterType类型一致
  4. 接口的返回值必须与resultType类型一致

5.SqlMapConf.xml配置

sqlMapConfig.xml中配置的内容和顺序如下:

在这里插入图片描述
其他略.mybatis是属于持久层,比hibernate相对来说 要简单很多.hibernate和mybitatis对比:没有谁好谁差,mybatis更适合电商等平台的开发,因为mybatis执行查询语句可以看出,对高访问的网站,查询一条语句具体到某个值肯定要比查询所有要快得多.hibernate对于ORM要严谨得多.对解耦和要求高的架构 用hibernate。hibernate可以随时切换数据库,这样看上去hibernate又更加的灵活,mybatis没法实现像hibernate这样的可插拔的要求.还有像项目成本类的 hibernate显然要更加的庞大。当然这不是教科书式的回答。下面才是:

MyBatis因为具有封装少,映射多样化,支持存储过程,可以进行SQL优化等特点。使得它取代了Hibernate成为了java互联网中首选的持久框架。

无论MyBatis或Hibernate都可以称为ORM框架,Hibernate的设计理念是完全面向POJO的,而MyBatis不是。
Hibernate基本不再需要编写SQL就可以通过映射关系来操作数据库,是一种全表映射的体现,而MyBatis需要我们提供SQL去运行。程序员不用精通SQL,只要懂得操作POJO就能够操作对应数据库的表。

在管理系统时代,首先是实现业务逻辑,然后才是性能,所以Hibernate在当时是主流。

在移动互联网时代,MyBatis是首选,不屏蔽SQL,程序员可以自己制定SQL规则,能更加精确定义SQL,从而优化性能。更符合移动互联网高并发,大数据,高性能,高响应的要求。

Hiberate和MyBatis的增、删、查、改.对于业务逻辑层来说大同小异,对于映射层而言Hibemate的配置不需要接口和SQL.相反MyBatis是需要的。对于Hibermate而言,不需要编写大量的SQL,就可以完全映射,同时提供了日志、缓存、级联(级联比MyBatis强大)等特性,此外还提供HQL (Hibemate Query Language)对POIO进行操作,使用十分方便,但是它也有致命的缺陷。

由于无须SQL,当多表关联超过3个的时候,通过Hibermate的级联会造成太多性能的丢失,又或者我现在访问一个财 务的表,然后它会关联财产信息表,财产又分为机械、原料等.显然机械和原料的字段是不一样的,这样关联字段只能根据特定的条件 变化而变化,而Hibermate无法支持这样的变化。遇到存储过程,Hibemate只能作罢。更为关键的是性能,在管理系统的时代,对于性能的要求不是那么苛刻,但是在互联网时代性能就是系统的根本,响应过慢就会丧失客户,试想一下谁会去用一个经常需要等待超过10 秒以上的应用呢?

以上的问题MyBatis都可以解决,MyBatis 可以自由书写SQL、支持动态SQL、处理列表、动态生成表名,支持存储过程。这样就可以灵活地定义查询语句,满足各类需求和性能优化的需要,这些在互联网系统中是十分重要的。

但MyBatis也有缺陷。首先,它要编写SQL和映射规则,其工作量稍微大于 Hibemate.其次,它支持的工具也很有限,不能像Hibemate那样有许多的插件可以帮助生成映射代码和关联关系,而即使使用生成工具,往往也需要开发者进一步简化, MyBatis 通过手工编码,工作量相对大些。所以对于性能要求不太苛刻的系统,比如管理系统、ERP 等推荐使用Hibemate;而对于性能要求高、响应快、灵活的系统则推荐使用MyBatis.

摘抄自:《javaEE互联网轻量级框架整合开发》

发布了76 篇原创文章 · 获赞 9 · 访问量 6787

猜你喜欢

转载自blog.csdn.net/qq_37870369/article/details/89360386
今日推荐