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

MyBatis学习笔记

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

MyBatis学习笔记

MyBatis

Mybatis官方文档:

https://mybatis.org/mybatis-3/zh/index.html

MyBatis

文章目录
  • MyBatis
  • MyBatis
    • 1、简介
      • 1.1 什么是Mybatis
      • 1.2 持久化
      • 1.3 持久层
      • 1.4 为什么需要MyBatis
    • 2、第一个Mybatis程序
      • 2.1 搭建环境
      • 2.2 创建一个模块
      • 2.3 编写代码
    • 3、CURD
      • 3.1. namespace
      • 3.2. select
      • 3.3. Insert
      • 3.4. update
      • 3.5. Delete
      • 3.6. 万能Map
      • 3.7. 模糊查询
    • 4、配置解析
      • 4.1. 核心配置文件
      • 4.2. 环境配置 environments
      • 4.3. 属性 properties
      • 4.4. 类型别名 typeAliases
      • 4.5. 设置 Settings
      • 4.6. 其他配置(了解)
      • 4.7. 映射器 mappers
      • 4.8. 作用域和生命周期
    • 5、解决属性名和字段名不一致的问题
      • 5.1. 问题
      • 5.2. resultMap
    • 6、日志
      • 6.1 日志工厂
      • 6.2 Log4j
    • 7、分页
      • 7.1 使用Limit分页(通过sql层面实现)
      • 7.2 RowBounds分页(通过Java代码层面实现)
      • 7.3 分页插件(通过第三方插件实现)
    • 8、使用注解开发
      • 8.1 面向接口开发
      • 8.2 使用注解开发
      • 8.3 注解CURD
    • 9、Lombok
    • 10、多对一处理
      • 10.1、环境搭建
      • 10.2. 按照查询嵌套处理
      • 10.3.按照结果嵌套处理
    • 11、一对多处理
      • 10.1. 环境搭建
      • 10.2. 按照结果嵌套处理
      • 10.3、按照查询嵌套处理
      • 小结
    • 12、动态SQL
      • 12.1、SQL片段
      • 12.2、Foreach(有点问题)
    • 13、缓存
      • 13.1 简介
      • 13.2 MyBatis缓存
      • 13.3 一级缓存
      • 13.4 二级缓存
      • 13.5 缓存原理
      • 13.6 自定义缓存-ehcache

1、简介 1.1 什么是Mybatis
  • MyBatis 是一款优秀的持久层框架;
  • 它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1.2 持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
  • 内存:断电即失
  • 数据库(Jdbc),io文件持久化。

为什么要持久化?

有一些对象,不能让他丢掉
内存太贵

1.3 持久层

Dao层、Service层(业务层)、Controller层

  • 完成持久化工作的代码块
  • 层界限十分明显
1.4 为什么需要MyBatis
  • 帮助程序员将数据存入到数据库中
  • 方便
  • 传统的JDBC代码太复杂了,简化,框架,自动化
  • 不用MyBatis也可以,技术没有高低之分
  • 优点:
    • 简单易学
    • 灵活
    • sql和代码的分离,提高了可维护性。
    • 提供映射标签,支持对象与数据库的orm字段关系映射
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供xml标签,支持编写动态sql
2、第一个Mybatis程序

思路:搭建环境 --> 导入MyBatis --> 编写代码 --> 测试

2.1 搭建环境

编写数据库

CREATE DATABASE `mybatis`

USE `mybatis`

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

INSERT INTO `user`(`id`,`name`,`password`) VALUES
('1','好好','123456'),
('2','吉吉','111111'),
('3','国王','222222')

新建项目

1.创建一个普通的maven项目

2.删除src目录 (就可以把此工程当做父工程了,然后创建子工程)

3.导入maven依赖



    
    
        mysql
        mysql-connector-java
        8.0.12
    
    
    
        org.mybatis
        mybatis
        3.5.4
    
    
    
        junit
        junit
        4.12
        test
    

4.创建一个Module

2.2 创建一个模块
  • 编写mybatis的核心配置文件 mybatis-config.xml



    
        
            
            
                
                
                
                
            
        
    
    
    
        
    

  • 编写mybatis工具类
//sqlSessionFactory --> sqlSession
public class MybatisUtils {

    static SqlSessionFactory sqlSessionFactory = null;

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

    //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例.
    // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}
2.3 编写代码
  • 实体类

    public class User {
        private int id;
        private String name;
        private String password;
    
