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

2021-07-02

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

2021-07-02

Mybatis学习笔记
  • 一、环境及基础知识
    • 1. 环境:
    • 2. 基础知识
    • 3. 文档资料
  • 二、简介
    • 1. 什么是Mybatis
    • 2.如何获得Mybatis
    • 3. 持久化
    • 4.持久层
    • Mybatis的特点
  • 三、第一个Mybatis程序
    • 1. 搭建环境
    • 2. 创建模块
    • 3. 编写具体代码
    • 4. 测试
  • 四、增删改操作
    • 1. namespace:
    • 2. Select
    • 3. Insert
    • 4. Delete
    • 5. Update
    • 6. 常见错误
    • 7. 万能map
  • 五、配置解析
    • 1.核心配置文件:MyBatis-config.xml
    • 2. 环境配置(environments)
    • 3.属性(properties)
    • 4.类型别名(typeAliases)
    • 5.设置(settings)
    • 6. 其他配置
    • 7. 映射器(mappers)
    • 8.生命周期和作用域
      • (1) 并发问题:
      • (2) Mybatis流程图
      • (3) SqlSessionFactoryBuilder:
      • (4) SqlSessionFactory:
      • (5) SqlSession:
      • (6) 调用过程:
  • 六 、解决属性名与字段名不一致的问题
    • 1. 问题
    • 2. 起别名来解决
    • 3. 结果集映射
    • 4.resultMap小结
  • 七、日志
    • 1.STDOUT_LOGGING 标准日志输出
    • 2.log4j
      • 2.1 什么是log4j
      • 2.2 导入log4j包
      • 2.3 编写log4j.properties配置文件(resources目录下)
      • 2.4 配置log4j为日志的实现
      • 2.5 log4j的使用,直接测试使用
      • 2.6 简单使用
  • 八、分页
    • 1.为何要分页
    • 2. 使用limit分页
    • 3. 用Mybatis实现分页
    • 4. RoWBounds分页
  • 九、使用注解开发
    • 1.面向接口编程
      • 1.1 为什么要面向接口编程
    • 1.2 关于接口的理解
    • 1.3 接口的类型
    • 1.4 三个面向的区别
    • 1.5 抽象类与接口的区别
    • 2. 注解开发
      • 2.1注解开发实现步骤
      • 2.2 MyBatis详细执行流程
      • 2.3 CRUD
      • 2.4 关于@param注解
      • 2.5 注释开发小结
  • 十、Lombok
    • 1. 安装lombok
    • 2. 在项目中导入lombok的jar包
    • 3. 注解的类别
    • 4. 在程序上加注解
  • 十一、多对一
    • 1. 创建Mysql数据库表
    • 2. 搭建测试环境
    • 3、小结
  • 十二、一对多处理
    • 1、环境搭建
    • 2、按结果集嵌套处理:TeacherMapper.xml
    • 3、按子查询嵌套处理:TeacherMapper.xml
    • 4、小结
  • 十三、动态sql
    • 1、什么是动态SQL
    • 2、动态sql种类
    • 3、小结
  • 十四、缓存
    • 1、缓存概述
    • 2、Mybatis缓存
    • 3、一级缓存
    • 4、一级缓存失效的种类
    • 5、二级缓存
    • 6、二级缓存使用步骤
    • 7、第三方缓存实现--EhCache

一、环境及基础知识 1. 环境:

jdk1.8、Mysql5.7、maven3.6.1

2. 基础知识

JDBC、Mysql、java基础、Maven、Junit

3. 文档资料

SSM框架的配置文件相关资料最好看官网https://mybatis.org/mybatis-3/index.html。

二、简介 1. 什么是Mybatis

(1) MyBatis 是一款优秀的持久层框架。
(2) MyBatis 支持自定义 SQL、存储过程以及高级映射。
(3) MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
(4) MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
(5) MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
(6) 2013年11月迁移到Github。

2.如何获得Mybatis

(1) Maven仓库


    org.mybatis
    mybatis
    3.5.2

(2) Github网站https://github.com/mybatis/mybatis-3/releases

3. 持久化

(1) 持久层:数据持久化,将程序的数据在持久状态和瞬时状态转化的过程。
(2) 内存数据:断电即失,即数据的瞬时状态。
(3) 持久化方式:数据库(JDBC)、IO文件持久化

4.持久层

(1) 完成持久化工作的代码块。
(2) 层界限十分明显
(3) Mybatis帮助程序员将数据存入数据库中。

