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

狂神说mybatis笔记

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

狂神说mybatis笔记

1、简介 1.1 、什么是Mybatis

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

如何获得Mybatis?

maven仓库Github(码云)中文文档 1.2、持久化

数据持久化

持久化就是将程序的数据在持久状态和瞬时状态转化的过程

内存:断电即失

数据库(jdbc),io文件持久化

生活:冷藏

为什么需要持久化?

有一些对象,不能让他丢掉

内存太贵

1.3、持久层

完成持久化工作的代码块层界限十分明显 1.4、为什么需要Mybatis?

帮助程序员将数据存入到数据库中

fb

传统的JDBC代码太复杂了。简化

技术没有高低之分,只有使用这技术的人才分高低

2、第一个Mybatis程序

思路: 搭建环境–》导入Mybatis–>编写代码–》测试

2.1、搭建环境

搭建数据库

CREATE DATAbase `mybatis`;

USE `mybatis`;


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

INSERT INTO `user`(`id`,`name`,`pwd`) VALUES
(1,'青藤1','111111'),
(2,'青藤2','222222'),
(3,'青藤3','333333');

新建项目

    新建一个普通的maven项目

    删除src目录

    导入依赖

        
            
            
                mysql
                mysql-connector-java
                5.1.47
            
             
            
                org.mybatis
                mybatis
                3.5.6
            
            
            
                junit
                junit
                4.13.2
            
    
        
    
2.2、创建一个Module

编写mybatis的核心配置文件





















编写mybatis工具类

package com.kuang.utils;

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 MybaisUtils {

private static SqlSessionFactory sqlSessionFactory;  //提升作用域

static{    //静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次;
//非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次
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 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
public static SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}

}
2.3、编写代码

实体类

package com.kuang.pojo;


public class User {

    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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;
    }

}

Dao接口

public interface UserDao {

    List getUserList();

}

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






   
   
       select * from mybatis.user
   


2.4、测试

注意点:

org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserMapper is not known to the MapperRegistry.

每一个Mapper.xml都需要在Mybatis核心配置文件中注册!

数据库连接超时 url写错了

资源过滤


        
            
                src/main/resources
                
                    ***.xml
                
                true
            
            
                src/main/java
                
                    ***.xml
                
                true
            
        
    

junit

package com.kuang.dao;

import com.kuang.pojo.User;
import com.kuang.utils.MybaisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;


public class UserTest {

    @Test
    public void test(){

        //第一步: 获得sqlSession对象
        SqlSession sqlSession = MybaisUtils.getSqlSession();

        //执行sql  方式一
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List userList = userMapper.getUserList();

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

        //关闭sqlSession
        sqlSession.close();
    }
}

3、CRUD 1、namespace

namespace中的包名要和mapper接口的包名一致

2、select

选择 查询语句