        public user() {
        }
    
        public user(int id, String name, String password) {
            this.id = id;
            this.name = name;
            this.password = password;
        }
    
        public int getId() {
            return id;
        }
    
        public String getName() {
            return name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "user{" +
                    "id=" + id +
                    ", name='" + name + ''' +
                    ", password='" + password + ''' +
                    '}';
        }
    }
    
  • Dao接口

import com.hh.pojo.User;

import java.util.List;

public interface UserDao {
    public List getUserList();
}

接口实现类 (由原来的UserDaoImpl转变为一个Mapper配置文件)






    
    select * from mybatis.user
    
    
    select * from USER

  • resultMap 元素是 MyBatis 中最重要最强大的元素。
  • ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
  • ResultMap 的优秀之处——你完全可以不用显式地配置它们。
6、日志 6.1 日志工厂

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

曾经:sout、debug

现在:日志工厂

  • SLF4J
  • LOG4J 【掌握】
  • LOG4J2
  • JDK_LOGGING
  • COMMONS_LOGGING
  • STDOUT_LOGGING 【掌握】
  • NO_LOGGING
    在MyBatis中具体使用哪一个日志实现,在设置中设定

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/hh.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.sq1.PreparedStatement=DEBUG

3.配置settings为log4j实现


    
        
    

4.测试运行

Log4j简单使用

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

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

Logger logger = Logger.getLogger(UserDaoTest.class);

3.日志级别

logger.info("info: 测试log4j");
logger.debug("debug: 测试log4j");
logger.error("error:测试log4j");

测试

7、分页

思考:为什么分页?

  • 减少数据的处理量
7.1 使用Limit分页(通过sql层面实现)
SELECT * from user limit startIndex,pageSize 

使用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();
    HashMap map = new HashMap();
    map.put("startIndex", 0);
    map.put("pageSize", 3);
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List list = mapper.getUserByLimit(map);
    for(User user : list) {
        System.out.println(user);
    }
    sqlSession.close();
}
7.2 RowBounds分页(通过Java代码层面实现)

不再使用SQL实现分页
1.接口

    //分页2
    List getUserByRowBounds();

2.mapper.xml

    
    
    select * from teacher where id = #{id}

10.3.按照结果嵌套处理



    SELECT s.id sid, s.name sname,t.name tname,t.id tid 
    FROM student s, teacher t
    WHERe s.tid = t.id AND tid = #{tid}


    
    
    
    
        
        
        
    

10.3、按照查询嵌套处理

   
        select * from mybatis.blog tid=#{tid}
    
小结

1.关联 - association 【多对一】
2.集合 - collection 【一对多】
3.javaType & ofType

  1. JavaType用来指定实体类中的类型
  2. ofType用来指定映射到List或者集合中的pojo类型,泛型中的约束类型

注意点:

  • 保证SQL的可读性,尽量保证通俗易懂
  • 注意一对多和多对一,属性名和字段的问题
  • 如果问题不好排查错误,可以使用日志,建议使用Log4j

面试高频

  • Mysql引擎
  • InnoDB底层原理
  • 索引
  • 索引优化
12、动态SQL

什么是动态SQL:动态SQL就是根据不同的条件生成不同的SQL语句

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

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解 根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去 掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

搭建环境

CREATE TABLE `mybatis`.`blog`  (
  `id` VARCHAr(50) NOT NULL COMMENT '博客id',
  `title` VARCHAr(110) NOT NULL COMMENT '博客标题',
  `author` VARCHAr(100) 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;
}

4.编写实体类对应Mapper接口和Mapper.xml文件





    insert into blog (id, title,auther,create_time,views)
    values (#{id}, #{title}, #{auther}, #{createTime}, #{views})


IF 提供了可选的查找文本功能

    
    select * from blog
    
        
            
                title=#{title}
            
            
                and author=#{author}
            
            
                and view=#{view}
            
        
    

trim (where, set)(where标签会自动去掉and和or,保证代码正常执行)


    select * from blog
    
        
    

注意事项:

  • 最好基于单标来定义SQL片段
  • SQL片段不要存在where标签
12.2、Foreach(有点问题)

动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。比如:


        select * from user where id = #{id}
    
13.6 自定义缓存-ehcache

1.导包


    org.mybatis.caches
    mybatis-ehcache
    1.2.1

2.在mapper中指定使用我们的ehcache缓存实现


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



   
   
   
   

   
   
   


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

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

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