Mybatis的特点

(1)简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
(2) 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
(3) 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
(4) 提供映射标签,支持对象与数据库的orm字段关系映射
(5) 提供对象关系映射标签,支持对象关系组建维护
(6) 提供xml标签,支持编写动态sql。

三、第一个Mybatis程序

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

1. 搭建环境

(1) 创建数据库

//创建数据库
CREATE DATAbase Mytabis; 
USE Mytabis;
//创建表
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; 

(2) 新建项目
新建一个普通(空)的maven项目
删除src目录
导入依赖包

//pom.xml


    4.0.0

    
    com.sxsl
    Mytabis-Study
    1.0-SNAPSHOT

    
    
        
        
            mysql
            mysql-connector-java
            5.1.46
        
        
        
            junit
            junit
            4.12
        
        
        
            org.mybatis
            mybatis
            3.5.2
        
    

2. 创建模块

(1) 在Mytabis-Study项目下创建一个空的Maven Module,名字为mytabis-01。
(2) 编辑核心配置文件src/main/resources/mytabis-confige.xml

//src/main/resources/mytabis-confige.xml




    
        
            
            
                
                
                
                
            
        
    
    
    
        
    

(3) 编写工具类main.java.com.sxsl.util.MybatisUtils.java

//com.sxsl.util.MybatisUtils
package com.sxsl.util;

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.InputStream;
import java.io.IOException;

//SqlSessionFactory——>sqlSession
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            
            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(){
        SqlSession sqlSession= sqlSessionFactory.openSession();
        return sqlSession;
    }

}
3. 编写具体代码

(1) 实体类main.java.com.sxsl.pojo.User.java

