资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

尚硅谷-Mybatis笔记

Java 更新时间: 发布时间: 计算机考试归档 最新发布

尚硅谷-Mybatis笔记

一.Mybatis下载

下载地址:MyBatis · GitHub

1.打开下载地址 

2.点击mybatis-3进去后直接往下拉到下图界面,选中Download Latest

3.选中你想要的版本开始下载

二.MyBatis的搭建

1.创建Maven工程并引入依赖

          4.0.0  ​      com.hjj.mybatis      mybatis_helloworld      1.0-SNAPSHOT                      8          8            jar                                        org.mybatis              mybatis              3.5.13                                                  junit              junit              4.12              test                                                  mysql              mysql-connector-java              8.0.31                  

2.创建MyBatis核心配置文件

习惯上命名为mybatis-config.xml

核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息

核心配置文件存放的位置是src/main/resources目录下

注意事项:

1、驱动类driver-class-name

MySQL 5版本使用jdbc5驱动,驱动类使用:com.mysql.jdbc.Driver

MySQL 8版本使用jdbc8驱动,驱动类使用:com.mysql.cj.jdbc.Driver2、连接地址url

MySQL 5版本的url:

j>dbc:mysql://localhost:3306/ssm

MySQL 8版本的url:

jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC

                                                                                                                                                                                      

3.创建Mapper接口

int insertUser()1.mapper接口和映射文件的namespace一致2.mapper接口中方法名要与映射文件中的sql的id保持一致

    public interface UserMapper {  ​      int insertUser();  }

4.创建MyBatis映射文件

1、映射文件的命名规则:

一个映射文件对应一个实体类,对应一张表的操作,表所对应的实体类的类名+Mapper.xml

例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml

MyBatis映射文件用于编写SQL,访问以及操作表中的数据

MyBatis映射文件存放的位置是src/main/resources/mappers目录下

2、 MyBatis中可以面向接口操作数据,要保证两个一致:

a>mapper接口的全类名和映射文件的命名空间(namespace)保持一致

b>mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致

                      insert into t_user values(1,'admin','123456',23,'男','123@qq.com')        

5.测试功能

    package com.hjj.mybatis.test;  ​  //        SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)  //  //        SqlSessionFactory:是“生产”SqlSession的“工厂”。  //  //        工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的  //  //        相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。  import com.hjj.mybatis.mapper.UserMapper;  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 org.junit.Test;  ​  import javax.annotation.Resource;  import java.io.IOException;  import java.io.InputStream;  ​    public class MyBatisTest {  ​      @Test      public void testInsert() throws IOException {  //        获取核心配置文件的输入流          InputStream is = Resources.getResourceAsStream("mybatis-config.xml");  //        获取SqlSessionFactoryBuilder对象          SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();  //        获取SqlSessionFactory对象          SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);  //        获取sql的会话对象SqlSession-》Mybatis提供的操作数据库的对象          SqlSession sqlSession = sqlSessionFactory.openSession();  //        通过代理模式获取UserMapper的代理实现类对象          UserMapper mapper = sqlSession.getMapper(UserMapper.class);  //        调用mapper接口中的方法,实现添加用户信息的功能          //调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配          //映射文件中的SQL标签,并执行标签中的SQL语句          int result=mapper.insertUser();          System.out.println("结果"+result);  //        提交事务          sqlSession.commit();          sqlSession.close();  ​      }  }

6.加入log4j功能

1.在pom.xml中加入依赖

                      log4j          log4j          1.2.17      

2.加入log4j的配置文件

log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下

                                                                                                                                              

日志的级别

FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)

从左到右打印的内容越来越详细

三.Mybatis获取参数值

MyBatis获取参数值的两种方式:${}和#{}

${}的本质就是字符串拼接,#{}的本质就是占位符赋值${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式()拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号并且可以避免sql注入

若mapper接口的参数为:

1.单个字面量类型的参数

若mapper接口中的方法参数为单个的字面量类型,此时可以使用${}和#{}以任意的名称获取参数的值,注意前者需要手动加单引号

                 select * from t_user where username = '${username}'      

2.多个字面量类型的参数

若mapper接口中的方法参数为多个时,此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;以param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相对应的值

3.map集合类型的参数

mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中只需要通过${}和#{}访问map集合的键就可以获取相对应的值

4.实体类类型的参数

若mapper接口中的方法参数为实体类对象时, 此时可以使用${}和#{},通过访问实体类对象中的属性名(只跟get、set方法有关系)获取属性值

5.使用@Param标识参数

可以通过@Param注解标识mapper接口中的方法参数,此时MyBatis会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;只需要通过${}和#{}访问map集合的键就可以获取相对应的值

四.MyBatis查询功能

1.查询一个实体类对象

