欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

MyBatis【钢镚核恒】

发布时间:2023/12/20 30 豆豆
生活随笔 收集整理的这篇文章主要介绍了 MyBatis【钢镚核恒】 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

MyBatis

简介

  • MyBatis是优秀的持久层框架, 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis使用XML将SQL与程序解耦,便于维护
  • MyBatis学习简单,执行高效,是JDBC的延伸

拓展:

持久化:即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。

持久层:完成持久化工作的代码块 . ----> dao层 【DAO (Data Access Object) 数据访问对象】

官方文档:https://mybatis.org/mybatis-3/zh/index.html

入门

  • 依赖
  • <!-- mybatis --> <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version> </dependency>
  • mybatis-config.xml
  • <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><environments default="development"><!--设置id配置不同的环境--><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/learn?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment><environment id="product"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/learn?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--配置Mapper映射文件位置--><mappers><mapper resource="mapper/UserMapper.xml"/></mappers> </configuration>
  • MybatisUtils.class
  • package com.gan;import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException; import java.io.InputStream;public class MybatisUtils {private static SqlSessionFactory sqlSessionFactory = null;static {try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}public static SqlSession getSqlSession() {return sqlSessionFactory.openSession();} }
  • 创建实体(Entity)类,Mapper映射文件
  • <?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>
  • 进行测试
  • SqlSessionFactory

    • SqlSessionFactory是MyBatis的核心对象
    • 用于初始化MyBatis,创建SqlSession对象
    • 保证SqlSessionFactory在应用中全局唯一

    SqlSession

    • SqlSession是MyBatis操作数据库的核心对象
    • SqlSession使用JDBC方式与数据库交互
    • SqlSession对象提供了数据表CRUD对应方法

    配置

    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)
        • transactionManager(事务管理器)
        • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)

    映射文件

    顶级元素

    • cache – 该命名空间的缓存配置。
    • cache-ref – 引用其它命名空间的缓存配置。
    • resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
    • parameterMap – 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。
    • sql – 可被其它语句引用的可重用语句块。
    • insert – 映射插入语句。
    • update – 映射更新语句。
    • delete – 映射删除语句。
    • select – 映射查询语句。

    Select 元素的属性

    <selectid="selectPerson"parameterType="int"parameterMap="deprecated"resultType="hashmap"resultMap="personResultMap"flushCache="false"useCache="true"timeout="10"fetchSize="256"statementType="PREPARED"resultSetType="FORWARD_ONLY">

    Insert, Update, Delete 元素的属性

    <insertid="insertAuthor"parameterType="domain.blog.Author"flushCache="true"statementType="PREPARED"keyProperty=""keyColumn=""useGeneratedKeys=""timeout="20"><updateid="updateAuthor"parameterType="domain.blog.Author"flushCache="true"statementType="PREPARED"timeout="20"><deleteid="deleteAuthor"parameterType="domain.blog.Author"flushCache="true"statementType="PREPARED"timeout="20">

    sql片段:这个元素可以用来定义可重用的 SQL 代码片段

    <sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>

    结果映射:给数据库属性取别名

    <resultMap id="userResultMap" type="User"><id property="id" column="user_id" /><result property="username" column="user_name"/><result property="password" column="hashed_password"/> </resultMap> <select id="selectUsers" resultMap="userResultMap">select user_id, user_name, hashed_passwordfrom some_tablewhere id = #{id} </select>

    两种传值方式

    • ${} 文本替换,未经任何处理对SQL文本替换
    • #{} 预编译传值,使用预编译传值可以预防SQL注入

    工作流程图

    日志

    • 日志文件是用于记录系统操作事件的记录文件或文件集合
    • 日志保存历史数据,是诊断问题以及理解系统活动的重要依据

  • 依赖
  • <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>
  • logback.xml
  • <?xml version="1.0" encoding="utf-8" ?><configuration> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="console" /> </root> <!-- 日志输出级别(优先级高到低): error:错误-系统的故障日志 warn:警告-存在风险或使用不当的日志 info:一般性消息 debug:程序内部用于调试信息 trace:程序运行的跟踪信息 --></configuration>

    动态 SQL

    动态 SQL 是 MyBatis 的强大特性之一。

    • if
    • choose (when, otherwise)
    • trim (where, set)
    • foreach
    <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG <where> <if test="state != null">state = #{state}</if> </where></select><trim prefix="SET" suffixOverrides=","> ...</trim><update id="updateAuthorIfNecessary"> update Author <set> <if test="username != null">username=#{username},</if> <if test="password != null">password=#{password},</if> <if test="email != null">email=#{email},</if> <if test="bio != null">bio=#{bio}</if> </set> where id=#{id}</update>

    缓存

    • —级缓存默认开启,缓存范围SqISession会话
    • 二级缓存手动开启,属于范围Mapper Namespace

    二级缓存运行规则:

    • 二级开启后默认所有查询操作均使用缓存
    • 写操作commit提交时对该namespace缓存强制清空
    • 配置useCache=false可以不用缓存
    • 配置flushCache=true代表强制清空缓存

    开启二级缓存:

    <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

    ResultMap

    一对多对象关联查询

    <resultMap id="rm" type="User"><id column="id" property="id"></id><!-- collection说明 :property 为User下的一对多对象, select 调用接口的方法进行查询,column="id" 是传入查询的参数--><collection property="dogs" select="dogDao.getDog" column="id"></collection> </resultMap> <select id="oneToMany" resultMap="rm">select * from user </select>

    多对一对象关联查询

    <resultMap id="rm" type="Dog"><id column="uid" property="uid"></id><!-- association :property 为Dog下的多对一对象 --><association property="user" select="userDao.queryUser" column="uid"></association> </resultMap> <select id="manyToOne" resultMap="rm">select * from dog </select>

    PageHelper

    • maven引入PageHelper与jsqlparser
    • mybatis-config.xml增加Plugin配置
    • 代码中使用PageHelper.startPage() 自动分页
  • 依赖
  • <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version> </dependency>
  • 使用
  • public void test() {SqlSession sqlSession = MybatisUtils.getSqlSession();PageHelper.startPage(0, 3);List<User> users = sqlSession.selectList("userDao.oneToMany");PageInfo pageInfo = new PageInfo(users);List<User> list = pageInfo.getList();for (User u:list) {System.out.println(u.toString());} }

    常用注解

    • @lnsert
    • @Update
    • @Delete
    • @Select
    • @Result,对应<id> <result>,字段映射
    • @Results, 对应<resultMap>,结果映射
    • @Param,参数映射

    Mybatis-plus

    • MyBatis-Plus(简称MP)是一个MyBatis的增强工具
    • 自动实现Mapper CRUD操作,极致提高数据库开发效率
    • MP在MyBatis的基础上只做增强不做改变

    整合三部曲:

  • pom引入mybatis-plus依赖
  • <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.4.3</version> </dependency>
  • Spring XML更改配置SqlSessionFactory实现类
  • <!-- SqlSessionFactory Config --> <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:mapper/*.xml"/><property name="configLocation" value="classpath:mybatis-config.xml"/> </bean>
  • mybatis-config.xml增加MP分页插件
  • <plugins><plugin interceptor="com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor"></plugin> </plugins>

    核心注解

    • @TableName -将实体类与表名映射
    • @Tableld -说明对应属性是表的主键
    • @TableField -设置属性与列名的对应关系

    总结

    以上是生活随笔为你收集整理的MyBatis【钢镚核恒】的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。