java-持久层jdbc|多种对象关系映射框架(ORM)

版权声明:fromZjy QQ1045152332 https://blog.csdn.net/qq_36762677/article/details/82964088

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>

全局配置文件

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

—<properties>加载顺序

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

—<setting>

https://blog.csdn.net/mqf163/article/details/52514015

—<typeAliases>别名

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

—mappers

https://blog.csdn.net/fageweiketang/article/details/80835733

动态sql

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

sql片段

https://www.cnblogs.com/shenxiaoquan/p/5779999.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

猜你喜欢

转载自blog.csdn.net/qq_36762677/article/details/82964088