Mybatis(一)基础使用

Mybatis 基本应用

框架简介

三层架构

  • 软件开发常用的架构是三层架构,之所以流行是因为有着清晰的任务划分。一般包括以下三层:
    • 持久层:主要完成与数据库相关的操作,即对数据库的增删改查。
    • 因为数据库访问的对象一般称为Data Access Object(简称DAO),所以有人把持久层叫做DAO层。
    • 业务层:主要根据功能需求完成业务逻辑的定义和实现。 因为它主要是为上层提供服务的,所以有人把业务层叫做Service层或Business层。
    • 表现层:主要完成与最终软件使用用户的交互,需要有交互界面(UI)。因此,有人把表现层称之为web层或View层。
  • 三层架构之间调用关系为:表现层调用业务层,业务层调用持久层。
  • 各层之间必然要进行数据交互,我们一般使用java实体对象来传递数据。

Mybatis简介

  • MyBatis是一个优秀的基于ORM的半自动轻量级持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码
  • mybatis 历史
    • MyBatis 本是apache的一个开源项目iBatis, 2010年6月这个项目由apache software foundation 迁移到了google code,随着开发团队转投到GoogleCode旗下,iBatis正式改名为MyBatis ,代码于2013年11月迁移到Github
    • Github地址:https://github.com/mybatis/mybatis-3/

Mybatis快速入门

MyBatis开发步骤 人狠话不多先上代码

环境搭建
       
    
        org.mybatis
        mybatis
        3.4.5
    
编写MyBatis核心文件
  •  
    
    
        
        
    
        
        
            
           
            
            
    
        
    
    
        
        
            
                    
                
                    
                
                    
                    
                    
                    
                
            
        
    
        
        
            
        
    
    
    
编写mapper映射
 
      
  
      
      
  
      
      
      
          insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
      
  
  
      
      
          update user set username = #{username},birthday = #{birthday},sex = #{sex},address = #{address} where id = #{id}
      
  
  
      
      
          delete from user where id = #{abc}
      
  

MyBatis常用配置解析

environments标签
- 数据库环境的配置,支持多环境配置
-  其中,事务管理器(transactionManager)类型有两种: 
    -  JDBC: 这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。 
    -  MANAGED: 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。 例如:mybatis与spring整合后,事务交给spring容器管理。
- 其中,数据源(dataSource)常用类型有三种: 
    - UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。 
    - POOLED: 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。 
    - JNDI : 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据 源,然后放置一个 JNDI 上下文的数据源引用
properties标签

实际开发中,习惯将数据源的配置信息单独抽取成一个properties文件,该标签可以加载额外配置的 properties:
Mybatis(一)基础使用_第1张图片

typeAliases标签
- 类型别名是为 Java 类型设置一个短的名字。
- 为了简化映射文件 Java 类型设置,mybatis框架为我们设置好的一些常用的类型的别名:

- 原来的类型名称配置如下:

- 配置typeAliases,为com.lagou.domain.User定义别名为user:
- 
        
        
            
           
            
            
    
        
mappers标签
 - 该标签的作用是加载映射的,加载方式有如下几种:
- 
         使用相对于类路径的资源引用,例如: 
         
        使用完全限定资源定位符(URL),例如:
        
         《下面两种mapper代理开发中使用:暂时了解》 
        使用映射器接口实现类的完全限定类名,例如
        
        将包内的映射器接口实现全部注册为映射器,例如: 
          
其他标签就不多说了去官方看

Mybatis高级查询

ResutlMap属性

  • 建立对象关系映射

    • resultType 如果实体的属性名与表中字段名一致,将查询结果自动封装到实体类中
    • ResutlMap 如果实体的属性名与表中字段名不一致,可以使用ResutlMap实现手动封装到实体类中
          
              
              
              
              
          
      
          
    

多条件查询(三种)

方式一

  • 使用 #{arg0}-#{argn} 或者 #{param1}-#{paramn} 获取参数
  •    
    
      
    

方式二

  • 使用注解,引入 @Param() 注解获取参数
  •    /*
         多条件查询方式二
      */
      public List findByIdAndUsername2(@Param("id") int id, @Param("username") String username);
      
    
      
    

方式三(推荐)

  • 使用pojo对象传递参数
  •    /*
            多条件查询方式三
         */
          public List findByIdAndUsername3(User user);
            
      
          
    

