MyBatis框架

一、什么是MyBatis?

       MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftware foundation迁移到了google code,并且改名为MyBatis 。2013年11日转移到Github。

可以看作是jdbc的一个高级封装

二、解决的主要问题?

 减轻使用JDBC的复杂性,不用编写重复的创建Connetion ,Statement ;不用编写关闭资源代码。

直接使用java对象,表示结果数据。让开发者专注SQL的处理。其他分心的工作由MyBatis代劳。

SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。

提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

三、使用步骤

0 创建数据库和表

1 新建一个maven项目

2 修改pom.xml文件

   1)加入mybatis依赖和MySQL驱动等


    
    
        
            org.mybatis
            mybatis
            3.5.1
        

        
        
            mysql
            mysql-connector-java
            5.1.46
        

    

  2)在build标签中加入资源插件


        
        
            
                src/main/java
                
                    **/*.properties
                    **/*.xml
                
                false
            
        
    

3 根据数据库表创建实体类

MyBatis框架_第1张图片

 4 创建dao接口,定义操作数据库的方法

 5 创建mapper文件(.xml)

 Mybatis框架推荐是把sql语句和java代码分开

推荐mapper文件:定义和dao接口在同一目录下,并且名字和dao接口的名字一致,一个表对应一个mappper文件

 mapper文件内部主要介绍:






mapper文件中直接写sql语句即可

标签的属性出现的。表示结果类型,mysql执行sql语句,得到java对象的类型。它的值有两种 1)java的全限定名称 2) 起别名

1、resultType

     1) java 的全限定名称

resultType :现在使用java类型的全限定名称。表示的意思mybatis执行sq1,把ResultSet中的数据转为student类型的对象。 mybatis会做以下操作:

1.调用com.zhiyou.mybatis.entity.Student的无参数构造方法,创建对象。

Student student = new student();   //使用反射创建对象

2.同名的列赋值给同名的属性。

student.setId( rs.getInt("id"));

student.setName(rs.getString("name"));

3.得到iava对象,如果dao接口返回值是List集合,mybatis把student对象放入到List集合。

所以执行Student mystudent = dao.selectById(1001);得到数据库中 id=1001这行数据,

这行数据的列值,赋给了mystudent对象的属性。你能得到mystudent对象。就相当于是id=1001这行数据。

    2)使用别名

mybatis提供的对java类型定义简短,好记名称。

自定义别名的步骤:

1) 在mybatis主配置文件,使用typeAliase标签声明别名

2)在mapper文件中, resultType="别名"

 也可以使用     这样就会给该包下面所有类起别名,默认为类名开头小写

2、resultMap

常用于列名和属性不同的情况,列名和属性名相同也可以使用

MyBatis框架_第13张图片

 八、多表联查

1、多对一 或者 一对一

现有两张表,学生表和班级表,学生表与班级表的对应关系是多个学生对应一个班级,或者也可以说一个学生对应一个班级

实体类

MyBatis框架_第14张图片MyBatis框架_第15张图片

 方式1:类似子查询方式 


    

        
            
            
            
        
    
    
    
    
    

 方式2:联合查询方式


    
        
        
        
        
        
        
            
            
            
        
    

    

2、一对多

现有两张表,班级表和学生表,一个班级可以对应多个学生,因此结果集需要映射封装

实体类

MyBatis框架_第16张图片MyBatis框架_第17张图片

 方式1 类似子查询方式


    
        
        
        
            
            
            
            
            
        
    
    
    

方式2 联合查询方式


    
        
        
        
        
            
            
            
            
            
        
    
    

九、动态sql

什么是动态sql:同一个dao方法,根据不同的条件可以表示不同的sql语句,主要是where部分有变化,使用mybatis提供的标签,实现动态sql的能力,主要讲if,where,foreach,sql

1、if标签 

语法如下:

MyBatis框架_第18张图片



MyBatis框架_第19张图片

 2、where标签

使用if标签时,容易引起sql语句语法错误。使用where标签解决if产生的语法问题。

使用where时 ,里面是一个或多个if标签,当有一个if标签判断条件为true,where标签会转为WHERE关键字附加到sql语句的后面。如果if 没有一个条件为true ,忽略where和里面的if

语法格式:

     条件”> sql语句 



3、foreach标签

使用foreach可以遍历集合和数组,一般用在in语句中

MyBatis框架_第20张图片


4、set标签

用于更新操作,可以自动判断是否去除最后一个逗号




    update student
    
        
            sname=#{sname},
        
        
            sex=#{sex},
        
        
            score=#{score},
        
        
            sdy=#{sdy},
        
    
    where sid = #{sid}

5、trim标签

6、choose标签




7、代码片段

sql标签标示一段sql代码,可以是表名,几个字段, where条件都可以,可以在其他地方复用sql标签的内容。

使用方式:

  1. 在mapper文件中定义 sq1代码片段

部分sq1语句

2)在其他的位置,使用include标签引用某个代码片段

8、if标签中test值的书写问题

 1)当参数是一个简单类型的参数时

MyBatis框架_第21张图片

 2)当方法参数是多个简单类型的参数时

MyBatis框架_第22张图片

 3)当方法参数是一个对象时

MyBatis框架_第23张图片

 十、缓存

当对数据库进行查询时  如果两次的sql语句一致 不再重复去服务数据库  直接使用上一次的查询结果
作用:提高程序效率+降低数据库服务器的压力

1、一级缓存

Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。
所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。

  • 一级缓存默认是开启的

  • 一级缓存针对于同一个sqSession

  • 一级缓存使用前提:缓存不能刷新

  • 期间不能执行dml

一级缓存生命周期

a、MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。

b、如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。

c、如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。

d、SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用

2、二级缓存

二级缓存是application级别的缓存/SqlSessionFactory级别的缓存
mybatis的二级缓存默认是关闭的 

二级缓存的数据会存储在硬盘上

在使用缓存的mapper映射文件中添加配置



在使用缓存的mapper映射文件的sql标签中添加配置:(默认是true:可以不用配置)





在核心配置文件中添加配置


       ....
       
       
   

你可能感兴趣的:(mysql,java,java,开发语言,后端)