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

Mybatis学习笔记

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

Mybatis学习笔记

文章目录
  • Mybatis
  • 1. 框架概述
    • 1.1 三层架构
    • 1.2 框架概念
    • 1.3 Mybatis简介
  • 2. 分析JDBC缺点
  • 3. 实现步骤
    • 3.1 加入依赖
    • 3.2 创建数据实体类
    • 3.3 创建dao接口
    • 3.4 创建sql映射文件
    • 3.5 创建jdbc配置文件
    • 3.5 创建主配置文件
    • 3.6 访问数据库
  • 4. 实现类介绍
  • 5. 获取session封装
  • 6. 动态代理实现类
  • 7. 深入理解参数
    • 7.1 传入单个简单参数
    • 7.2 传入多个简单参数
      • 7.2.1 使用注解(重要)
      • 7.2.2 封装参数(重要)
      • 7.2.3 指定顺序
      • 7.2.4 封装map
    • 7.3 $和#的区别
  • 8. 封装输出结果
    • 8.1 resultType
      • 8.1.1 简单类型参数
      • 8.1.2 对象类型参数
      • 8.1.3 Map
    • 8.2 resultMap
    • 8.3 as重写字段名
    • 8.3 定义封装对象别名
  • 9. 动态SQL
    • 9.1 if
    • 9.2 where
    • 9.3 foreach
    • 9.4 代码复用
  • 10. 分页输出
    • 10.1 导入依赖项
    • 10.2 主配置文件导入插件
    • 10.3 实现分页
  • 10. 分页输出
    • 10.1 导入依赖项
    • 10.2 主配置文件导入插件
    • 10.3 实现分页

Mybatis
  • mybatis的事务默认是不自动提交的

  • 主配置文件添加这个可以显示日志

    
        
    
    

1. 框架概述 1.1 三层架构

界面层(controller包)

springmvc框架

和用户对接,接受用户的请求参数,显示处理结果。

jsp、html、servlet



业务逻辑层(XXXservice包)

spring框架

接收界面层传递的数据,计算逻辑,调用数据库,获取数据



数据访问层(XXXDao包)

mybatis框架

访问数据库,执行对象数据的查询等操作




1.2 框架概念

框架是一个模板,其中已经定义好了一些功能,这些功能是可用的,可以在项目中加入自己的功能。

框架是一个半成品软件,定义好的基础功能是可重复使用的,可升级的。

框架特点:

  1. 不是全能,不能做所有事情
  2. 只是针对某一个领域有效
  3. 是一个软件

1.3 Mybatis简介

Mybatis是一个sql映射框架,提供数据库的操作能力,增强的JDBC,使用这个只需要写好sql语句即可。


Mybatis是一个框架,早期叫做ibatis

MyBatis SQL Mapper framework for Java (sql映射框架)

  1. sql mapper:sql映射

    把数据库表中的一行数据映射成一个java对象,一行数据可以看作是一个java对象。操作这个对象,就相当于操作表中的数据

  2. Data Access Objects(DAOs):数据访问

    对数据库执行增删改查


提供的功能:

  • 创建Connection、Statement等能力
  • 执行sql语句
  • 循环sql,将结果转为java对象,List集合
  • 关闭资源

开发人员只需提供sql语句



2. 分析JDBC缺点

重复代码太多,开发效率降低。



以上过程完全可以使用反射机制代替,而Mybatis框架就是别人提前写好的java代码,这Mybatis框架封装了JDBC代码,Mybatis框架就是别人已经写好的java代码。


sql编写在java程序中。

sql语句可能在后期是需要调优的,语句被修改的概率很高,然而在修改了sql语句导致java代码重新编译,项目重新部署,十分繁琐…

严重违背开闭原则:OCP



3. 实现步骤 3.1 加入依赖

    
        com.microsoft.sqlserver
        mssql-jdbc
        9.2.0.jre15
    

    
        org.mybatis
        mybatis
        3.4.6
    


