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

深入浅出 万字详解 MyBatis看这一篇就够了!

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

深入浅出 万字详解 MyBatis看这一篇就够了!

三层架构
  • 界面层 Controller -> SpringMVC

    User interface layer,表示层,视图层,接受用户数据显示请求结果。使用web页面和用户交互,如jsp、html、servlet。

  • 业务逻辑层 Service -> Spring

    Business logic layer,接收表示层传递的数据,检查数据计算业务逻辑,调用数据访问层获取数据。

  • 数据访问层 Dao1 -> MyBatis

    Data access layer, 持久层。与数据库打交道,实现对数据的增、删、改、查。将数据提供给业务层,将业务层处理的数据保存到数据库。

JDBC缺陷
  1. 代码较多,开发效率低,重复代码多

  2. 需要关注Connection Statement ResultSet 对象的创建和销毁

  3. 对查询结果需要手动进行封装

  4. 业务代码和数据库操作混合

简介

早期叫做ibatis,MyBatis - MyBatis SQL Mapper framework for Java,是一个SQL映射框架,提供数据库的操作能力,是增强的JDBC。

  • SQL Mapper - sql映射

    可以把数据库表中的一行数据映射为一个 java 对象

  • Data Access Objects - DAOs

    数据访问,对数据库执行增删改查

使用

准备

依赖项

 
     org.mybatis
     mybatis
     3.5.7
 
  
     mysql
     mysql-connector-java
     8.0.26
 

主配置文件 - mybatis.xml

 
 
 
     
     
 ​
     
         
         
     
 ​
     
         
             
             
                 
                 
                 
                 
             
         
     
 ​
 

JDBC配置文件 - jdbc.properties

 jdbc.driver=com.mysql.cj.jdbc.Driver
 jdbc.url=jdbc:mysql://localhost:3306/test
 jdbc.username=root
 jdbc.password=root

DAO层

以下代码中部分内容为 MyBatis 具体使用内容,将在下文进行详解。

 
 public interface StudentDao {
 ​
     Student selectStudentById(@Param("id") int id);
 ​
     List selectStudentIf(Student student);
 ​
     List selectStudentWhere(Student student);
 ​
     List selectStudentForEach(List list);
 ​
     List selectStudents();
 ​
     @MapKey("id")
     HashMap selectStudentsMap();
 ​
     int insertStudent(Student student);
 ​
     int count();
 ​
 }

定义数据类

 public class Student {
     private int id;
     private String name;
     private String email;
     private int age;
     
     //constructer getter setter toString ...
 }

原始使用

在原始调用中我们需要遵守以下规则:

  1. 加载主配置文件(mybaties.xml)

  2. 生成SqlSession接口工厂类的生产类(SqlSessionFactoryBuilder)

  3. 利用生产类创建工厂类实例(SqlSessionFactory)

  4. 利用工厂类创建操作类实例,与数据库进行交互(SqlSession)

     public static void main(String[] args) throws Exception {
         InputStream input = Resources.getResourceAsStream("mybatis.xml");
         SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
         SqlSessionFactory factory = factoryBuilder.build(input);
         SqlSession sqlSession = factory.openSession();
         // TODO JDBC operations
         sqlSession.close();
     }

为了使用SqlSession,我们需要创建对应Dao类的配置文件StudentDao.xml(一般放置在同级目录下),在此处我们先简单创建一个文件并在其中定义一个查询全表的操作。并在主配置文件中注册该Dao配置文件。

 
 
 
     

配置传参

上述示例都是返回表中的全部元素,如果我们要编写以下一串 sql 语句,那么对应的条件参数该如何传递呢?

SELECT id, name, email, age FROM student WHERe id=XX

  • 基本类型传参

    如果我们只需要查询某个 id 的数据,那么使用 #{数据名} / ${数据名} 即可获取方法中传入的参数,例如对于 StudentDao#selectStudentById(int id),我们仅需使用 #{id} / ${id} 即可获取传递的参数,构成SQL语句进行查询。

    注意此处的 #{id} 内的id默认为形式参数名称,如果需要指定传入参数名称需要使用 @Param注解

         
         Student selectStudentById(@Param("id") int id);
  • 引用类型传参

    一般工程中,我们通常传入一个既定的data数据对象(例如本文中的 Student 类),通过调用对象的getter方法我们可以不改动的获取多个成员变量对结果进行选择。

         Student selectStudentById(Student stu);

    对于以上方法,我们可以通过stu对象调用成员变量值

          
             SELECT id, `name`, `email`, `age` FROM student WHERe 1=1
             
                 `name` = #{name}
             
             
                 OR `age` > #{age}
             
         

    注意此处为什么 WHERe 后要加 1=1

    因为 if 约束下如果条件成立,其内部的 SQL 语句才会被拼接,如果出现 name=null, age>10 的条件,则语句将会直接变成 WHERe OR age>#{age} 从而产生错误,因此我们可以添加一个无关紧要的式子来将其转换为 WHERe 1=1 OR age>#{age} 从而避免异常。

  • WHERe

    where 约束需与 if 约束组合使用,其与直接使用 if 的区别在与 where 约束会自动帮助开发者山区无用语句例如上述中可能出现的多余 OR,故在开发时相较于 if 更常用 where。

         
             SELECT id, `name`, `email`, `age` FROM student WHERe `id` IN
             
                 #{perId}
             
         

    以上约束执行结果为

  • 由此可见整个 foreach 的作用就是以我们指定的规则与我们传入的参数数量拼接成一个 IN (...) 的SQL语句并附加在主SQL语句中

resultMap

在 select 约束中,我们的返回属性并不只有 resultType 一种,resultMap 也是相当常用的一种,他能根据你制定的命名规则将数据库中的查询结果映射到你指定的数据类中并返回(即使是另一个拥有相同属性的不同数据类!)

要注意的是 resultType 和 resultMap 属性二者不能同时配置,应选取一个

举例说明:这是我们原始的函数定义与其相关配置

     List selectStudentsMap();
     
         SELECT `id`, `name`, `email`, `age` FROM student ORDER BY `id`
     

[1]  Data Access Objects

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

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

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