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

MyBatis

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

MyBatis

Mybatis 第一章 框架的概述 1.三层架构

mvc: web开发中使用mvc模式。m:数据;v:视图;c:控制器

c控制器:接收请求,调用servlet对象,显示请求处理的结果,当前使用servlet作为控制器

v视图:目前使用jsp,html,css,js.显示请求的处理结果,把m中数据展示出来

m数据:来自数据库mysql,来自文件,来自网络。

mvc作用:

  1. 实现解耦合
  2. 让mvc各司其职
  3. 使得系统扩展更好

三层架构:

  1. 界面层(视图层):接收用户的请求,调用service,显示请求的处理结果的包含了jsp,servlet,html等对象
  2. 业务逻辑层:处理业务逻辑,使用算法处理数据的。将数据返回给界面层,对应的是service包和包中的很多XXService类,例如:StudentService,OrderService
  3. 持久层(数据库访问):访问数据库,或者读取文件,访问网络,获取对象,对应的包是dao包。dao包中很多的StudentDao,OrderDao,ShopDao等。
2.三层架构请求处理流程

用户发起请求—>界面层----->业务逻辑层----->持久层----->数据库

3.为什么使用三层架构?
  1. 结构清晰
  2. 可维护性高
  3. 有利于标准化
  4. 开发人员可以只关注整个结构的其中某一层的功能实现
  5. 有利于各层逻辑的复用
4.三层架构模式和框架

每一层对应一个框架

1)界面层—SpringMVC框架(3天)

2)业务层—Spring框架(4.5-5天)

3)持久层—MyBatis(2.5-3天)

5.框架

1) 什么是框架

框架:就是一个软件,完成了部分的功能。软件中的类和类之间的方法调用都已经规定好了。通过这些可以完成某些功能。框架可以看作是一个模板。

框架是可以升级的,改造的,框架是安全的

框架是对某一方面有用的,不是全能的。

6.框架解决的问题
  1. 框架能实现技术的整合

  2. 提升开发效率,降低难度

7.JDBC访问数据库优缺点

优点:

  1. 直观,易理解,易上手

缺点:

  1. 创建很多对象Connection,Statement,ResultSet
  2. 注册驱动
  3. 执行sql语句
  4. 把resultSet转为Student,List集合
  5. 关闭资源
  6. sql语句和业务逻辑混在一起
8.Mybatis框架

概述:

Mybatis是一个持久层框架,本是apache的一个开源项目 iBatis,2010年这个项目有apache software foundation 迁移到了google code,并且改名为MyBatis。2013年11月项目迁移到了GitHub。

Mybatis能够操作数据库,对数据库进行增删改查。可以看作高级的jdbc,解决jdbc的缺点

MyBtis能做什么

  1. 注册驱动
  2. 创建jdbc中使用的Connection,Statement,ResultSet
  3. 执行sql语句,得到ResultSet
  4. 处理ResultSet,把记录集中的数据转为java对象,同时能把java对象放入到List集合中
  5. 关闭资源
  6. 实现sql语句和java代码的解耦合

官网:https://mybatis.org/mybatis-3/zh/index.html

第二章 Mybatis入门 2.1第一个例子

