对象/关系映射ORM
ORM完成面向对象的编程语言DAO关系数据库的映射后,开发人员可以利用面向对象设计语言的建议易用性,也可利用关系数据库的技术优势。
ORM把关系数据库包装成面向对象的模型,采用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象,而ORM框架则将这些面向对象的操作转换成底层SQL。
把持久化对象的保存、修改、删除等操作转换为对数据库等操作。
工作机制(CRUD)
- 增(create):将一个对象插入到数据库表这种。
- 删(delete):删除对象,并从数据库中移除对应的记录。
- 改(update):修改对象的属性,并更新数据库中的记录。
- 查(read):根据查询条件查询数据库,返回对应的对象。
ORM的映射关系
- 一对一:一个对象对应数据库表中的一行。
- 一对多:一个对象对应数据库表的多条记录。
- 多对多:多个对象之间有多个关系,通常需要用中间表来进行关联。
常用ORM框架-mybatis
mybatis不完全采用对象映射方式,允许编写sql语句,并使用映射文件来进行对象映射。
MyBatis 是一款优秀的 基于 ORM 的半自动轻量级持久层框架,它支持定制化的 SQL、存储过程以及高级映射,MyBatis 避免了几乎所有 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库记录。
mybatis优势
mybatis是一个半自动化持久层框架。优势有:
- 灵活性高,支持原生SQL:可以中映射文件中编写sql。
- 避免了ORM的性能开销:mybatis提供对sql的手写控制,减少了开销。
- 支持动态SQL:能够根据条件动态的生成sql语句,通过等标签,灵活的构建。
- 简洁的映射机制
- 支持复杂的查询:可以多表连接,子查询,嵌套查询等。避免了ORM框架中复杂查询等性能损失。
- 简化了数据库事务处理:结合spring等框架的事务处理,轻松实现对数据库事务的控制,可以自动开启、提交和回滚事务,确保数据一致性和可靠性。
- 跨数据库支持
应用
- 平常开发大部分都是结合spring来使用的 引入mybatis的pom文件
java
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动坐标-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
2.常用的标签为:
- select:查询语句
- insert:插入语句
- update:更新语句
- delete:删除语句
3.xml文件
java
<?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="mapper.BasicSysUserMapper">
<!-- 查询单个用户信息 -->
<select id="selectOne" parameterType="java.lang.String" resultType="model.BasicSysUser">
SELECT
*
FROM
user_info
WHERE
username = #{username}
</select>
<!-- 查询所有用户信息 -->
<select id="selectList" resultType="model.BasicSysUser">
SELECT
*
FROM
user_info
</select>
<insert id="insertBasicSysUser"
parameterType="model.BasicSysUser">
insert into
basic_sys_user(
<trim prefix="" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="userName != null">
user_name,
</if>
<if test="realName != null">
real_name,
</if>
</trim>
)
values(
<trim prefix="" suffixOverrides=",">
<if test="id != null">
#{id},
</if>
<if test="userName != null">
#{userName},
</if>
<if test="realName != null">
#{realName},
</if>
</trim>
)
</insert>
<update id="updateBasicSysUser"
parameterType="model.BasicSysUser">
update
basic_sys_user
<set>
<if test="id != null">
id=#{id},
</if>
<if test="userName != null">
user_name=#{userName},
</if>
<if test="realName != null">
real_name=#{realName},
</if>
</set>
<where>
<if test="userName != null">
and user_name=#{userName}
</if>
<if test="id != null">
and id=#{id}
</if>
</where>
</update>
<!-- 删除 -->
<delete id="deleteBasicSysUser"
parameterType="model.BasicSysUser">
delete
from
basic_sys_user
<where>
<if test="userName != null">
and user_name=#{userName}
</if>
<if test="id != null">
and id=#{id}
</if>
</where>
</delete>
</mapper>
4.对应的mapper文件
java
// 查询列表
List<BasicSysUser> selectList(BasicSysUser basicSysUser);
// 新增
int insertBasicSysUser(BasicSysUser basicSysUser);
// 更新
int updateBasicSysUser(BasicSysUser basicSysUser);
// 删除
int deleteBasicSysUser(BasicSysUser basicSysUser);