3.2 创建数据实体类
public class Student {
    private String sno;
    private String sname;
    private String ssex;
    private Integer sage;
    private  String sdept;

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sno='" + sno + ''' +
                ", sname='" + sname + ''' +
                ", ssex='" + ssex + ''' +
                ", sage=" + sage +
                ", sdept='" + sdept + ''' +
                '}';
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getSsex() {
        return ssex;
    }

    public void setSsex(String ssex) {
        this.ssex = ssex;
    }

    public Integer getSage() {
        return sage;
    }

    public void setSage(Integer sage) {
        this.sage = sage;
    }

    public String getSdept() {
        return sdept;
    }

    public void setSdept(String sdept) {
        this.sdept = sdept;
    }
}

3.3 创建dao接口

其中定义操作数据库的方法

public interface StudentDao {
    // 查询所有数据
    List findAll();
}

3.4 创建sql映射文件






    
    
    select Sno, Sname, Ssex, Sage, Sdept
    from Student
    where Ssex = #{sex} and Sname like CONCAt('%',#{name},'%')


7.2.2 封装参数(重要)

这个方法是将参数封装成对象,类似于sqlSession.insert(String sqlId, Object obj)

在原方法中通过obj的getter方法找到参数,而封装参数就类似于此

public class FindByNameSex {
    private String paramName;
    private String paramSex;

    public String getParamName() {
        return paramName;
    }

    public void setParamName(String paramName) {
        this.paramName = paramName;
    }

    public String getParamSex() {
        return paramSex;
    }

    public void setParamSex(String paramSex) {
        this.paramSex = paramSex;
    }
}
List findByNameSex (FindByNameSex params);

    select Sno, Sname, Ssex, Sage, Sdept
    from Student
    where Sname like CONCAt('%',#{arg0},'%') and Ssex = #{arg1}


7.2.4 封装map

在主函数中将参数封装成map集合,key是映射文件占位符的名字,value就是占位符的值

这种方式不推荐!!!

因为别人看代码十分不方便

List findByNameSex (Map params);
public void testFindByNameSex() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    Map params = new HashMap<>();
    params.put("myName", "张");
    params.put("mySex", "男");
    List studentList = dao.findByNameSex(params);
    for (Student student : studentList) {
        System.out.println(student);
    }
    sqlSession.close();
}

    select Sname, Sage from Student


执行查找

@Test
public void testSelectAge() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    List stuList = dao.selectAge();
    for (SelectAge stu : stuList) {
        System.out.println(stu);
    }
    sqlSession.close();
}

8.1.3 Map

返回的对象是Map的话,列名是key,值是value

但是不能返回多个map,除非使用List>封装Map


8.2 resultMap

resultMap的作用是当封装对象的属性名和列名不一致的时候

在sql映射文件中配置属性名和字段名的映射关系


如果不使用resultMap,封装对象的属性名必须和字段名相同(不区分大小写)





    
    
    select Sno as stuId, Sname as stuName, Sage as stuAge from Student


8.3 定义封装对象别名

定义返回封装对象别名是在主配置文件中配置


第一种方式:


    


    select Sno, Sname, Ssex, Sage, Sdept
    from Student
    where Sname like CONCAt('%',#{myName},'%') and Ssex = #{mySex}



9. 动态SQL

根据条件,能够得到不同的sql语句,使用mybatis的标签即可实现


9.1 if

	部分sql语句


示例:


    select Sno, Sname, Sage from Student
    
    
        and Sname = #{sname}
	
    
        or Sage > #{sage}
	
    

@Test
public void testSelectAgeIf() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    Student stu = new Student();
    stu.setSname("张力");
    stu.setSage(19);
    List stuList = dao.selectAgeIf(stu);
    for (SelectAge student : stuList) {
        System.out.println(student);
    }
}



9.3 foreach

循环java数组,list集合的。主要用于sql的in语句中


相关标签参数:

  • collection

    接口中方法参数的类型,数组是array,集合是list

  • item

    自定义,表示成员变量

  • open

    循环开始时的字符

  • close

    循环结束时的字符

  • separator

    集合成员之间的分隔符


示例:


    select Sno, Sname, Sage from Student where Sno in
    
        #{id} ,
    


结果:
select Sno, Sname, Sage from Student where Sno in ( ? , ? , ? , ) 

    select Sno, Sname, Sage from Student where Sno in(
    
        #{id} ,
    
    -1, )


结果:
select Sno, Sname, Sage from Student where Sno in( ? , ? , ? , -1, )

如果集合或者数组中封装的是对象,需要遍历对象当中固定某个属性,可以使用 #{对象.属性名} 遍历



9.4 代码复用

可以将多次出现的sql语句进行复用


    select Sno, Sname, Ssex, Sage, Sdept from Student


    
    where Ssex = '男'





10. 分页输出

通过一个插件能够将结果分页显示,这个功能不是mybatis提供的。


10.1 导入依赖项

  com.github.pagehelper
  pagehelper
  5.2.0


10.2 主配置文件导入插件

    




    
        ...

10.3 实现分页
@Test
public void testFindAll() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    // 实现分页操作
    PageHelper.startPage(1,5);
    List studentList = dao.findAll();
    for (Student student : studentList) {
        System.out.println(student);
    }
    sqlSession.close();
}

这个PageHelper.startPage(1,5);表示第一页的五行数据,如果要查看第二页的五行数据则是PageHelper.startPage(2,5);
可以将多次出现的sql语句进行复用


    select Sno, Sname, Ssex, Sage, Sdept from Student






10. 分页输出

通过一个插件能够将结果分页显示,这个功能不是mybatis提供的。


10.1 导入依赖项

  com.github.pagehelper
  pagehelper
  5.2.0


10.2 主配置文件导入插件

    




    
        ...

10.3 实现分页
@Test
public void testFindAll() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    // 实现分页操作
    PageHelper.startPage(1,5);
    List studentList = dao.findAll();
    for (Student student : studentList) {
        System.out.println(student);
    }
    sqlSession.close();
}

这个PageHelper.startPage(1,5);表示第一页的五行数据,如果要查看第二页的五行数据则是PageHelper.startPage(2,5);

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

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

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