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

Mybatis学习笔记

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

Mybatis学习笔记

环境:

  • JDK 1.8

  • Mysql 5.7

  • maven 3.6.1

  • IDEA

回顾:

  • JDBC
  • Mysql
  • Java基础
  • Maven
  • Junit

SSM框架:配置文件的。最好的方式:看官网文档


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 前言
  • 一、简介?
    • 1.1持久化
    • 1.2持久层
    • 1.3为什么需要Mybatis
  • 二、开始学习
    • 1.引入库
    • 2.创建一个模块
    • 2.3编写代码
    • 2.4测试
    • 2.4配置Mybatis中出现的错误 非常重要
    • 2.5可能会遇到的问题
  • 3.CRUD
    • 1.namespace
    • 2.select
    • 3.insert
    • 4.update
    • 5.Delete
    • 6.分析错误
    • 7.万能map
    • 8.思考题
  • 4.配置解析
    • 1.核心配置文件
    • 2.环境配置(environments)
    • 3.属性(properties)
    • 4.类型别名(typeAliases)
    • 5.设置(settings)
    • 6.其他配置
    • 7.映射器(mappers)
    • 8.生命周期和作用域
  • 5.解决属性名和字段名不一致的问题
    • 1.测试出现问题
    • 2.resultMap
  • 6.日志
    • 6.1日志工厂
    • 6.2 Log4j
  • 7.分页
    • **7.1使用Limit分页**
    • 7.2RowBounds分页
    • 7.3分页插件
  • 8.使用注解开发
    • 8.1面向接口编程
    • 8.2使用注解开发
    • 8.3注解实现CRUD
  • 9.Lombok
  • 10.多对一处理
    • 10.1测试环境搭建
    • 10.2按照查询嵌套处理
    • 10.3按照结果嵌套处理查询
    • 10.4复杂查询
  • 11.一对多处理
    • 1.环境搭建
      • 1.1实体类
    • 小结
      • 1.关联-association 【多对一】
      • 2.集合-collection 【一对多】
  • 12.动态SQL
    • 搭建环境
    • IF
    • choose (when, otherwise)
    • trim (where, set)
  • 13.缓存
    • 13.1简介
    • 13.2Mybatis缓存
    • 13.3一级缓存
    • 13.4二级缓存
    • 使用步骤
    • 13.5Mybaits缓存原理
    • 13.6第三方缓存实现--EhCache:
  • 总结


前言

这里根据狂神视频学习发出自己笔记 感谢狂神


提示:以下是本篇文章正文内容,下面案例可供参考

一、简介?

一款优秀的持久层框架

如何获得Mybatis?

  • maven仓库:
  • GitHub:https://github.com/mybatis/mybatis-3/releases
  • 中文文档:https://mybatis.org/mybatis-3/zh/index.html
1.1持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
  • 内存:断电及失
  • 数据库(JDBC) io文件持久化。
  • 生活:冷藏.罐头。

为什么需要持久化?

  • 有一些对象,不能让他丢掉
  • 内存太贵了
1.2持久层

Dao层,Service层,Controller层…

  • 完成持久化工作的代码块
  • 层界限十分明显。
1.3为什么需要Mybatis
  • 帮助程序猿将数据存入到数据库中

  • 方便

  • 传统的JDBC代码太复杂了。简化。框架。自动化

  • 不用Mybatis也可以。更容易上手。技术没有高低之分
    最重要的一点:使用的人多

二、开始学习

1.搭建数据库 sqlyog创建数据库

2.新建一个普通maven项目

3.删除src目录

4.导入maven依赖

1.引入库


  mysql 驱动
    
        mysql
        mysql-connector-java
        8.0.28
    
   mybatis-
    
        org.mybatis
        mybatis
        3.5.2
    
    junit

    
        junit
        junit
        4.12
        test
    


//在build中配置reoures,来防止我们资源到处失败的问题

    
        
            src/main/java
            
                ***.properties
            
        

        
            src/main/resources
            
                ***.properties
            
        
    

2.创建一个模块

核心配置文件


    
        
            
            
                
                
                
                
            
        
    

编写mybatis的工具类

//sqlSessionFactory -->sqlSession
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            //使用mybatis 第一步获取sqlSessionFactory对象
            String resource = "org/mybatis/example/mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
    // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
    public static SqlSession getSqlsession(){
        return sqlSessionFactory.openSession();
    }
}