实现步骤:

  1. 创建student表(id,name,email,age)

  2. 创建maven项目

  3. 修改pom.xml

    1) 加入mybatis依赖

        
          org.mybatis
          mybatis
          3.5.1
        
    

    2) 再标签中加入资源插件

    
        
          
            src/main/java/
            
              ***.properties
            
            false
          
        
      
    
  4. 创建实体类Student,定义属性,属性名和列名一致

  5. 创建Dao接口,定义操作数据库的方法

  6. 创建xml文件(mapper文件),写sql语句

    mybatis框架推荐按使用是把sql语句和java代码分开

    mapper文件:定义和dao接口再同一目录,一个表一个mapper文件

    
    
    
        
        select * from Blog where id = #{id}
      
    
    
        select id ,name,email,age from student where email=#{email};
    
    3.2.3 dao接口方法有多个简单类型参数

    @Param:命名参数。在方法形参前使用,定义参数名。这个名称可以用在mapper中

    dao接口方法定义:

        select id,name,email,age from student where name=#{name}
    
    3.25 复杂的获取属性值语法:

    #{property,javaType=java中数据类型名,jdbcType=数据类型名称(数据库中的类型)}

    select id,name,email,age from student where name=#{arg0},age=#{arg1}
    
    3.2.6 dao接口参数是map(了解)
    List selectStudentByMap(Map map);
    

    mapper文件

        select id,name,email,age from student where id=#{id}mybatis创建出PreparedStatement对象,执行sql语句String sql="select id,name,email,age from student where id=?";PreparedStatement psy=conn.prepareStatement(sql);pst.setInt(1,1001);//传递参数ResultSet rs=pst.excuteQuery();//执行sql语句
    

    #{}特点:

    1. 使用的PreparedStatement对象,执行SQL语句,效率高
    2. 使用的PreparedStatement对象,能避免sql注入,sql语句执行更安全
    3. #{}常常作为列值使用,位于等号的右侧,#{}位置的值和数据类型有关
    2 $占位符

    语法:${字符}

    mybatis执行${}占位符的sql语句

        select id,name,email,age from student where id=${studentId}${}表示字符串连接,把sql语句的其他内容和${}内容使用字符串连接的方式连在一起String sql="select id,name,email,age from student where id="+"1001";mybatis创建的是Statement对象,执行sql语句Statement stmt=conn.createStatement(sql);ResultSet rs=stmt.excuteQuery();//执行sql语句
    

    ${}特点

    1. 使用Statement对象,执行sql语句,效率低
    2. ${}占位符的值,使用的是字符串拼接,有sql注入危险,有代码安全问题
    3. ${}数据是原样使用的,不会区分数据类型
    4. 常 用 在 表 名 或 列 明 , 在 保 证 数 据 安 全 的 前 提 下 使 用 {}常用在表名或列明,在保证数据安全的前提下使用 常用在表名或列明,在保证数据安全的前提下使用{}

    使用大体与#{}类似;

    注意:

    1. dao接口简单参数必须使用@Param()
    2. ${}数据是原样使用的;若传入参数为“lisi”,

    select id,name,email,age from student where id=${studentname}

    则执行sql语句:

    select id,name,email,age from student where id=lisi

    而不是

    select id,name,email,age from student where id=‘lisi’

    1. 同样,按列名排序使用${}而不使用#{};

      select id,name,email,age from student orderby ${param}(param变量,可从方法参数传入以实现按不同列排序)

    3.3 封装MyBatis输出结果

    封装输出结果:MyBatis执行sql语句后,得到ResultSet,转为java对象。

    有两个:resultType,resultMap

    3.3.1 resultType

    resultType属性:在执行select时使用,作为标签的属性出现的

    result Type:表示结果类型,mysql执行sql语句,得到java对象的类型,它的值有两种:

    1. java的全限定名称
    2. 使用别名

    1)resultType表示java自定义对象

        select count(*) from student
    

    3)resultType表示map结构

    dao接口

    Map selectMap(Integer id);
    

    mapper文件

            select id,name,email,age from student where id=#{stuid};    
    
3.5 使用别名

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

自定义别名的步骤:

  1. 在MyBatis的主配置文件,使用typeAliase标签声明别名

  2. 在mapper文件中,resultType=“别名”

    第一种方式

            
    
    select id,name,email,age from student where id=#{studentId};

建议使用全限定名称,可读性好。

3.6 列名与java对象属性名称不一样解决方式
  1. 使用resultMap:自定义列名和属性名称对应关系
  2. 使用resultType:使用列的别名,使列的别名与对象属性名相同。
3.7 like模糊查询

第一种方式:在java程序中,把like的内容组装好,把这个内容传入到sql语句

dao

//模糊查询第一种方式List selectLikeOne(@Param("name") String name);

mapper

        select id,name,email,age from student where name like "%" #{name1} "%"    

Test

@Testpublic void testSelectLikeTwo(){    SqlSession sqlSession=MyBatisUtil.getSqlSession();    StudentDao dao=sqlSession.getMapper(StudentDao.class);    String name="李";    List stus=dao.selectLikeTwo(name);    for(Student s:stus){        System.out.println(s);    }    sqlSession.close();}
第四章 动态sql

什么是动态sql:同一个dao的方法,跟进不同的条件可以表示不同的sql语句,主要是where部分变化

使用mybatis提供的标签,实现动态sql,主要学习if,where,foreach,sql。

使用动态sql时dao方法的形参要使用java对象

4.1 if

语法:可以有多个if,没有else

主要用于多条件查询。

sql代码sql代码sql代码在mapper文件中     select * from student                      or name=#{name}                        or age  <#{age }            

测试

@Testpublic void testSelectWhere(){    SqlSession sqlSession=MyBatisUtil.getSqlSession();    StudentDao dao=sqlSession.getMapper(StudentDao.class);    Student stu=new Student(1006,"李广","wangwu@qq.com",45);    List list=dao.selectWhere(stu);    for(Student s:list){        System.out.println(s);    }    sqlSession.close();}
4.3 foreach循环

手动实现sql语句

