什么是Mybatis
MyBatis是什么 - Mybatis教程 - 菜鸟教程:
MyBatis 是一个开源、轻量级的数据长期化框架,是 JDBC 和 Hibernate 的更换方案。MyBatis 内部封装了 JDBC,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,开辟者只需要关注 SQL 语句自己。
MyBatis 支持定制化 SQL、存储过程以及高级映射,可以在实体类和 SQL 语句之间建立映射关系,是一种半自动化的 ORM 实现。其封装性低于 Hibernate,但性能优秀、小巧、简朴易学、应用广泛。
MyBatis是一个优秀的半自动化长期层框架,简化了数据的操纵,同时又保留了对SQL的高度自定义,兼容了机动性和易用性,便于我们的开辟。
什么是ORM
ORM(Object Relational Mapping,对象关系映射)是一种编程技能,用于在关系型数据库和面向对象编程语言之间建立桥梁,通过自动化的数据转换机制,实现数据库记录与程序对象的双向映射。
我们的项目中大概会存在大量的CRUD的重复性的SQL,如果每个都需要自己写的话会非常浪费时间且意义不大。通过采用ORM技能。自动生成基础的CRUD SQL,可以减少大量重复性代码。ORM还实现了程序对象与数据库对象的数据映射,消除了因为关系模子和对象模子产生的结构化题目。
常见的ORM框架对比
框架
MyBatis
Hibernate
JPA (规范)
DjangoORM
控制级别
半自动(手动SQL)
全自动
接口规范
全自动
查询方式
XML/注解SQL
HQL/Criteria
JPQL
ORM API
性能优化
高(直接控SQL)
中(二级缓存)
依靠实现
中
学习曲线
中等
高
中等
低
典范应用
电商/金融体系
企业级背景
Java EE 体系
Python Web 应用
MyBatis的焦点对象
- SqlSessionFactoryBuilder:解析设置,创建SqlSessionFactory;临时对象,构建完Factory后烧毁。
- SqlSessionFactory:生产SqlSession的工程;单例模式,随着启动创建,关闭时烧毁。
- SqlSession:会话对象,实行CRUD操纵、事务控制、获取Mapper接口。
- Executor:实行SQL语句的焦点处理器。
- Executor.query 实行流程:查抄一级缓存 - 未掷中则查询数据库 - 通过StatementHandler实行SQL - 通过ResultSetHandler处理结果。
MyBatis的焦点设置
MyBatis的焦点设置文件由两部分组成,分别是全局设置文件 mybatis-config.xml 喝 Mapper xml文件组成。
全局设置文件
代码中附有具体注释,根据自己的需求修改即可。
MyBatis的两种利用方式
一、XML文件设置
流程如下
- 通过在resource下面创建mapper包用于存储Mapper.xml映射文件。
- 在Mapper接口中定义需要的方法。
- 在XML映射文件中设置SQL语句。
XML设置文件示例
- <?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="com.example.mapper.UserMapper">
- <!-- 结果映射(解决字段名不一致问题) -->
- <resultMap id="userResultMap" type="User">
- <id property="id" column="user_id"/>
- <result property="name" column="user_name"/>
- <result property="email" column="user_email"/>
- </resultMap>
- <!-- 基础查询 -->
- <select id="selectUserById" resultMap="userResultMap">
- SELECT * FROM users WHERE user_id = #{id}
- </select>
- <!-- 动态SQL -->
- <select id="selectUsersByCondition" resultMap="userResultMap">
- SELECT * FROM users
- <where>
- <if test="name != null">
- AND user_name LIKE CONCAT('%', #{name}, '%')
- </if>
- <if test="minAge != null">
- AND age >= #{minAge}
- </if>
- <choose>
- <when test="role == 'admin'">
- AND is_admin = 1
- </when>
- <otherwise>
- AND status = 1
- </otherwise>
- </choose>
- </where>
- ORDER BY create_time DESC
- </select>
- <!-- 批量插入 -->
- <insert id="batchInsert" parameterType="list">
- INSERT INTO users (user_name, email)
- VALUES
- <foreach item="user" collection="list" separator=",">
- (#{user.name}, #{user.email})
- </foreach>
- </insert>
- </mapper>
复制代码 二、注解方式设置
该方法比力实用于SQL语句比力简朴的时间,例如基础的CRUD。通过注解设置的方式可以简化开辟。
注解映射示例
- public interface UserMapper {
- @Select("SELECT * FROM users WHERE user_id = #{id}")
- @Results(id = "userResult", value = {
- @Result(property = "id", column = "user_id", id = true),
- @Result(property = "name", column = "user_name"),
- @Result(property = "email", column = "user_email")
- })
- User selectUserById(Long id);
- @SelectProvider(type = UserSqlBuilder.class, method = "buildSelectByCondition")
- List<User> selectUsersByCondition(Map<String, Object> params);
- @Insert("INSERT INTO users (user_name, email) VALUES (#{name}, #{email})")
- @Options(useGeneratedKeys = true, keyProperty = "id")
- int insertUser(User user);
- @UpdateProvider(type = UserSqlBuilder.class, method = "buildUpdateSql")
- int updateUser(User user);
- // 动态SQL构建器
- class UserSqlBuilder {
- public String buildSelectByCondition(Map<String, Object> params) {
- return new SQL() {{
- SELECT("*");
- FROM("users");
- if (params.get("name") != null) {
- WHERE("user_name LIKE CONCAT('%', #{name}, '%')");
- }
- if (params.get("minAge") != null) {
- WHERE("age >= #{minAge}");
- }
- ORDER_BY("create_time DESC");
- }}.toString();
- }
- }
- }
复制代码 两种方法的对比
- XML的方式更适合复杂的SQL语句编写;对于简朴的SQL语句,我们还是发起利用注解的方式举行编写。
- XML将SQL举行统一管理,而注解的方式将SQL分散在了Java代码中。
- XML支持动态SQL,而注解方式需要通过Provider类或拼接字符串实现动态SQL。
发起根据利用场景,混合利用XML和注解方式。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|