2.3编写代码

实体类

//实体类
public class User {
    private int id;
    private String name;
    private String pwd;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", pwd='" + pwd + ''' +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }
    public User(){
    }
}

Dao接口public interface UserDao { List getUserList(); }
接口实现类由原来的DaoUserImpl转变为一个Mapper配置文件






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

3.测试

   @Test
    public void getUserById() {
        SqlSession sqlSession = MybatisUtils.getSqlsession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(1);
        System.out.println(user);
        sqlSession.close();
    }
3.insert 4.update 5.Delete
  • 在进行增删改时,操作一样,但如果要往数据库中增加或者减少数据,需要提交事物,sqlsession.commit()
6.分析错误
  • 读错从下往上读
  • 标签不要绑定错
  • resource绑定mapeer 需要使用路径
  • 程序配置文件必须符合规范
  • NullPoinerException,没有注册到资源!
  • 输出的xml文件中存在中文乱码问题!
  • maven资源没有导出
7.万能map

假设我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map

    //万能的Map
    User addUser2(Map map);
    
        insert into mybatis.user(id,pwd) values(#{userid},#{password})
    
    public void InsertMap() {
        SqlSession sqlSession = MybatisUtils.getSqlsession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map map = new HashMap();
        map.put("userid",5);
//        map.put("username","hello");
        map.put("password","451215");
        mapper.addUser2(map);
        sqlSession.close();
    }

Map传递参数,直接在sql中取出key就可以了!

对象传递参数,直接在sql中取对象的属性即可!

只有一个基本类型参数的情况下,可以直接在sql中取

多个参数用map 或者用注解

8.思考题

模糊查询怎么写?

1.java代码执行的时候,传递通配符% %

    
        select * from mybatis.user where id =#{id}
    
  • resultMap 元素是 MyBatis 中最重要最强大的元素

  • ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了

  • ResultMap 的优秀之处——你完全可以不用显式地配置它们

6.日志 6.1日志工厂

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

曾经:sout debug

现在:日志工厂

  • **SLF4J **
  • LOG4J 【掌握】
  • LOG4J2
  • JDK_LOGGING
  • COMMONS_LOGGING
  • STDOUT_LOGGING 【掌握】
  • NO_LOGGING

在mybaits中具体使用那一个日志实现,在设置中设定

STDOUT_LOGGING 标准日志输出

在mybatis核心配置文件中配置我们的日志

    
        
    

6.2 Log4j

什么是Log4j:

Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件

我们也可以控制每一条日志的输出格式

通过定义每一条日志信息的级别

这些可以通过一个配置文件来灵活地进行配置

1.先导入log4j的包


log4j
log4j
1.2.17

2.配置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/kuang.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

3.配置log4j为日志的实现:

    
        
    

4.Log4j的使用!直接测试运行刚才的查询

简单使用

1.在要使用Log4j的类中导入包 import org.apache.log4j.Logger;

2.日志对象,加载参数为当前类的class

    static Logger logger = Logger.getLogger(UserDaoText.class);

3.日志级别

        logger.info("info:进入了testLog4j");
        logger.debug("debug:进入了testLog4j");
        logger.error("error:进入了testLog4j");
7.分页

思考为什么要分页?

  • 减少数据的处理量
7.1使用Limit分页
语法: SELELCT * from user limit startIndex,pagesize
SELECt * from user limit 3; #[0,n]

使用Mybatis实现分页,核心SQL

1.接口

    //分页
    List getUserByLimit(Map map);

2.Mapper.xml

    
        select * from mybatis.user limit #{startIndex},#{pageSize}
    

3.测试

    @Test
    public  void  getUserByLimit(){
        SqlSession sqlSession=MybatisUtils.getSqlsession();
        UserMapper userMapper= sqlSession.getMapper(UserMapper.class);
        HashMap map= new HashMap();
        map.put("startIndex",0);
        map.put("pageSize",2);
        List userList=userMapper.getUserByLimit(map);
        for (User user : userList) {
            System.out.println(user);
        }
    }
7.2RowBounds分页

不再使用SQL实现分页

1.接口

//分页2
List getUserByRowBounds();

2.mapper.xml


    select * from student
   
   
       
       
   
   
   
    select * from student
   
   
       
       
   
   
   
        select s.id sid,s.name sname,t.name tname
        from student s,teacher t
        where s.tid=t.id
    
    
        
        
        
            
        

回顾Mysql多对一查询方式:

  • 子查询
  • 联表查询
10.4复杂查询
  • 复杂的属性,我们需要单独处理
  • 对象:associattion
  • 集合:collection
  • javaType:指定属性的类型!
  • 集合中的泛型信息,我们使用ofType
11.一对多处理

比如:一个老师拥有多个学生!

对于老师而言就是一对多的关系!·

1.环境搭建 1.1实体类
@Data
public class Student {
    private int id;
    private String name;
    private int tid;
}
@Data
public class Teacher {
    private int id;
    private String name;
    //一个老师拥有多个老师
    private List student;
}

  • 按结果嵌套查询
        
        select * from mybatis.teacher where id=#{tid}
    
    
        
    
    
        select *from mybatis.blog where 1=1
        
            and title = #{title}
        
        
            and  author = #{author}
        
    
choose (when, otherwise)

MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句

    
        select *from mybatis.blog
        
            
                title = #{title}
            
            
                and author = #{author}
            
        
    
        update mybatis.blog
        
            
                title=#{title},
            
            
                author=#{author}
            
        
        where id=#{id}
    

所谓的动态SQL ,本质还是SQL语句,只是我们可以在SQL层面执行一个逻辑代码

13.缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iELuGlph-1652434947053)(C:Users一字先生AppDataRoamingTyporatypora-user-imagesimage-20220323155708852.png)]

查询: 连接数据库,耗资源
一次查询的结果,给他暂存一个可以直接取到的地方==>内存:缓存
我们再次查询相同数据的时候,直接走缓存,就不用走数据库了
13.1简介

1、什么是缓存 [ Cache ]?

  • 存在内存中的临时数据。
  • 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。

2、为什么使用缓存?

  • 减少和数据库的交互次数,减少系统开销,提高系统效率。

3、什么样的数据能使用缓存?

  • 经常查询并且不经常改变的数据。
13.2Mybatis缓存
  • MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存

    • 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)
    • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
    • 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存
13.3一级缓存

一级缓存也叫本地缓存:

  • 与数据库同一次会话期间查询到的数据会放在本地缓存中。
  • 以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库;

缓存使用的情况

缓存失效的情况:

    1. 增删改操作,可能会改变原来的数据所以必定会消失
  1. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BY31V7BL-1652434947054)(C:Users一字先生AppDataRoamingTyporatypora-user-imagesimage-20220323162245262.png)]
  2. 查询不同的东西
  3. 查询不同的Mapper.xml
  4. 手动清理缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ab3NMPPd-1652434947054)(C:Users一字先生AppDataRoamingTyporatypora-user-imagesimage-20220323162505108.png)]

小结:一级缓存默认是开启的,只在一次Sqlsession中有效,也就是拿到连接到关闭连接这个区间

一级缓存失效情况:没有使用到当前的一级缓存,效果就是,还需要再向数据库中发起一次查询请求!

结论:每个sqlSession中的缓存相互独立

一级缓存就是一个map

13.4二级缓存
  • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存

  • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存;

  • 工作机制

    • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;
    • 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
    • 新的会话查询信息,就可以从二级缓存中获取内容;
    • 不同的mapper查出的数据会放在自己对应的缓存(map)中;
使用步骤

1、开启全局缓存 【mybatis-config.xml】


2、去每个mapper.xml中配置使用二级缓存,这个配置非常简单;【xxxMapper.xml】

也可以自定义参数


3.测试

  1. 问题:我们需要将实体类序列化!否则就会报错!
org.apache.ibatis.cache.CacheException: Error serializing object.  Cause: java.io.NotSerializableException: com.study.pojo.User
这就是没有实例化报错

小结:

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

官方示例=====>查看官方文档

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

Ehcache是一种广泛使用的java分布式缓存,用于通用缓存;

要在应用程序中使用Ehcache,需要引入依赖的jar包



   org.mybatis.caches
   mybatis-ehcache
   1.1.0

在Mapper中指定使用ehcahe

编写ehcache.xml文件,如果在加载时未找到/ehcache.xml资源或出现问题,则将使用默认配置。



    
    

    

    
    
    


Redis数据库来做缓存! k-vnf

总结

提示:这里对文章进行总结:

欢迎参考和交流!~

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

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

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