id 对应 的namespace中的方法名resultType: sql语句执行的返回值 class,基本类型parameterType: 参数类型

    编写接口

    //根据用户id查询用户
        User getUserById(int id);
    

    编写对应mapper中的sql语句

    
        select * from mybatis.user where name like "%"#{value}"%"
    
    
    4、配置解析 1、核心配置文件

    mybatis-config.xml

    MyBatis的配置文件包含了会深深影响Mybatis行为的设置和属性信息

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

    Mybatis可以配置成适应多种环境

    不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境

    学会使用配置多套运行环境

    Mybatis默认的事务管理器就是JDBC 连接池: POOLED

    3、属性(properties)

    我们可以通过properties属性来实现引用配置文件

    这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置【db.properties】

    在核心配置文件中引入

    
    

    可以直接引入外部文件可以在其中增加一些属性配置如果2个文件有同一个字段,优先使用外部配置文件 ​ 4、类型别名(typeAliases)

    类型别名是为java类型设置一个短的名字

    存在的意义仅在于用来减少全限定类名书写的冗余

        
        
            
        
    

    也可以指定一个包名,Mybatis会在包名下面搜索需要的java Bean,for example:

        
            
        
    

    每一个在包 com.kuang.pojo 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 com.kuang.pojo 的别名为 user;若有注解,则别名为其注解值

    在实体类较少的时候,使用第一种方式

    如果实体类较多,建议使用第二种

    第一种可以定义别名 第二种则不行,如果非要该,需要在实体上增加注解

    5、设置(setting)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iLOxyliA-1647270150495)(C:UsersacerDesktop微信截图_20220312235559.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yZYcwRXS-1647270150496)(C:UsersacerDesktop微信截图_20220312235717.png)]

    6、映射器(mappers)

    MapperRegistry : 注册绑定我们的Mappers文件、

    方式一:[推荐使用]

        
        
            
        
    

    方式二:使用class文件绑定注册

        
            
        
    

    注意点:

    接口和他的Mapper配置文件必须同名接口和他的Mapper配置文件必须在同一个包下!

    方式三: 使用扫描包进行绑定

        
            
        
    

    注意点:

    接口和他的Mapper配置文件必须同名接口和他的Mapper配置文件必须在同一个包下! 8、生命周期和作用域

    作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8gNXh2Ol-1647270150497)(C:UsersacerAppDataRoamingTyporatypora-user-imagesimage-20220313094108085.png)]

    SqlSessionFactoryBuilder

    一旦创建了 SqlSessionFactory,就不再需要它了

    局部变量

    SqlSessionFactory:

    可以理解为数据库连接池

    一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例

    因此 SqlSessionFactory 的最佳作用域是应用作用域

    最简单的就是使用单例模式或者静态单例模式

    SqlSession:

    连接到连接池的一个请求SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域用完之后需要赶紧关闭,否则资源被占用

    这里面的mapper 都代表一个具体的业务

    5、解决属性名和字段名不一致的问题 1、问题

    数据库字段

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ujg741NZ-1647270150498)(C:UsersacerDesktop微信截图_20220313100410.png)]

    新建一个项目,拷贝之前的,测试实体类字段不一致的情况

    public class User {
    
        private int id;
        private String name;
        private String password;   //列名和属性名不一致
    

    测试出问题

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y6sOMnzz-1647270150499)(C:UsersacerDesktop微信截图_20220313101716.png)]

    // select * from mybatis.user where id=#{id}
    // 类型处理器
    // select id,name,pwd from mybatis.user where id=#{id}
    

    解决方法:

    取别名

    
            select id,name,pwd as password from mybatis.user where id=#{id}
        
    
    2、ResultMap(结果集映射)
    id    name   pwd
    id    name   password
    
        
            
            
            
            
        
    
        
            select *
            from student;
        
    
        
            
            
            
            
        
    
        
            select s.id sid,s.name sname,t.name tname from student s,teacher t where s.tid = t.id
        
    
        
            
            
            
                
            
        
    
    10、一对多处理

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FnjKE6J2-1647270150505)()]

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

    实体类

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Teacher {
        private int id;
        private String name;
        List studentList;
    }
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Student {
    
        private int id;
        private String name;
        private int tid;
    
        //学生需要关联一个老师
        //private Teacher teacher;
    
    }
    

    按照结果嵌套处理

        
            select * from blog where 1=1
            
                and title = #{title}
            
            
                and author = #{author}
            
        
    
    choose(when,otherwise)
    
            select * from blog
            
               
            
        
    
    Foreach
    select * from blog where 1=1 and (id=1 or id=2 or id=3)
    
        
              #{id}
        
        
        
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hESrbe31-1647270150506)(C:UsersacerDesktop微信截图_20220314111606.png)]

        
            select * from blog
            
                
                    #{id}
                
            
        
    
    12、缓存

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1xqYckEb-1647270150507)(C:UsersacerDesktop微信截图_20220314141051.png)]

    12.1 简介 1. 什么是缓存[Cache]?

    存在内存中的临时数据。

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

    2. 为什么使用缓存?

    减少和数据库的交互次数,减少系统开销,提高系统效率。 3. 什么样的数据能使用缓存?

    经常查询并且不经常改变的数据。【可以使用缓存】 12.2、Mybatis缓存

    Mybatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。Mybatis系统中默认定义了两级缓存:一级缓存和二级缓存默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)二级缓存需要手动开启和配置,它是基于namespace级别的缓存。
    为了提高扩展性,Mybatis定义了缓存接口Cache,我们可以通过实现Cache接口来自定义二级缓存。 12.3 一级缓存

    一级缓存也叫本地缓存:

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

    测试步骤

      开启日志测试在一个sqlSession中查询2次相同记录查看日志输出[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0SrJPpvG-1647270150507)(C:UsersacerDesktop微信截图_20220314143149.png)]

    缓存失效的情况:

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

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

    12.4 二级缓存

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

    步骤:

      开启全局缓存

       
              
      

    2.在要使用二级缓存的Mapper.xml中开启

        
        
    
    
      测试

      问题:我们需要将实体类序列化,否则就会报错

    小结:

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

    Mybatis缓存原理

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g6ARPvC0-1647270150509)(C:UsersacerDesktop微信截图_20220314151438.png)]

    13.6、自定义缓存-ehcache
    Ehcache是一种广泛使用的开源Java分布式缓存
    

    要在程序中使用ehcache,导入依赖

    
        org.mybatis.caches
        mybatis-ehcache
        1.1.0
    
    

    目前主要是redis缓存


    2. 测试在一个sqlSession中查询2次相同记录
    3. 查看日志输出[外链图片转存中…(img-0SrJPpvG-1647270150507)]

    缓存失效的情况:

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

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

    12.4 二级缓存

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

    步骤:

      开启全局缓存

       
              
      

    2.在要使用二级缓存的Mapper.xml中开启

        
        
    
    
      测试

      问题:我们需要将实体类序列化,否则就会报错

    小结:

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

    Mybatis缓存原理

    [外链图片转存中…(img-g6ARPvC0-1647270150509)]

    13.6、自定义缓存-ehcache
    Ehcache是一种广泛使用的开源Java分布式缓存
    

    要在程序中使用ehcache,导入依赖

    
        org.mybatis.caches
        mybatis-ehcache
        1.1.0
    
    

    目前主要是redis缓存

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

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

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