Mybatis
MyBatis是一款功能强大的ORM(对象关系映射)框架,允许开发者通过定制化SQL、存储过程和高级映射功能来高效管理数据。与全自动化ORM框架不同,MyBatis提供灵活性和控制权,通过简单的XML或注解配置来映射原生信息,使其成为半自动化的ORM解决方案。
1.ORM映射
- ORM模型用于描述数据库表与简单Java对象之间的映射关系,旨在简化POJO(Plain Old Java Object)与数据库之间的交互。其主要职责包括:
对象关系映射
类与表的关联
属性与字段的映射
数据库操作管理
事务连接管理
- 映射了什么?
对象关系映射
类和表
属性和字段
数据库操作
事务连接管理
2.Mybatis和hibernate的区别
优缺点比较:
特性 | MyBatis | Hibernate |
---|---|---|
ORM类型 | 半自动化ORM | 全自动化ORM |
SQL管理 | 需要手动编写SQL | 自动生成SQL |
性能 | 轻量级,少量反射操作 | 重量级,可能导致性能下降 |
SQL优化 | 容易进行SQL优化 | 难以优化复杂SQL |
开发复杂度 | dao层开发需要维护SQL与映射 | dao层开发更简单 |
数据库移植性 | 较差 | 良好 |
-
hibernate是全自动化ORM,Mybatis是半自动化ORM。
-
Hibernate简化dao层,不用考虑SQL语句的编写和结果映射,重点放在业务逻辑上;
Mybatis需要手写SQL语句以及结果映射。
-
Hibernate是一个重量级的框架,内部生成SQL语句,反射操作太多,导致性能下降;
Mybatis是一个轻量级的框架,需要自己写sql语句,有较少的反射操作。 -
Hibernate 不方便做SQL优化,遇到较复杂的SQL语句需要绕过框架实现复杂,对多字段的结构进行部分映射困难;
Mybatis 不仅可以做SQL优化还可以SQL与Java分离,还可以自行编写映射关系,复杂的SQL语句Mybatis效率更高
Mybatis优势:
可以进行更细致的SQL优化;容易掌握
Hibernate优势:
dao层开发比mybatis简单,mybatis需要维护SQL和结果映射
hibernate数据库移植性好
3.JDBC的弊端
- 硬编码 :不能很好的分离数据库和java语句
- 代码重复度高:如ResultSet的结果集
- Sql参数固定:sql语句不灵活
- 底层技术:不支持分布式,缓存等技术
4.MyBatis解决jdbc中的问题
- 在config配置文件中配置数据库连接池,使连接池管理数据库连接,防止数据库的频繁创建释放
- 将sql语句配置在xml文件中实现分离,防止sql语句写在代码中不好维护
- MyBatis自动将java对象映射到sql语句中,通过过statement中的parameterType定义输入参数的类型。
- 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.动态代理规范
- 接口的返回值 要和sqlMapper中的ressultType 一致
- 接口中的入参 要和sqlMapper中的parameterType一致
- 接口的方法名 要和SqlMapper 中的id一致**( d a o 层不允许使用方法的重载 \color {red}dao层不允许使用方法的重载 dao层不允许使用方法的重载 )**
- sqlMapper中的namespace执行 接口的类路径
- 接口要和sqlMapper同包
- 接口要和sqlMapper同名
在mapper.xml中使用小于号时需要使用转义字符 < ==》 <
传递多参的方式一: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>
-
结构
<resultMap> <constructor> <-- 用于配置构造方法的元素 --> <idArg /> <-- id用来标识主键列 --> <arg /> </constructor> <id /> <result /> <-- 实体类到Sql列名的映射关系 --> <association /> <collection /> <discriminator> <case /> </discriminator> </resultMap>
没有映射时字段名不一致的就会显示null
将字段映射后
9.多表联查
- 一对一 在
<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>
- 一对多 在
<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>