SelectMapper.java:

         * 根据id查找用户信息       * @param id       * @return       */      User getUserById(@Param("id") Integer id);

SelectMapper.xml

                    select * from t_user      

当查询的数据为多条时,不能使用实体类作为返回值,否则会抛出异常TooManyResultsException(返回值与查询出的条数不一致);但是若查询的数据只有一条,可以使用实体类或集合作为返回值

3.查询单个数据

              int getCount();
              select * from t_user where id=#{id}      

5.查询多条数据为map集合

           List> getAllUserToMap();
                        select * from t_user where username like "%"#{mohu}"%"      

2.批量删除

    ​            void deleteMore(@Param("ids")String ids);
                    select * from ${tableName}      

4.添加功能自增的主键

场景模拟:t_clazz(clazz_id,clazz_name)t_student(student_id,student_name,clazz_id)1、添加班级信息2、获取新添加的班级的id3、为班级分配学生,即将某学的班级id修改为新添加的班级的id

           void insertUser(User user);
                        insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})      

六.自定义映射resultMap

1.处理字段和属性之间的关系

若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用_),实体类中的属性名符合Java的规则(使用驼峰)此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系a>可以通过为字段起别名的方式,保证和实体类中的属性名保持一致b>可以在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase,可以在查询表中数据时,自动将_类型的字段名转换为驼峰

                               

c>通过resultMap设置自定义映射

       ​                                                                      select t_emp.*,t_dept.*              from t_emp left join t_dept                  on t_emp.dept_id=t_dept.dept_id                      where t_emp.emp_id=#{empId}      

(2)association方式处理多对一映射关系

                                                                                          

(3)分步查询处理多对一映射关系

                                                                             select * from t_dept left join t_emp            on t_dept.dept_id=t_emp.dept_id                where t_dept.dept_id=#{deptId}    

(2)分步查询

                                                    select * from t_emp where                    emp_name=#{empName}                            and age=#{age}                            and gender=#{gender}            

2.where

where和if一般结合使用:a>若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字b>若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的and去掉注意:where标签不能去掉条件最后多余的and

          select * from t_emp where                    emp_name=#{empName}                            and age=#{age}                            and gender=#{gender}            

4.choose、when、otherwise

choose、when、 otherwise相当于if, else if, else

场景:有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用

          select  from t_emp                                    emp_name=#{empName}                                        and age=#{age}                                        and gender=#{gender}                        

八.Mybatis缓存

1.MyBatis的一级缓存(默认开启)

一级缓存是SqlSession级别的,即通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问

  • 使一级缓存失效的四种情况:

不同的SqlSession对应不同的一级缓存

同一个SqlSession但是查询条件不同

同一个SqlSession两次查询期间执行了任何一次增删改操作(任意增删改是会清空缓存的)

同一个SqlSession两次查询期间手动清空了缓存(sqlSession.clearCache())

2.MyBatis的二级缓存

二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取

  • 二级缓存开启的条件:

a>在核心配置文件中,设置全局配置属性cacheEnabled="true",默认为true,不需要设置

b>在映射文件中设置标签

c>二级缓存必须在SqlSession关闭或提交之后有效

d>查询的数据所转换的实体类类型必须实现序列化的接口

使二级缓存失效的情况:

两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效

3.二级缓存的相关配置(了解即可)

在mapper配置文件中添加的cache标签可以设置一些属性:

①eviction属性:缓存回收策略,默认的是 LRU。

LRU(Least Recently Used) – 最近最少使用的:移除最长时间不被使用的对象。

FIFO(First in First out) – 先进先出:按对象进入缓存的顺序来移除它们。

SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

②flushInterval属性:刷新间隔,单位毫秒

默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

③size属性:引用数目,正整数

代表缓存最多可以存储多少个对象,太大容易导致内存溢出

④readOnly属性:只读, true/false

true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了 很重要的性能优势。

false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。

4.MyBatis缓存查询的顺序(大-》小)

先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。

如果二级缓存没有命中,再查询一级缓存(一级缓存关闭或提交后才保存到二级缓存,因此一级缓存有的二级缓存不一定有)

如果一级缓存也没有命中,则查询数据库

SqlSession关闭之后,一级缓存中的数据会写入二级缓存

5.整合第三方缓存EHCache(针对二级缓存)

(1) 添加依赖

    org.mybatis.caches    mybatis-ehcache    1.2.1    ch.qos.logback    logback-classic    1.2.3

(2) 各jar包功能

jar包名称作用
mybatis-ehcacheMybatis和EHCache的整合包
ehcacheEHCache核心包
slf4j-apiSLF4J日志门面包
logback-classic支持SLF4J门面接口的一个具体实现

(3) 创建EHCache的配置文件ehcache.xml

				

(4) 设置二级缓存的类型

(5) 加入logback日志