//.com.sxsl.pojo.User
package com.sxsl.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;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", pwd='" + pwd + ''' +
                '}';
    }

}

(2) 接口main.java.com.sxsl.dao.UserDao.java

//com.sxsl.dao.UserDao

package com.sxsl.dao;
import com.sxsl.pojo.User;
import java.util.List;

public interface UserDao {
    List getUserList();
    User getUserById(int id);
    int addUser(User user);
    int deleteUser(int id);
    int updateUser(User user);
}

(3) 接口实现类:由原来的UserDaoIMpl转变为一个Mapper配置文件main.java.com.sxsl.dao.UserMapper.xml







    
    
        select * from Mytabis.user where id=#{id}
    
    
        INSERT into Mytabis.user(id, name, pwd) VALUES (#{id},#{name},#{pwd})
    
    
        DELETE FROM Mytabis.user where id=#{id}
    
    
        UPDATE Mytabis.user set name=#{name},pwd=#{pwd} WHERe id=#{id}
    

4. 测试

(1) maven的约定大于配置,导致我们自己写的配置文件没有放在指定目录,无法被导出或生效,需手工加载配置文件在子模块的pom.xml

//pom.xml增加下面内容


    
        Mytabis-Study
        com.sxsl
        1.0-SNAPSHOT
    
    4.0.0

    mytabis-01
    
        
            
                src/main/resources
                
                    ***.xml
                
                false
            
            
                src/main/java
                
                    ***.xml
                
                false
            
        
    


(2) 注册:src/main/resources/mybatis-config.xml 增加以下内容

    
        
    

(3) 测试代码:选中UserDao接口Ctrl+Shift+T,生产UserDaoTest类,src/test/java/com/sxsl/dao/UserDaoTest.java

package com.sxsl.dao;

import com.sxsl.pojo.User;
import org.apache.ibatis.session.SqlSession;
import com.sxsl.util.MybatisUtils;
import org.junit.Test;


import java.sql.SQLException;
import java.util.List;

import static org.junit.Assert.*;

public class UserDaoTest {
    @Test()
    public void test(){
        //第一步获取SqlSession;
        SqlSession sqlSession= MybatisUtils.getSqlSession();
        //第二步:执行sql语句
        //方式一:getMapper方法
        UserDao userDao=sqlSession.getMapper( UserDao.class );
        List userList= userDao.getUserList();
        //方法二:
        // List userList=sqlSession.selectList( "com.sxsl.dao.UserDao.getUserList" );
        for (User user : userList) {
            System.out.println(user);

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

    @Test
    public void testId(){
        SqlSession sqlSession=MybatisUtils.getSqlSession();
        UserDao userDao=sqlSession.getMapper( UserDao.class );
        User user=userDao.getUserById( 1 );
        System.out.println(user);
        sqlSession.close();
    }
    @Test
    public void testAddUser(){
        SqlSession sqlSession=MybatisUtils.getSqlSession();
        UserDao userDao=sqlSession.getMapper( UserDao.class );
        userDao.addUser( new User( 1,"张三","12345" ) );
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void testDeleteUser(){
        SqlSession sqlSession=MybatisUtils.getSqlSession();
        UserDao userDao=sqlSession.getMapper( UserDao.class );
        userDao.deleteUser(1);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void testUpdateUser(){
        SqlSession sqlSession=MybatisUtils.getSqlSession();
        UserDao userDao=sqlSession.getMapper( UserDao.class );
        userDao.updateUser( new User( 1,"张三","123456"));
        sqlSession.commit();
        sqlSession.close();
    }
}

(4) 遇到额问题:
配置文件没有注册
绑定接口错误
方法名不对
返回类型不对
Maven导出资源问题:maven的约定大于配置,导致我们自己写的配置文件没有放在指定目录,无法被导出或生效,需手工加载配置文件在pom.xml

四、增删改操作 1. namespace:

(1) namespace中的包名要与DAO/Mapper 接口中的类名一致。
(2) id:对应namespace中的方法名。
(3) resultType:sql执行后返回值的类型。
(4) parameterType:参数类型。

2. Select

(1) 编写接口中的方法:/src/main/java/com/sxsl/dao/UserMapper.java

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

(2) 编写对应中的Mapper中的sql语句/src/main/java/com/sxsl/dao/UserMapper.xml

    
        select * from Mytabis.user where id=#{id}
    
4.resultMap小结

(1) resultMap 元素是 MyBatis 中最重要最强大的元素。
(2) ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
(3) MyBatis 会在幕后自动创建一个 ResultMap,再根据属性名来映射列到 JavaBean 的属性上。如果列名和属性名不能匹配上,可以在 SELECT 语句中设置列别名(这是一个基本的 SQL 特性)来完成匹配。

七、日志 1.STDOUT_LOGGING 标准日志输出

(1) 在核心配置文件mybatis-config.xml中添加以下内容


    

(2) 输出格式

Opening JDBC Connection
Created connection 1758386724.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@68ceda24]
==>  Preparing: select * from Mytabis.user where id=? 
==> Parameters: 1(Integer)
<==    Columns: id, name, pwd
<==        Row: 1, 张三, 12345
<==      Total: 1
User{id=1, name='张三', password='12345'}
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@68ceda24]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@68ceda24]
Returned connection 1758386724 to pool.
2.log4j 2.1 什么是log4j

(1) Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件;
(2) 我们也可以控制每一条日志的输出格式;
(3) 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
(4) 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

2.2 导入log4j包
//pom.xml
        
            log4j
            log4j
            1.2.17
        
2.3 编写log4j.properties配置文件(resources目录下)
#将等级为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/Devin.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
2.4 配置log4j为日志的实现
    
        
        
        
    
2.5 log4j的使用,直接测试使用
"C:Program FilesJavajdk1.8.0_281binjava" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2017.2.7libidea_rt.jar=62833:C:Program FilesJetBrainsIntelliJ IDEA 2017.2.7bin" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJetBrainsIntelliJ IDEA 2017.2.7libidea_rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2017.2.7pluginsjunitlibjunit-rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2017.2.7pluginsjunitlibjunit5-rt.jar;C:Program FilesJavajdk1.8.0_281jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_281jrelibdeploy.jar;C:Program FilesJavajdk1.8.0_281jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.8.0_281jrelibextcldrdata.jar;C:Program FilesJavajdk1.8.0_281jrelibextdnsns.jar;C:Program FilesJavajdk1.8.0_281jrelibextjaccess.jar;C:Program FilesJavajdk1.8.0_281jrelibextjfxrt.jar;C:Program FilesJavajdk1.8.0_281jrelibextlocaledata.jar;C:Program FilesJavajdk1.8.0_281jrelibextnashorn.jar;C:Program FilesJavajdk1.8.0_281jrelibextsunec.jar;C:Program FilesJavajdk1.8.0_281jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.8.0_281jrelibextsunmscapi.jar;C:Program FilesJavajdk1.8.0_281jrelibextsunpkcs11.jar;C:Program FilesJavajdk1.8.0_281jrelibextzipfs.jar;C:Program FilesJavajdk1.8.0_281jrelibjavaws.jar;C:Program FilesJavajdk1.8.0_281jrelibjce.jar;C:Program FilesJavajdk1.8.0_281jrelibjfr.jar;C:Program FilesJavajdk1.8.0_281jrelibjfxswt.jar;C:Program FilesJavajdk1.8.0_281jrelibjsse.jar;C:Program FilesJavajdk1.8.0_281jrelibmanagement-agent.jar;C:Program FilesJavajdk1.8.0_281jrelibplugin.jar;C:Program FilesJavajdk1.8.0_281jrelibresources.jar;C:Program FilesJavajdk1.8.0_281jrelibrt.jar;C:UsersAdministratorMytabis-Studymytabis-03targettest-classes;C:UsersAdministratorMytabis-Studymytabis-03targetclasses;C:Program FilesJetBrainsapache-maven-3.6.1maven-repolog4jlog4j1.2.17log4j-1.2.17.jar;C:Program FilesJetBrainsapache-maven-3.6.1maven-repomysqlmysql-connector-java5.1.46mysql-connector-java-5.1.46.jar;C:Program FilesJetBrainsapache-maven-3.6.1maven-repojunitjunit4.12junit-4.12.jar;C:Program FilesJetBrainsapache-maven-3.6.1maven-repoorghamcresthamcrest-core1.3hamcrest-core-1.3.jar;C:Program FilesJetBrainsapache-maven-3.6.1maven-repoorgmybatismybatis3.5.2mybatis-3.5.2.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.sxsl.dao.UserMapperTest,testId
[org.apache.ibatis.logging.LogFactory]-Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
[org.apache.ibatis.logging.LogFactory]-Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
[org.apache.ibatis.io.VFS]-Class not found: org.jboss.vfs.VFS
[org.apache.ibatis.io.JBoss6VFS]-JBoss 6 VFS API is not available in this environment.
[org.apache.ibatis.io.VFS]-Class not found: org.jboss.vfs.VirtualFile
[org.apache.ibatis.io.VFS]-VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
[org.apache.ibatis.io.VFS]-Using VFS adapter org.apache.ibatis.io.DefaultVFS
[org.apache.ibatis.io.DefaultVFS]-Find JAR URL: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/classes/com/sxsl/pojo
[org.apache.ibatis.io.DefaultVFS]-Not a JAR: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/classes/com/sxsl/pojo
[org.apache.ibatis.io.DefaultVFS]-Reader entry: User.class
[org.apache.ibatis.io.DefaultVFS]-Listing file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/classes/com/sxsl/pojo
[org.apache.ibatis.io.DefaultVFS]-Find JAR URL: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/classes/com/sxsl/pojo/User.class
[org.apache.ibatis.io.DefaultVFS]-Not a JAR: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/classes/com/sxsl/pojo/User.class
[org.apache.ibatis.io.DefaultVFS]-Reader entry: ����   1 @
[org.apache.ibatis.io.ResolverUtil]-Checking to see if class com.sxsl.pojo.User matches criteria [is assignable to Object]
[org.apache.ibatis.datasource.pooled.PooledDataSource]-PooledDataSource forcefully closed/removed all connections.
[org.apache.ibatis.datasource.pooled.PooledDataSource]-PooledDataSource forcefully closed/removed all connections.
[org.apache.ibatis.datasource.pooled.PooledDataSource]-PooledDataSource forcefully closed/removed all connections.
[org.apache.ibatis.datasource.pooled.PooledDataSource]-PooledDataSource forcefully closed/removed all connections.
[org.apache.ibatis.io.DefaultVFS]-Find JAR URL: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/test-classes/com/sxsl/dao
[org.apache.ibatis.io.DefaultVFS]-Not a JAR: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/test-classes/com/sxsl/dao
[org.apache.ibatis.io.DefaultVFS]-Reader entry: UserMapperTest.class
[org.apache.ibatis.io.DefaultVFS]-Listing file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/test-classes/com/sxsl/dao
[org.apache.ibatis.io.DefaultVFS]-Find JAR URL: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/test-classes/com/sxsl/dao/UserMapperTest.class
[org.apache.ibatis.io.DefaultVFS]-Not a JAR: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/test-classes/com/sxsl/dao/UserMapperTest.class
[org.apache.ibatis.io.DefaultVFS]-Reader entry: ����   1 U
[org.apache.ibatis.io.DefaultVFS]-Find JAR URL: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/classes/com/sxsl/dao
[org.apache.ibatis.io.DefaultVFS]-Not a JAR: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/classes/com/sxsl/dao
[org.apache.ibatis.io.DefaultVFS]-Reader entry: UserMapper.class
[org.apache.ibatis.io.DefaultVFS]-Reader entry: UserMapper.xml
[org.apache.ibatis.io.DefaultVFS]-Listing file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/classes/com/sxsl/dao
[org.apache.ibatis.io.DefaultVFS]-Find JAR URL: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/classes/com/sxsl/dao/UserMapper.class
[org.apache.ibatis.io.DefaultVFS]-Not a JAR: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/classes/com/sxsl/dao/UserMapper.class
[org.apache.ibatis.io.DefaultVFS]-Reader entry: ����   1    getUserList ()Ljava/util/List; 	Signature (()Ljava/util/List; getUserById (I)Lcom/sxsl/pojo/User; addUser (Lcom/sxsl/pojo/User;)I 
[org.apache.ibatis.io.DefaultVFS]-Find JAR URL: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/classes/com/sxsl/dao/UserMapper.xml
[org.apache.ibatis.io.DefaultVFS]-Not a JAR: file:/C:/Users/Administrator/Mytabis-Study/mytabis-03/target/classes/com/sxsl/dao/UserMapper.xml
[org.apache.ibatis.io.DefaultVFS]-Reader entry: 
[org.apache.ibatis.io.ResolverUtil]-Checking to see if class com.sxsl.dao.UserMapperTest matches criteria [is assignable to Object]
[org.apache.ibatis.io.ResolverUtil]-Checking to see if class com.sxsl.dao.UserMapper matches criteria [is assignable to Object]
[org.apache.ibatis.transaction.jdbc.JdbcTransaction]-Opening JDBC Connection
[org.apache.ibatis.datasource.pooled.PooledDataSource]-Created connection 302870502.
[org.apache.ibatis.transaction.jdbc.JdbcTransaction]-Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@120d6fe6]
[com.sxsl.dao.UserMapper.getUserById]-==>  Preparing: select * from Mytabis.user where id=? 
[com.sxsl.dao.UserMapper.getUserById]-==> Parameters: 1(Integer)
[com.sxsl.dao.UserMapper.getUserById]-<==      Total: 1
User{id=1, name='张三', password='12345'}
[org.apache.ibatis.transaction.jdbc.JdbcTransaction]-Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@120d6fe6]
[org.apache.ibatis.transaction.jdbc.JdbcTransaction]-Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@120d6fe6]
[org.apache.ibatis.datasource.pooled.PooledDataSource]-Returned connection 302870502 to pool.
2.6 简单使用

(1) 在要使用的log4j类中导入import org.apache.log4j.Logger;
(2) 日志对象,参数为当前类

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

(3) 日志级别

        logger.info( "info:进入UserMapperTest" );
        logger.debug( "debug:进入UserMapperTest" );
        logger.error( "error:进入UserMapperTest" );

(4) 一个完整的log4j测代码,导入log4j包和编写log4j.properties跟前面步骤一样,测试类代码如下

package com.sxsl.dao;

import com.sxsl.pojo.User;
import com.sxsl.util.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.*;

public class UserMapperTest {
    static Logger logger=Logger.getLogger( UserMapperTest.class );
    @Test
    public void testLog4j(){
        logger.info( "info:进入UserMapperTest" );
        logger.debug( "debug:进入UserMapperTest" );
        logger.error( "error:进入UserMapperTest" );
    }
}
八、分页 1.为何要分页

减少数据的处理量

2. 使用limit分页
select * from Mytabis.user limit #{startIndex},#{pageSize}
3. 用Mybatis实现分页

(1) 接口:UserMapper.java

    List getUserByLimit(Map map);

(2) UserMapper.xml

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

(3) 测试脚本:UserMapperTest.java

    @Test
    public void testGetUserByLimit(){
        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);
        }
        sqlSession.close();
    }
4. RoWBounds分页

(1) 接口

    List getUserByRowBounds();

(2) mapper.xml

    
        select * from student;
    

    
        
        
        
        
    

    
        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=#{tid};
    

StudentMapper.xml







(6) 工具类

package com.sxsl.util;

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;

//SqlSessionFactory——>sqlSession
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            
            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(){
        SqlSession sqlSession= sqlSessionFactory.openSession(true);
        return sqlSession;
    }

}

(7) 测试类

import com.sxsl.util.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.sxsl.dao.TeacherMapper;
import com.sxsl.pojo.Teacher;
import com.sxsl.util.MybatisUtils;

import java.util.List;

public class MyTest {
    @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper( TeacherMapper.class );
        List teacherList = mapper.getTeacher(1);
        for (Teacher teacher : teacherList) {
            System.out.println( teacher );
        }
        sqlSession.close();
    }
    @Test
    public void test2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper( TeacherMapper.class );
        List teacherList = mapper.getTeacher2(1);
        for (Teacher teacher : teacherList) {
            System.out.println( teacher );
        }
        sqlSession.close();
    }
}
2、按结果集嵌套处理:TeacherMapper.xml
    
    
        select * from teacher where id=#{tid};
    

    
        
    

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

(3) Set


  update blog
     
         
            title = #{title},
         
         
            author = #{author}
         
     
  where id = #{id};

(4) choose语句有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句


  select * from blog
   
       
       
       
   

(6) foreach


3、小结

其实动态 sql 语句的编写往往就是一个拼接的问题,为了保证拼接准确,我们最好首先要写原生的 sql 语句出来,然后在通过 mybatis 动态sql 对照着改,防止出错。多在实践中使用才是熟练掌握它的技巧。

十四、缓存 1、缓存概述

(1) 什么是缓存 [ Cache ]?
存在内存中的临时数据。
将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
(2) 为什么使用缓存?
减少和数据库的交互次数,减少系统开销,提高系统效率。
(3) 什么样的数据能使用缓存?
经常查询并且不经常改变的数据。

2、Mybatis缓存

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

3、一级缓存

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

4、一级缓存失效的种类

(1) sqlSession不同

@Test
public void testQueryUserById(){
   SqlSession session = MybatisUtils.getSession();
   SqlSession session2 = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   UserMapper mapper2 = session2.getMapper(UserMapper.class);

   User user = mapper.queryUserById(1);
   System.out.println(user);
   User user2 = mapper2.queryUserById(1);
   System.out.println(user2);
   System.out.println(user==user2);

   session.close();
   session2.close();
}

(2) sqlSession相同,查询条件不同

@Test
public void testQueryUserById(){
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   UserMapper mapper2 = session.getMapper(UserMapper.class);

   User user = mapper.queryUserById(1);
   System.out.println(user);
   User user2 = mapper2.queryUserById(2);
   System.out.println(user2);
   System.out.println(user==user2);

   session.close();
}

(3) sqlSession相同,两次查询之间执行了增删改操作!

@Test
public void testQueryUserById(){
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);

   User user = mapper.queryUserById(1);
   System.out.println(user);

   HashMap map = new HashMap();
   map.put("name","kuangshen");
   map.put("id",4);
   mapper.updateUser(map);

   User user2 = mapper.queryUserById(1);
   System.out.println(user2);

   System.out.println(user==user2);

   session.close();
}

(4) sqlSession相同,手动清除一级缓存

@Test
public void testQueryUserById(){
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);

   User user = mapper.queryUserById(1);
   System.out.println(user);

   session.clearCache();//手动清除缓存

   User user2 = mapper.queryUserById(1);
   System.out.println(user2);

   System.out.println(user==user2);

   session.close();
}
5、二级缓存

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

6、二级缓存使用步骤

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


(2)去每个mapper.xml中配置使用二级缓存,这个配置非常简单;

【xxxMapper.xml】



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

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

(3) 代码测试
所有的实体类先实现序列化接口
测试代码

@Test
public void testQueryUserById(){
   SqlSession session = MybatisUtils.getSession();
   SqlSession session2 = MybatisUtils.getSession();

   UserMapper mapper = session.getMapper(UserMapper.class);
   UserMapper mapper2 = session2.getMapper(UserMapper.class);

   User user = mapper.queryUserById(1);
   System.out.println(user);
   session.close();

   User user2 = mapper2.queryUserById(1);
   System.out.println(user2);
   System.out.println(user==user2);

   session2.close();
}

(4) 小结
只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据
查出的数据都会被默认先放在一级缓存中
只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中

7、第三方缓存实现–EhCache

(1) 查看官方文档
(2) 导入依赖包


   org.mybatis.caches
   mybatis-ehcache
   1.1.0

(3) 在mapper.xml中使用对应的缓存即可

 
    

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



   
   
   
   

   
   
   


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

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

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