MyBatis

简介: MyBatis

MyBatis

Mybaits 是一个优秀的 持久层 框架, 用于简化 JDBC 开发

简单的说 : Mabatis 是更简单完成程序和数据库交互的框架, 也就是更简单的操作和读取数据库的工具

#{ } & ${ }

#{ } : 预编译 SQL

${ } : 即时 SQL

SQL 的执行流程

  1. 解析语法, 校验 SQL 有没有问题
  2. SQL 优化编译, 制定执行计划
  3. 执行SQL
  1. 性能区别 : 对于预编译 SQL, 在编译一次过后, 会将编译后的 SQL 语句缓存起来, 后面再次执行这条语句时, 不会重新编译 (只是替换参数), 省去了解析优化等过程, 因此可以提高性能
  2. SQL 注入 : 通过操作输入的数据来修改实现定义好的 SQL 语句, 以达到执行代码, 对服务器进行攻击. ${ } 存在 SQL 注入问题, #{ } 可以解决 SQL 注入问题.


${ } 的使用场景

  1. 排序 : select * from user order by id ${ };
  2. 模糊匹配 : like '%${key}%' – 可以使用内置函数 concat( ) 替代
  3. 分库分表传 表名

数据库连接池 – 池化技术

数据库连接池负责分配, 管理, 和释放数据库连接. 它允许应用程序重复使用一个现有的数据库连接, 而不是每次使用都要重新简历, 使用完毕就释放销毁.

作用 :

  1. 减少了网络开销
  2. 资源重用
  3. 提升了系统的性能

MyBatis 默认使用的数据库连接池是 Hikari .

数据库表和类对象的参数匹配

  1. SQL 语句中使用 as 起别名
  2. 结果映射
<resultMap id="userinfoMap" type="com.zrj.mybatisreview.model.UserInfo">
    <id column="id" property="id"></id>
    <result column="delete_flag" property="deleteFlag"></result>
    <result column="create_tiem" property="createTime"></result>
    <result column="update_time" property="updateTime"></result>
</resultMap>

<select id="queryAllUser" resultMap="userinfoMap">
    select * from userinfo
</select>

  1. 配置文件中开启 驼峰命名
    驼峰命名规则 : 表中字段: abc_xyz => 类对象属性 : abcXyz
mybatis:
  configuration:
    map-underscore-to-camel-case: true #配置驼峰⾃动转换

使用注释, 操作数据库

// 使用该注释获取数据库表中的主键, 并将其传输到 绑定类对象中的 keyProperty 属性中
@Options(useGeneratedKeys = true, keyProperty = "id")
@Select("Insert into user values(null, #{username}, #{password})")
public Integer insertOne(@Param("username") String username,@Param("password") String password);

@Delete("delete from user where id = #{id}")
public Integer delOne(int id);

@Select("select * from user order by id desc")
public List<User> selectAll();

@Update("update user set username = #{username} where id = #{id}")
public Integer updateOne(@Param("id") int id, @Param("username") String username);

使用 xml 文件, 操作数据库

<resultMap id="userinfoMap" type="com.zrj.mybatisreview.model.UserInfo">
  <id column="id" property="id"></id>
  <result column="delete_flag" property="deleteFlag"></result>
  <result column="create_tiem" property="createTime"></result>
  <result column="update_time" property="updateTime"></result>
</resultMap>

<select id="queryAllUser" resultMap="userinfoMap">
    select * from userinfo
</select>

<insert id="insertUserInfo" useGeneratedKeys="true" keyProperty="userinfo.id">
    insert into userinfo(username, password, age, gender, phone)
    values(#{userinfo.username}, #{userinfo.password},
    #{userinfo.age}, #{userinfo.gender},
    #{userinfo.phone})
</insert>

<update id="updateOne">
    update userinfo set username = #{username} where id = #{id}
</update>

<delete id="delOne">
    delete from user where id = #{id}
</delete>

Mybatis 中动态标签


< if > 标签

<select id="one">
    select
        (username, password,
        <if test="age != 0">
            age,
        </if>
        gender, phone)
    from user where id = #{id}
</select>


< trim > 标签

理论上其他标签都可以使用 trim 标签实现

<insert id="three" useGeneratedKeys="true" keyProperty="userinfo.id">
    insert into userinfo
        <trim prefix="(" suffix=")" suffixOverrides="," prefixOverrides=",">
            <if test="username != null">
                username,
            </if>
            <if test="password != null">
                `password`,
            </if>
        </trim>
    values
        <trim prefix="(" suffix=")" suffixOverrides="," prefixOverrides=",">
            <if test="username != null">
                #{username},
            </if>
            <if test="password != null">
                #{password},
            </if>
        </trim>
</insert>


< where > 标签

< where > 标签能够自动去除子句开头的 AND 或者 OR

< where > 只会在子元素有内容的情况下才插入 where 子句

<select id="two">
  select (username, password, age, gender, phone)
  from user
    <where>
      <if test="id != null">
        and id = #{id}
      </if>
      <if test="username != null">
        and `username` = #{username}
      </if>
      <if test="password != null">
        and `password` = #{password}
      </if>
   </where>
</select>

< set > 标签

< set > 标签能够自动删除 额外的逗号

<update id="four">
    update userinfo 
    <set>
        <if test="username != null">
            username = #{username} ,
        </if>

        <if test="password != null">
            `password` = #{password},
        </if>
    </set>
    where id = 1
</update>

< foreach > 标签

<delete id="five">
    delete from user where id in
    <foreach collection="ids" open="(" close=")" separator="," item="e" >
        #{e}
    </foreach>
</delete>



< sql > 标签 & < include > 标签

< sql > 标签 : 定义可重用代码片段

< include > 标签 : 通过 refid 属性, 绑定要包含的代码片段

<select id="six1">
    select username, password, age, gender, phone
    from user
</select>

<sql id="e">
    username, password, age, gender, phone
</sql>

<select id="six2">
    select (
    <include refid="e"></include>
    )
    from user
</select>

目录
相关文章
|
5月前
|
SQL Java 关系型数据库
MyBatis-Plus详解(4)
MyBatis-Plus详解(4)
48 0
|
XML Java 数据库连接
|
SQL Java 数据库连接
MyBatis(下)
MyBatis(下)
|
SQL XML 算法
MyBatis-Plus
简称MP,是在Mybatis的基础上进行增强,用户简化开发,提高效率。只做增强不做改变 支持主键自动生成、内置代码生成器、内置分页插件
125 0
|
SQL Java 关系型数据库
Mybatis详解(2)
你好看官,里面请!今天笔者讲的是 Mybatis详解(2)。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
214 1
|
SQL Oracle Java
|
SQL 存储 缓存
Mybatis总结
1、MyBatis简介 1.1 MyBatis历史 1.2 MyBatis特性 2、搭建MyBatis 2.1 MySQL不同版本的注意事项 2.2 创建MyBatis的映射文件 3、核心配置文件详解 4、MyBatis获取参数值的两种方式 4.1 单个字面量类型的参数 4.2 多个字面量类型的参数 4.3 map集合类型的参数 4.4 实体类类型的参数 4.5 使用@Param标识参数 5、MyBatis特殊的SQL执行
177 0
Mybatis总结
|
SQL XML 算法