栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis笔记 狂神说

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybatis笔记 狂神说

文章目录
    • 1 什么是Mybatis
    • 2 第一个Mybatis 程序
      • 2.1、搭建数据库
      • 2.2创建一个模块
    • 测试
    • 3、CRUD
    • 4、Map和模糊查询
      • 模糊查询
    • 5、配置解析
      • 1、核心配置文件
      • 2、环境配置(environments)
      • 3、属性(properties)
      • 4、类型别名(typeAliases)
      • 5、其他配置
      • 6、映射器(mappers)
      • 8.生命周期(Scope)和作用域
    • 6、解决属性名和字段名不一致的问题
    • 7、日志
      • 7.2、 Log4j
      • 简单使用
    • 8、分页
      • 8.1 使用Mybatis实现分页,核心SQL
      • 8.2 RowBounds分页
      • 8.3 分页插件
    • 9、使用注解开发
      • 9.1、 CURD
      • 9.2、@Param()注解
    • 10、Lombok
    • 11、多对一处理
    • 12、一对多处理
    • 13、动态SQL
      • 搭建环境
      • JSTL参考链接
        • IF
        • choose (when, otherwise)
        • trim(where,set)
        • foreach
        • script
        • bind
        • 多数据库支持
        • 动态 SQL 中的插入脚本语言
    • 14、缓存
      • Mybatis缓存
      • 一级缓存
      • 二级缓存
      • 缓存原理
      • 自定义缓存-ehcache
  • 我遇到的错误

1 什么是Mybatis
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。

如何获得Mybatis?

  • maven仓库:

    org.mybatis
    mybatis
    3.5.2

  • Github:https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.2
  • 中文文档:https://mybatis.org/mybatis-3/zh/getting-started.html
  • 参考笔记:https://blog.csdn.net/li643937579/article/details/109194467
2 第一个Mybatis 程序

搭建环境→导入Mybatis→编写代码→测试!

2.1、搭建数据库

创建数据库和表

CREATE DATAbase `mybatis`;

USE `mybatis`;

CREATE TABLE `user`(
	`id` INT(20) NOT NULL PRIMARY KEY,
	`name` VARCHAR(30) DEFAULT NULL,
	`pwd` VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `user`(`id`,`name`,`pwd`)VALUES
(1,'孟祥辰','123456'),
(2,'康耀元','123456'),
(3,'张健力','123456')
  1. 创建一个普通的Maven项目
  2. 删除src目录
  3. 导入依赖
    
     
         
             mysql
             mysql-connector-java
             5.1.49
         
         
         
             org.mybatis
             mybatis
             3.5.2
         
         
             junit
             junit
             4.13
         
     
2.2创建一个模块
  • 新建一个Module,普通的maven项目
  • 编写mybatis的核心配置文件

resources中创建mybatis-config.xml





    
        
            
            
                
                
                
                
            
        
    

  • 编写mybatis工具类
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; // 提升作用域
    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream resourceAsStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 有了SqlSessionFactory,就可以从中获得SqlSession的实例了。
    // SqlSession 完全包含了面向数据库执行SQL命令所需的全部方法
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
}
  • Dao接口
public interface UserDao {
    List getUserList();
}
  • 接口实现类的UserDaoImpl转变为一个Mapper配置文件




    
    
        select * from mybatis.user where id = #{id}
    

resultMap 元素是 MyBatis 中最重要最强大的元素。
ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。




7、日志

如果一个数据库操作,出现了异常,我们就需要排错。日志就是最好的助手。

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j
  • JDK logging

mybatis-config.xml

    
        
    

7.2、 Log4j
  1. 导包

    log4j
    log4j
    1.2.17

  1. log4j.properties
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger = DEBUG,console ,file

#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern =  [%c]-%m%n

#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = ./log/meng.log
log4j.appender.file.MaxFileSize = 10mb
log4j.appender.file.Threshold = DEBUG
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = [%p][%d{yy-MM-dd}][%c]%m%n

#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
  1. 设置LOG4J为日志实现
    
        
    
简单使用
  1. 在要使用Log4j的类中导入包import org.apache.log4j.Logger;
  2. 日志对象,



8、分页

分页可以减少数据的处理量

8.1 使用Mybatis实现分页,核心SQL
  1. 接口
// 分页
    List getUserByLimit(Map map);
  1. Mapper.xml
    
        select * from mybatis.user
    
  1. 测试
    @Test
    public void getUserByRowBounds(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        //RowBounds实现
        RowBounds rowBounds = new RowBounds(0, 2);

        //通过java代码层面实现分页
        List userList = sqlSession.selectList("com.meng.dao.UserMapper.getUserByRowBounds",null,rowBounds);

        for (User user : userList) {
            System.out.println(user);
        }

        sqlSession.close();
    }
8.3 分页插件

有这个东西奥,真的。




9、使用注解开发
  1. 接口
    @Select("select * from user")
    List getUsers();
  1. 需要在核心配置文件中绑定接口!
     
         
     
  1. 测试
    本质:反射机制
    底层:动态代理

Mybatis详细的执行流程!

9.1、 CURD
  1. 在MybatisUtils工具类创建的时候实现自动提交事务
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession(true);
    }
  1. 编写接口,增加注释
public interface UserMapper {
    @Select("select * from user")
    List getUsers();