模糊查询

    
    username传值要带%号
    
    
    
  • ${} 与 #{} 区别【笔试题】
    • #{} :表示一个占位符号
      • 通过 #{} 可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换
      • #{}可以有效防止sql注入。
      • #{} 可以接收简单类型值或pojo属性值。
      • 如果parameterType传输单个简单类型值, #{} 括号中名称随便写。
    • ${} :表示拼接sql串
      • 通过 ${} 可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,会出现sql注入问题。
      • ${} 可以接收简单类型值或pojo属性值。
      • 如果parameterType传输单个简单类型值, ${} 括号中只能是value。
        • 补充:TextSqlNode.java 源码可以证明

Mybatis映射文件深入

返回主键

  • 我们很多时候有这种需求,向数据库插入一条记录后,希望能立即拿到这条记录在数据库中的主键值

  •   
          
          
              insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
          
      
      
          
      
          
      
              
              
                  SELECT LAST_INSERT_ID();
              
              insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
          
    
  • 主键返回是直接在 实体对象中

动态SQL

  • 当我们要根据不同的条件,来执行不同的sql语句的时候,需要用到动态sql

动态 SQL 之

 
    

动态 SQL 之

    
    
        update user
        
        
            
                username = #{username},
            
            
                birthday = #{birthday},
            
            
                sex = #{sex},
            
            
                address = #{address},
            

        
            where id = #{id}
    


    
        select * from user
    

动态 SQL 之

    
    


    
    

SQL片段

  • 映射文件中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的
  •   
      select * from user
      
      
      
    

知识小结

  • :查询
  • :插入
  • :修改
  • :删除
  • :返回主键
  • :where条件
  • :if判断
  • :for循环
  • :set设置
  • :sql片段抽取

Mybatis核心配置文件深入

plugins标签

  • MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据
    • 开发步骤:
      • 导入通用PageHelper的坐标
      • 在mybatis核心配置文件中配置PageHelper插件
      • 测试分页数据获取
  •   maven pom.xml
     
      
          com.github.pagehelper
          pagehelper
          3.7.5
      
    
      
          com.github.jsqlparser
          jsqlparser
          0.9.1
      
      
     sqlconfig.xml
      
          
    
              
              
          
      
      
      // 设置分页参数
      // 参数1: 当前页
      // 参数2: 每页显示的条数
      PageHelper.startPage(1,2);
    
      List users = mapper.findAllResultMap();
      for (User user : users) {
          System.out.println(user);
      }
    
      // 获取分页相关的其他参数
      PageInfo pageInfo = new PageInfo(users);
      
      System.out.println("总条数:"+pageInfo.getTotal()); System.out.println("总页数:"+pageInfo.getPages()); System.out.println("当前页:"+pageInfo.getPageNum()); System.out.println("每页显示长度:"+pageInfo.getPageSize()); System.out.println("是否第一页:"+pageInfo.isIsFirstPage()); System.out.println("是否最后一页:"+pageInfo.isIsLastPage())
    

知识小结

  • MyBatis核心配置文件常用标签:
    • properties标签:该标签可以加载外部的properties文件
    • typeAliases标签:设置类型别名
    • environments标签:数据源环境配置标签
    • plugins标签:配置MyBatis的插件

Mybatis多表查询

一对一(多对一)

    

    
         绑定主键
        
        
        


        
        
             绑定主键 传值uid
            
            
            
            

        
    

    

一对多




    
    
    
    
    


    
    
        
        
        
        
    





多对多




    
    
    
    
    

    
        
        
        
     




小结

  • 多对一(一对一)配置:使用+做配置 *
  • 一对多配置:使用+做配置 *
  • 多对多配置:使用+做配置 *
  • 多对多的配置跟一对多很相似,难度在于SQL语句的编写

MyBatis嵌套查询

  • 嵌套查询就是将原来多表查询中的联合查询语句拆成单个表的查询,再使用mybatis的语法嵌套在一起。
  •    联合查询
      SELECT * FROM orders o LEFT JOIN USER u ON o.`uid`=u.`id`; 
       嵌套查询 
       先查询订单 SELECT * FROM orders 
      再根据订单uid外键,查询用户 SELECT * FROM `user` WHERE id = #{根据订单查询的uid}
       最后使用mybatis,将以上二步嵌套起来
    

一对一嵌套查询

    
    
    
    
    

    
    



    

    
    
      
      
    

一对多嵌套查询

    

    
        
        
        
        
        


        
        

    

    
    
    

多对多嵌套查询

    
        
        
        
        
        

        
    

    
    
    
    

小结

  • 一对一配置:使用+做配置,通过column条件,执行select查询
  • 一对多配置:使用+做配置,通过column条件,执行select查询
  • 多对多配置:使用+做配置,通过column条件,执行select查询
  • 优点:简化多表查询操作 缺点:执行多次sql语句,浪费数据库性能

你可能感兴趣的:(Mybatis,数据库,java,sql)