深入理解MyBatis:轻量级ORM框架的优势与实践

Mybatis

MyBatis是一款功能强大的ORM(对象关系映射)框架,允许开发者通过定制化SQL、存储过程和高级映射功能来高效管理数据。与全自动化ORM框架不同,MyBatis提供灵活性和控制权,通过简单的XML或注解配置来映射原生信息,使其成为半自动化的ORM解决方案。

1.ORM映射

  1. ORM模型用于描述数据库表与简单Java对象之间的映射关系,旨在简化POJO(Plain Old Java Object)与数据库之间的交互。其主要职责包括:

对象关系映射
类与表的关联
属性与字段的映射
数据库操作管理
事务连接管理

  1. 映射了什么?

​ 对象关系映射

​ 类和表

​ 属性和字段

​ 数据库操作

​ 事务连接管理

2.Mybatis和hibernate的区别

优缺点比较:

特性MyBatisHibernate
ORM类型半自动化ORM全自动化ORM
SQL管理需要手动编写SQL自动生成SQL
性能轻量级,少量反射操作重量级,可能导致性能下降
SQL优化容易进行SQL优化难以优化复杂SQL
开发复杂度dao层开发需要维护SQL与映射dao层开发更简单
数据库移植性较差良好
  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优势:

    可以进行更细致的SQL优化;容易掌握

    Hibernate优势:

    dao层开发比mybatis简单,mybatis需要维护SQL和结果映射

    hibernate数据库移植性好

3.JDBC的弊端

  1. 硬编码 :不能很好的分离数据库和java语句
  2. 代码重复度高:如ResultSet的结果集
  3. Sql参数固定:sql语句不灵活
  4. 底层技术:不支持分布式,缓存等技术

4.MyBatis解决jdbc中的问题

  1. 在config配置文件中配置数据库连接池,使连接池管理数据库连接,防止数据库的频繁创建释放
  2. 将sql语句配置在xml文件中实现分离,防止sql语句写在代码中不好维护
  3. MyBatis自动将java对象映射到sql语句中,通过过statement中的parameterType定义输入参数的类型。
  4. Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型

6.配置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>
	<!-- 和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/study?serverTimezone=GMT" />
				<property name="username" value="root" />
				<property name="password" value="112811" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/yk/mapper/ClassMapper.xml"/>
	</mappers>
</configuration>

StudentMapper.xml

mybatis中所有id不允许重复

<?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">
    <select id="findStudentAll" resultType="com.yk.Student">  -- 类路径
        select * from student
    </select>

    <select id="findStudentBySid" resultType="com.yk.Student">  -- 类路径
    select * from student where sid = #{id}
    </select>

    <delete id="deleteStudent" parameterType="int">
        delete from student where sid = #{id}
    </delete>

    <update id="updateStudent" parameterType="com.yk.Student" >
        update student
        set sname=#{sname},
            birthday=#{birthday},
            ssex=#{ssex},
            classid=#{classid}
        where (sid = #{sid})
    </update>

    <insert id="addStudent" parameterType="com.yk.Student">
        insert into student (sname, birthday, ssex, classid)
        values(#{sname},#{birthday},#{ssex},#{classid})
    </insert>
</mapper>

7.动态代理规范

  1. 接口的返回值 要和sqlMapper中的ressultType 一致
  2. 接口中的入参 要和sqlMapper中的parameterType一致
  3. 接口的方法名 要和SqlMapper 中的id一致**( d a o 层不允许使用方法的重载 \color {red}dao层不允许使用方法的重载 dao层不允许使用方法的重载 )**
  4. sqlMapper中的namespace执行 接口的类路径
  5. 接口要和sqlMapper同包
  6. 接口要和sqlMapper同名

在mapper.xml中使用小于号时需要使用转义字符 < ==》 &lt

传递多参的方式一javaBean 对象 推荐

传递多参的方式二:Map(不推荐 耦合度高)

传递多参的方式三param数 数是从1开始 推荐

传递多参的方式四:arg数数是从0开始不推荐–〉和后面框架的内置参数的名称冲突

获取添加后数据的id

<!--  主键回填  -->
<insert id="insertClass" parameterType="com.yk.bean.ClassNa" useGeneratedKeys="true" keyProperty="sid">
    insert into class (classname)
    values (#{classname})
</insert>

8.resultMap元素

定义映射规则使pojo和数据库表字段建立连接

<resultMap id="smMap" type="Schoolmaster">
        <id property="smid" column="smid" jdbcType="INTEGER"/>
        <result property="smName" column="sm_name" jdbcType="VARCHAR"/>
        <result property="smsex" column="smsex" jdbcType="VARCHAR"/>
</resultMap>
  1. 结构

    <resultMap>
    	<constructor>  <-- 用于配置构造方法的元素 -->
    		<idArg />   <-- id用来标识主键列  -->
    		<arg />
    	</constructor>
    	<id />
    	<result />      <-- 实体类到Sql列名的映射关系 -->
    	<association />
    	<collection />
    	<discriminator>
    		<case />
    	</discriminator>
    </resultMap>
    

没有映射时字段名不一致的就会显示null

在这里插入图片描述

将字段映射后

在这里插入图片描述

9.多表联查

  1. 一对一<resultMap>中使用 < a s s o c i a t i o n > \color {red} <association> <association> 标签
    <resultMap id="stu_class_Map" type="student">
        <result column="sid" property="sid"/>
        <result column="sname" property="sname"/>
        <result column="ssex" property="ssex"/>
        <result column="classid" property="classid"/>
<!--     一对一   -->
        <association property="banJi">
            <result column="classid" property="classid"/>
            <result column="classname" property="classname"/>
        </association>
    </resultMap>
  1. 一对多<resultMap>中使用 < c o n n e c t i o n n > \color {red} <connectionn> <connectionn> 标签
    <resultMap id="cla_stu_Map" type="classNa">
        <result column="classid" property="classid"/>
        <result column="classname" property="classname"/>
<!--      一对多 -->
        <collection property="stu" ofType="student">
            <result column="sid" property="sid"/>
            <result column="sname" property="sname"/>
            <result column="ssex" property="ssex"/>
            <result column="classid" property="classid"/>
        </collection>
    </resultMap>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值