    // 方法存在多个参数,所有参数前面必须加上@param("id")注解
    @Select("select * from user where id=#{id}")
    User getUserById(@Param("id") int id); // 类似于起别名的感觉
    @Insert("insert into user (id,name,pwd) values(#{id},#{name},#{password})")
    int addUser(User user);
    @Update("update user set name=#{name},pwd=#{password} where id=#{id}")
    int updateUser(User user);
    @Delete("delete from user where id = #{uid}")
    int deleteUser(@Param("uid") int id);
}
  1. 测试类
    【注意:必须要将接口注册绑定到核心配置文件中!】
 User user = mapper.getUserById(1);
 System.out.println(user);

 User user = new User(6, "mxc", "12345");
 mapper.addUser(user);

 User user = new User(6, "牛逼", "123432");
 mapper.updateUser(user);

 mapper.deleteUser(6);
9.2、@Param()注解
  • 基本类型的参数或者String类型需要加上
  • 引用类型不需要加
  • 如果只有一个基本类型,可以不加,但建议加上
  • 在SQL中引用的是@Param("")中设定的属性名!
  • #{}和${}相比,#{}有更高的安全性(防止SQL注入)



10、Lombok

使用步骤:

  1. 在IDEA中安装Lombok插件
  2. 在项目pom.xml文件中导入Lombok的jar包

    org.projectlombok
    lombok
    1.18.22
    provided

  1. 在实体类上加注解即可
@Getter and @Setter
@FieldNameConstants
@ToString
@EqualsAndHashCode
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
@Data
@Builder
@SuperBuilder
@Singular
@Delegate
@Value
@Accessors
@Wither
@With
@SneakyThrows




11、多对一处理

多个学生对应一个老师

按查询嵌套处理

    
    
        select * from mybatis.teacher where id = #{id}
    

按查询结果嵌套

    
    
        select s.id sid, s.name sname,t.name tname,t.id tid
        from student s,teacher t
        where s.tid = t.id and t.id=#{tid}
    
    
        
        
        
        
            
            
            
        
    

按查询结果嵌套

    
        select * from student where tid = #{id}
    

小结

  1. 关联-association【多对一】
  2. 集合-collection【一对多】
  3. javaType 用来指定实体类中属性的类型
  4. ofType 用来指定映射到List或者集合中pojo类型,泛型中的约束类型!

面试高频

  1. Mysql引擎
  2. InnoDB底层原理
  3. 索引
  4. 索引优化



13、动态SQL

动态SQL是根据不同的条件生成不同的SQL语句
在SQL层面,去执行一个逻辑代码

搭建环境
CREATE TABLE `mybatis`.`blog`  (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '博客id',
  `title` varchar(30) NOT NULL COMMENT '博客标题',
  `author` varchar(30) NOT NULL COMMENT '博客作者',
  `create_time` datetime(0) NOT NULL COMMENT '创建时间',
  `views` int(30) NOT NULL COMMENT '浏览量',
  PRIMARY KEY (`id`)
)

创建一个工程

  1. 导包
  2. 编写配置文件
  3. 编写实体类
@Data
public class Blog {
    private int id;
    private String title;
    private String author;
    private Date createTime;
    private int views;
}
  1. 编写实体类对应Mapper接口和Mapper.xml文件
JSTL参考链接 IF
    
  SELECT * FROM BLOG WHERe state = ‘ACTIVE’
  
    
      AND title like #{title}
    
    
      AND author_name like #{author.name}
    
    
      AND featured = 1
    
  

trim(where,set) foreach script bind 多数据库支持 动态 SQL 中的插入脚本语言


14、缓存 Mybatis缓存
  • MyBatis包含一个非常强大的查询缓存特性,它可以非常方便的定制和配置缓存,缓存可以极大的提高查询效率。
  • MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存
    • 默认情况下,只有一级缓存开启(SqlSession级别的缓存,也称为本地缓存)
    • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
    • 为了提高可扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来定义二级缓存。
一级缓存
  • 一级缓存也叫本地缓存:SqlSession
    • 与数据库同一次会话期间查询到的数据会放在本地缓存中
    • 以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库

测试步骤:

  1. 开启日志
  2. 测试在一个Session中查询两次记录
    @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user1 = mapper.getUserById(1);
        System.out.println(user1.toString());

        System.out.println("====================");
        User user2 = mapper.getUserById(1);
        System.out.println(user1.toString());
        System.out.println(user1==user2);

        sqlSession.close();
    }
  1. 查看日志输出

缓存失效的情况

  1. 查询不同的东西
  2. 增删改操作,可能会改变原来的数据,所以必定会刷新缓存
  3. 查询不同的Mapper.xml
  4. 手动清理缓存sqlSession.clearCache();

一级缓存默认开启,只在一次sqlSession中有效,也就是拿到链接关闭连接这个区间段!


二级缓存
  • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
  • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存
  • 工作机制
    • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
    • 如果会话关闭了,这个会员对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中
    • 新的会话查询信息,就可以从二级缓存中获取内容
    • 不同的mapper查询出的数据会放在自己对应的缓存(map)中

一级缓存开启(SqlSession级别的缓存,也称为本地缓存)

  • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
  • 为了提高可扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来定义二级缓存。

步骤:

  1. 开启全局缓存
在UserMapper.xml中添加



  1. 这些属性可以通过 cache 元素的属性来修改。

这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。

可用的清除策略有:

LRU – 最近最少使用:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。

  1. 测试:需要将实体类序列化,否则就会报错 implements Serializable

只要开启了二级缓存,在同一个Mapper下就有效
所有的数据都会放在一级缓存中
只有当前会话提交,或者关闭的时候,才会提交到二级缓存中

缓存原理

注意:

  • 只有查询才有缓存,根据数据是否需要缓存(修改是否频繁选择是否开启)useCache=“true”
    
自定义缓存-ehcache

Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存


    org.mybatis.caches
    mybatis-ehcache
    1.2.1

在Mapper中指定使用ehcache缓存实现


=============================end







我遇到的错误

SqlSession空指针异常,是xml与接口映射有问题

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/630946.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号