存在SLF4J时,作为简易日志的log4j将失效,此时我们需要借助SLF4J的具体实现logback来打印日志。 创建logback的配置文件logback.xml

				                        			[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger][%msg]%n			            							

(6) EHCache配置文件说明

属性名是否必须作用
maxElementsInMemory在内存中缓存的element的最大数目
maxElementsOnDisk在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal设定缓存的elements是否永远不过期。 如果为true,则缓存的数据始终有效, 如果为false那么还要根据timeToIdleSeconds、timeToLiveSeconds判断
overflowToDisk设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
timeToIdleSeconds当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时, 这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMBDiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
diskPersistent在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds磁盘缓存的清理线程运行间隔,默认是120秒。每个120s, 相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。 默认是LRU (最近最少使用),可选的有LFU (最不常使用)和FIFO (先进先出)

九、MyBatis的逆向工程

正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。 Hibernate是支持正向工

程的。

逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源:

  • Java实体类

  • Mapper接口

  • Mapper映射文件

1.创建逆向工程的步骤

①添加依赖和插件

	        org.mybatis        mybatis        3.5.7				junit        junit        4.12        test			        log4j        log4j        1.2.17		        mysql        mysql-connector-java        8.0.16							            org.mybatis.generator            mybatis-generator-maven-plugin            1.3.0														                    org.mybatis.generator                    mybatis-generator-core                    1.3.2												                    mysql                    mysql-connector-java                    8.0.16										

②创建MyBatis的核心配置文件

③创建逆向工程的配置文件

文件名必须是:generatorConfig.xml

												                        																				                                

2、QBC查询

@Testpublic void testMBG(){    try {		InputStream is = Resources.getResourceAsStream("mybatis-config.xml");		SqlSessionFactory sqlSessionFactory = new		SqlSessionFactoryBuilder().build(is);		SqlSession sqlSession = sqlSessionFactory.openSession(true);		EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);        //查询所有数据,条件为null查所有                //根据条件查询                mapper.updateByPrimaryKeySelective(newEmp(1,"admin",22,null,"456@qq.com",3));	} catch (IOException e) {		e.printStackTrace();	}}

十.分页插件

limit index,pageSize

pageSize:每页显示的条数

pageNum:当前页的页码

index:当前页的起始索引,index=(pageNum-1)*pageSize

count:总记录数

totalPage:总页数

totalPage = count / pageSize;

if(count % pageSize != 0){

totalPage += 1;

}

pageSize=4,pageNum=1,index=0 limit 0,4

pageSize=4,pageNum=3,index=8 limit 8,4

pageSize=4,pageNum=6,index=20 limit 8,4

首页 上一页 2 3 4 5 6 下一页 末页

1.添加分页插件依赖

com.github.pagehelper  pagehelper5.2.0 //版本号

2.在mybatis-config.xml中创建分页插件

3.查询操作测试

 @Test    public void testPage(){        SqlSession sqlSession = SqlSessionUtil.getSqlSession();        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);//        查询之前开启分页功能        PageHelper.startPage(3,2);        List list = mapper.selectByExample(null);//        查询之后获取分页相关的所有数据//        list:分页之后的数据//        navigatePages:导航分页的页码数        PageInfo pageInfo = new PageInfo<>(list, 5);        list.forEach(System.out::println);        System.out.println(pageInfo);    }

4.分页相关数据

PageInfo{pageNum=3, pageSize=2, size=2, startRow=5, endRow=6, total=9, pages=5, list=Page{count=true, pageNum=3, pageSize=2, startRow=4, endRow=6, total=9, pages=5, reasonable=false, pageSizeZero=false}[Emp{empId=5, empName='a', age=null, gender='null', deptId=null}, Emp{empId=6, empName='a', age=null, gender='null', deptId=null}], prePage=2, nextPage=4, isFirstPage=false, isLastPage=false, hasPreviousPage=true, hasNextPage=true, navigatePages=5, navigateFirstPage=1, navigateLastPage=5, navigatepageNums=[1, 2, 3, 4, 5]}

pageNum:当前页的页码pageSize:每页显示的条数size:当前页显示的真实条数total:总记录数pages:总页数prePage:上一页的页码nextPage:下一页的页码isFirstPage/isLastPage:是否为第一页/最后一页hasPreviousPage/hasNextPage:是否存在上一页/下一页navigatePages:导航分页的页码数navigatepageNums:导航分页的页码,[1,2,3,4,5]

Mybatis的学习到这里先告一段落啦

有什么疑问可以在评论区提,文章中若有不当之处,也恳请各位帮忙指正

如果本文对铁子们有所帮助的话,可以一键三连哦

 

转载请注明:文章转载自 http://www.konglu.com/
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【尚硅谷-Mybatis笔记】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2