@Testpublic void testFor(){    List idList=new ArrayList<>();    idList.add(1001);    idList.add(1002);    idList.add(1003);    //查询id在idlist中的student    //select * from student where id in(1001,1002,1003)    StringBuffer sql=new StringBuffer();    sql.append("select * from student where id in ");    sql.append("(");    //使用循环,把List数据追加到sql中    for(int i=0;i 

使用foreah可以循环数组,list集合,一般使用在in语句中

语法:

    #{item的值}标签属性:collection:表示循环的对象 是数组 还是List集合。如果dao接口方法参数 是数组,collection="array",如果是List,collection="list"open:循环开始的字符 sql.append("(");close:循环结束时的字符 sql.setCharAt(sql.length()-1,')');item:集合成员,自定义的变量separator:集合成员间的分隔符 如','#{item}:获取item的值

List集合存放简单类型数据:

dao:

List selectForeach1(List idlist);

mapper文件


test

@Testpublic void selectStudentSqlFragment(){    SqlSession sqlSession=MyBatisUtil.getSqlSession();    StudentDao dao=sqlSession.getMapper(StudentDao.class);    List idList=new ArrayList<>();    Student s1=new Student();    Student s2=new Student();    s1.setId(1001);    s2.setId(1002);    idList.add(s1);    idList.add(s2);    List list= dao.selectStudentSqlFragment(idList);    for(Student s:list){        System.out.println(s);    }    sqlSession.close();}
第五章 MyBatis配置文件

MyBatis配置文件有两大类:

  1. 主配置文件,提供Mybatis全局设置的.包含的内容有 日志,数据源,mapper文件位置等
  2. mapper文件:写sql语句的.一个表一个mapper文件
5.1 settings部分

settings是mybatis的全局设置,影响整个mybatis的运行.这个设置一般用默认值就行.

完整的settings

                              
5.2 typeAlias

设置别名,可用可不用

                
5.3 配置环境

enviroments:环境标签,里面那可以配置多个enviroment

  • enviroment:表示一个数据库的连接信息
    • 属性id 自定义的环境标识.唯一值
    • 属性default必须是某个enviroment的id属性值,表示mybatis默认连接数据库.
    • transactionManager:事务管理器
      • type:标识事务管理器类型
        属性值:1)JDBC:使用Connection对象,由mybatis自己完成事务处理
        2)MANAGED:管理,表示把事务交给容器实现(由其他软件完成事务的提交回滚)
    • dataSource: 数据源,创建Cennection对象,连接数据库
      • type属性:表示数据源的类型;
        • 属性值:1.POOLED表示mybatis会在内存中创建PooledDataSource类,管理多个Connection对象,使用的连接池
        • 2.UNPOOLED,不使用连接池,mybatis创建一个UnPooledDataSource类,每次执行sql语句先创建Connection对象,再执行sql语句,最后关闭Connection(基本不用)
        • 3.JDNI:java的命名和目录服务.
                                                                                                                                                                                  
5.4 使用数据库配置文件(掌握)

需要把把数据库的配置信息放到一个单独文件中,独立管理,这个文件扩展名是properties.在这个文件中使用自定义的key=value的格式表示数据

使用步骤:

  1. 在resource目录中,创建xxx.properties文件

  2. 在文件和中使用key=vaule的格式定义数据

    例如:jdbc.url=jdbc:mysql://localhost:3306/springdb

  3. 在mybatis主配置文件,使用properties标签引用外部的属性配置文件

  4. 在使用值得位置,使用${key}获取key对应的value(等号的右侧)

properties文件

jdbc.driver=com.mysql.cj.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMTjdbc.username=rootjdbc.password=root123456

主配置文件

                                                                                                                                                                                                                
5.5 mapper 标签

使用mapper指定其他文件的位置

mapper标签使用格式:有两种常用方式

  1. 第一种方式: resources=“mapper文件路径”;

    优点:文件清晰,加载哪个文件一目了然,文件的位置灵活;

    缺点:文件较多时代码量比较大,管理难度大

  2. 第二种方式:name=“包名”. mapper文件所在的包名

    特点:将该包中的所有所有mapper文件一次加载.

    使用要求:mapper文件和dao接口在同一目录,且与dao接口名称完全一致.


第六章 PageHelper

PageHelper做数据分页.在你的select语句后面加入分页的sql内容.如果你使用的mysql数据库,它就是在select* from student 后加上limit语句

使用步骤

  1. 加入pagehelper依赖

      com.github.pagehelper  pagehelper  5.1.10
    
  2. 在mybatis主配置未见加入plugin声明

                                                                                                                                            
    
  3. 在select语句之前,调用PageHelper.startPage(页码,每页大小)(页码从1开始)

测试使用:

@Testpublic void testPageHelper(){    SqlSession sqlSession=MyBatisUtil.getSqlSession();    StudentDao dao=sqlSession.getMapper(StudentDao.class);    List idList=new ArrayList<>();    PageHelper.startPage(2,3);    List list= dao.selectAllStudent();    for(Student s:list){        System.out.println(s);    }    sqlSession.close();}

控制台输出结果:

Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@8297b3a]==>  Preparing: SELECT count(0) FROM student ==> Parameters: <==    Columns: count(0)<==        Row: 7<==      Total: 1==>  Preparing: select * from student order by id LIMIT ?, ? ==> Parameters: 3(Integer), 3(Integer)<==    Columns: id, name, email, age<==        Row: 1004, 公明, gongming@qq.com, 47<==        Row: 1005, 李广, liguang@qq.com, 20<==        Row: 1006, 武松, wusong@qq.com, 38<==      Total: 3Student{id=1004, name='公明', email='gongming@qq.com', age=47}Student{id=1005, name='李广', email='liguang@qq.com', age=20}Student{id=1006, name='武松', email='wusong@qq.com', age=38}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/322824.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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