持久层框架-关系映射框架(ORM)

本文探讨了jdbc的不足,以及Hibernate与Mybatis的区别。Hibernate提供了面向对象的数据库操作,但性能略逊,适合复杂对象操作。Mybatis则允许自定义SQL,适合性能要求高的场景,且配置更简洁。文章还深入讲解了Mybatis的配置、动态SQL及延时加载等特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jdbc

jdbc流程

导入jar
加载驱动
创建连接
定义sql语句
用连接获取预处理
设置值
对数据库发起查询请求,并返回结果集
关闭连接

缺点:
1.频繁开启关闭连接,浪费数据库资源,影响性能->>>>连接池
2.将sql硬编码到java程序中,不利于维护

谈谈Hibernate与Ibatis的区别

1、Hibernate偏向于对象的操作达到数据库相关操作的目的;而ibatis更偏向于sql语句的优化。
2、Hibernate的使用的查询语句是自己的hql,而ibatis则是标准的sql语句。
3、Hibernate相对复杂,不易学习;ibatis类似sql语句,简单易学。
性能方面:
1、如果系统数据处理量巨大,性能要求极为苛刻时,往往需要人工编写高性能的sql语句或存储过程,此时ibatis具有更好的可控性,因此性能优于Hibernate。
2、同样的需求下,由于hibernate可以自动生成hql语句,而ibatis需要手动写sql语句,此时采用Hibernate的效率高于ibatis。

Hibernate

对JDBC进行了非常对象封装,Hibernate允许程序员采用面向对象的方式来操作关系数据库。

提高了生产率
方便移植
无入侵性

效率比JDBC略差
不适合批量操作
只能配置一种关联关系

Hibernate中的缓存主要有Session缓存(一级缓存)和SessionFactory缓存(二级缓存,一般由第三方提供)。


Mybatis

在这里插入图片描述

学习官网:http://www.mybatis.org/mybatis-3/zh/getting-started.html

  • 可以自由控制SQL语句
  • 更少的配置
<mapper namespace="com.zjy.seckill.dao.SuccessKilledDao">
    <insert id="insertSuccessKilled">
        <!--当出现主键冲突时(即重复秒杀时),会报错;不想让程序报错,加入ignore-->
        INSERT ignore INTO success_killed(seckill_id,user_phone,state)
        VALUES (#{seckillId},#{userPhone},0)
    </insert>
</mapper>

mysql/jdbc/mybatis映射类型

https://blog.youkuaiyun.com/zongf0504/article/details/96438574

全局配置文件

https://www.cnblogs.com/sishang/p/6557103.html

—<properties>加载顺序

a. 当使用占位符给某个属性赋值时,这个属性会去找properties属性下是否有同名的子属性property。
b. 接着去找在xml中引入的resource或url中相同名称的属性值。
c. 最后,如果在创建SqlSessionFactory时,SqlSessionFactoryBuilder有引入新的文件,文件中含有相同的属性名称,则之前设定的值都会被覆盖。

—<setting>设置

https://blog.youkuaiyun.com/mqf163/article/details/52514015

—<typeAliases>别名

https://blog.youkuaiyun.com/majinggogogo/article/details/71503263
批量定义别名 <package>

—mappers

https://blog.youkuaiyun.com/fageweiketang/article/details/80835733

动态sql

http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html

1.sqlSession

builder>factory>sqlsession线程不安全的
不使用mapper代理时,会操作sqlSession

2.mapper代理开发

  1. mapper.xml的namespace是dao接口的地址com.zjy.dao.userDao
  2. 接口输入类型和parameterType一样,返回类型和resultType一样(resultType是User集合时,接口返回可以使List)
  3. UserMapper接口 = sqlSession.getMapper(UserMapper.class);

2.mybatis#$的区别

#传入的数据都当成一个字符串,会对传入的数据自动加上引号
$将传入的数据直接生成在sql语句中,可能会受到sql注入攻击,order by字句或like语句时应该用$
如果传入的参数是简单类型,使用${}时里面必须是value

resultType与resultMap

一对一查询:resultType内连接
resultMap可以实现延时加载,resultType不行
一对多查询:pojo中添加list<>,映射到集合
resultMap详细使用:
http://www.cnblogs.com/kenhome/p/7764398.html

延时加载(不开启会导致查询较慢)

https://www.cnblogs.com/jack1995/p/7260722.html

Mybatis执行自定义sql语句

https://blog.youkuaiyun.com/lv842586821/article/details/80581092

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值