zoukankan      html  css  js  c++  java
  • MyBatis

    MyBatis

    第一章

    1. 三层架构

    • 界面层:和用户打交道的,接收用户的请求参数, 显示处理结果的。(JSP、HTML、Servlet)

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

    • 数据访问层:就是访问数据库,执行对数据的查询,修改,删除等等的。

     

    三层对应的包

    • 界面层:controller包(servlet)

    • 业务逻辑层:service包(XXXService类)

    • 数据访问层:dao包(XXXDao类)

     

    三层中类的交互

    用户使用界面层 ——> 业务逻辑层 ——> 数据访问层(持久层) ——> 数据库(MySQL)

     

    三层中对应的处理框架

    • 界面层 —— Servlet —— SpringMVC(框架)

    • 业务逻辑层 —— Service类 —— Spring(框架)

    • 数据访问层 —— dao类 —— MyBatis(框架)

    2. 框架

    框架是一个舞台,一个模板

     

    模板:

    1)规定好了一些条款,内容。

    2)加入自己的东西

     

    框架是一个模块

    1)框架中定义好了一些功能,这些功能是可用的。

    2)可以加入项目中自己的功能,这些功能可以利用框架中写好的功能。

     

    框架是一个软件,半成品的软件,定义好了一些基础功能,需要加入你的功能就是完整的。

    基础功能是可重复使用的,可升级的。

     

    框架特点:

    1)框架一般不是全能的,不能做所有的事情

    2)框架是针对某一个领域有效。特长在某一个方面,比如mybatis做数据库操作强,但是他也不能做其他的。

    4)框架是一个软件

     

    3. mybatis框架

    一个框架,早期叫做ibatis,代码在GitHub。

    mybatis是MyBatis SQL Mapper Framework for Java(sql映射框架)

    1)sql mapper : sql映射

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

    一行数据可以看做事一个Java对象。操作这个对象,就相当于操作表中的数据

    2)Data Access Objects(DAOs):数据访问,对数据库执行增删改查。

     

    4. mybatis提供了哪些功能

    1)提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这些对象了

    2)提供了执行sql语句的能力,不用你执行sql

    3)提供了循环sql,把sql的结果转为Java对象,List集合的能力

     while(rs.next()){
         Student stu = new Student();
         stu.setId(rs.getInt("id"));
         stu.setName(rs.getString("name"));
         stu.setAge(rs.getInt("age"));
         //从数据库取出数据转为Student对象,封装到List集合
         stuList.add(stu);
     }

    4)提供了关闭资源的能力,不用你关闭Connection,Statement,ResultSet

     

    开发人员做的是:提供sql语句

    最后是:开发人员提供sql语句---mybatis处理sql---开发人员得到List集合或Java对象(表中的数据)

     

    5. 总结

    mybatis是一个sql映射框架,提供的数据库操作能力。增强的JDBC,使用mybatis让开发人员集中精神写sql就可以,不必关心 Connection,Statement,ResultSet 的创建,销毁,sql的执行。

     

    第二章

    1. 主要类的介绍

    1)Resouces:mybatis中的一个类,负责读取主配置文件

     InputStream in = Resources.getResourceAsStream("mybatis-config.xml");

    2)SqlSessionFactoryBuilder:创建SqlSessionFactory对象

     SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
     //创建SqlSessionFactory对象
     SqlSessionFactory factory = builder.build(in);

    3)SqlSessionFactory:重量级对象,程序创建一个对象耗时比较长,使用资源比较多。

    在整个项目中,有一个就够用了。

    SqlSessionFactory:接口,接口实现类:DefaultSqlSessionFactory

    SqlSessionFactory作用:获取SqlSession对象。

     SqlSession sqlSession = factory.openSession();

    openSession()方法说明

    • openSession():无参数的,获取是非自动提交事务的SqlSession对象

    • openSession(boolean):openSession(true)获取自动提交事务的SqlSession

      openSession(false)非自动提交事务的SqlSession对象

    4)SqlSession:

    SqlSession接口:定义了操作数据的方法

    例如:selectOne(),selectList(),insert(),update(),delete(),commit(),rollback()

    SqlSession接口的实现类DefaultSqlSession

    使用要求:

    SqlSession对象不是线程安全的,需要在方法内部使用,在执行sql语句之前,使用openSession()获取SqlSession对象。

    在执行完sql语句后,需要关闭它,执行SqlSession。close()。这样能保证他的使用是线程安全的。

     

    第三章

    1. 动态代理:

    使用SqlSession.getMapper(dao接口.lass)获取这个dao接口的对象

    2. 传入参数:

    从Java代码中把数据传入到mapper文件的sql语句中。

    1)parameterType:写在mapper文件中的一个属性,表示dao接口中方法的参数的数据类型

    例如 StudentDao接口

    public Student selectStudentById(Integer id)

    2)一个简单类型的参数:

    简单类型:mybatis把Java的基本数据类型和String都叫简单类型。

    在mapper文件获取简单类型的一个参数的值,使用#{任意字符}

    接口:public Student selectStudentById(Integer id)

    mapper:select id,name,email,age from student where id = #{StudentId}

    3)多个参数,使用@Param命名参数

    接口:

     public List<Student> selectMulitParam(@Param("myname") String name, @Param("myage") Integer age)

    使用@Param("参数名") String name

    mapper文件:

     <select>
        select * from student where name = #{myname} or age = #{myage}
     </select>

    4)多个参数,使用Java对象————语法:#{属性名}

    vo:view object,从servlet把数据返回给浏览器使用的类,表示显示结果的类

    pojo:普通的有set,get方法的Java类。普通的Java对象

    Servlet ——— StudentService(addStudent(MyParam param))

    entity(domain域):实体类,和数据库中的表对应的类

    5)# 和 $

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

    #的结果:select id,name, email,age from student where id = ?

    使用 PrepareStatement 对象执行 sql 语句, #{…}代替 sql 语句的“?”,更安全,更迅速。

     

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

    $的结果:select id,name, email,age from student where id = 1001

    使用 Statement 把 sql 语句和${}的 内容连接起来。主要用在替换表名,列名,不同列排序等操作。

     

    String sql="select id,name, email,age from student where id=" + "1001"; 使用的Statement对象执行sql, 效率比PreparedStatement低。

    $:可以替换表名或者列名,你能确定数据是安全的。可以使用

     

    # 和 $ 的区别

    • #使用 ?在sql语句中做占位的,使用PrepareStatement执行sql,效率高

    • #能够避免sql注入,更安全。

    • $不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率第

    • $有sql注入的风险,缺乏安全性。

    • $可以替换表名或列名

     

    3. mybatis的输出结果

    mybatis执行了sql语句,得到Java对象。

    1)resultType结果类型, 指sql语句执行完毕后, 数据转为的java对象, java类型是任意的。

    resultType结果类型的值:

    • 类型的全限定名称

    • 类型的别名

      例如 :java.lang.Integer别名是int

    处理方式:

    • mybatis执行sql语句, 然后mybatis调用类的无参数构造方法,创建对象。

    • mybatis把ResultSet指定列值付给同名的属性。

     <select id="selectMultiPosition" resultType="com.bjpowernode.domain.Student">
            select id,name, email,age from student
     </select>

    对等的jdbc

     while(rs.next()){
      Student  student = new Student();
      student.setId(rs.getInt("id"));
      student.setName(rs.getString("name"));
     }

     

    2)定义自定义类型的别名

    • 在mybatis主配置文件中定义,使<typeAlias>定义别名

    • 可以在resultType中使用自定义别名

     <typeAliases>
      <!--
      定义单个类型的别名
      type:类型的全限定名称
      alias:自定义别名
      -->
      <typeAlias type="com.bjpowernode.domain.Student" alias="mystudent"/>
      <!--
      批量定义别名,扫描整个包下的类,别名为类名(首字母大写或小写都可以)
      name:包名
      -->
      <package name="com.bjpowernode.domain"/>
      <package name="...其他包"/>
     </typeAliases>

     

     

    3)resultMap:结果映射, 指定列名和java对象的属性对应关系。

    • 你自定义列值赋值给哪个属性

    • 当你的列名和属性名不一样时,一定使用resultMap

     <!-- 创建 resultMap
      id:自定义的唯一名称,在<select>使用
      type:期望转为的 java 对象的全限定名称或别名
     -->
     <resultMap id="studentMap" type="com.bjpowernode.domain.Student">
      <!-- 主键字段使用 id -->
      <id column="id" property="id" />
      <!--非主键字段使用 result-->
      <result column="name" property="name"/>
      <result column="email" property="email" />
      <result column="age" property="age" />
     </resultMap>
     <!--resultMap: resultMap 标签中的 id 属性值-->
     <select id="selectUseResultMap" resultMap="studentMap">
      select id,name,email,age from student where name=#{queryName} or
     age=#{queryAge}
     </select>

     

    resultMap和resultType不要一起用,二选一

     

    第四章

    动态sql:sql的内容是变化的,可以根据条件获取到不同的sql语句。

    主要是where部分发生变化。

    动态sql的实现,使用的是mybatis提供的标签, <if> ,<where>,<foreach>

    1. <if>

    <if>是判断条件的

    语法:

     <if test="判断java对象的属性值">
        部分sql语句
     if>

    2. <where>

    <where>用来包含 多个<if>的, 当多个if有一个成立的, <where>会自动增加一个where关键字,并去掉 if中多余的 andor等。

    3. <foreach>

    <foreach> 循环java中的数组,list集合的。 主要用在sql的in语句中。 学生id是 1001,1002,1003的三个学生

      select * from student where id in (1001,1002,1003)
     public List<Student> selectFor(List<Integer> idlist)
     
      List<Integer> list = new ...
      list.add(1001);
      list.add(1002);
      list.add(1003);
     
      dao.selectFor(list)
     <foreach collection="" item="" open="" close="" separator="">
      #{xxx}
     </foreach>

     

    collection:表示接口中的方法参数的类型, 如果是数组使用array , 如果是list集合使用list item:自定义的,表示数组和集合成员的变量 open:循环开始是的字符 close:循环结束时的字符 separator:集合成员之间的分隔符

    4. sql代码片段,就是复用一些语法

    步骤 1)先定义 <sql id="自定义名称唯一"> sql语句, 表名,字段等 </sql> 2)再使用<include refid="id的值" />

     <!--定义sql片段-->
     <sql id="studentSqlOne">
      id,name, age, email
     </sql>
     <select id="selectStudentIf" resultType="com.bjpowernode.domain.Student">
      select <include refid="studentSqlOne" /> from student
     </select>

     

    第五章

    1. 数据库的属性配置文件:

    把数据库连接信息放到一个单独的文件中。 和mybatis主配置文件分开。 目的是便于修改,保存,处理多个数据库的信息。

    1)在resources目录中定义一个属性配置文件, xxxx.properties ,例如 jdbc.properties

    在属性配置文件中, 定义数据,格式是 key=value

    key: 一般使用 . 做多级目录的。

    例如:jdbc.mysql.driver ,jdbc.driver, mydriver

     jdbc.driver=com.mysql.jdbc.Driver
     jdbc.url=jdbc:mysql//.....
     jdbc.username=root
     jdbc.password=123456

     

    2)在mybatis的主配置文件,使用<property> 指定文件的位置,在需要使用值的地方:${key}

    2. mapper文件

    使用package指定路径

     <mappers>
      <!--
      name: xml文件(mapper文件)所在的包名, 这个包中所有xml文件一次都能加载给mybatis
      使用package的要求:
      1. mapper文件名称需要和接口名称一样, 区分大小写的一样
      2. mapper文件和dao接口需要在同一目录
      -->
      <package name="com.bjpowernode.dao"/>
     </mappers>

    第六章:PageHelper

    PageHelper做数据分页的。

    1. 功能

    实现多种数据库的分页,MySQL就是替代limit语句的

    2. 使用步骤

    1)加入maven依赖

     <dependency>
      <groupId>com.github.pagehelper</groupId>
         <artifactId>pagehelper</artifactId>
         <version>5.1.10</version>
     </dependency>

    2)在mybatis主配置文件,加入plugin

     <plugins>
      <plugin interceptor="com.github.pagehelper.PageInterceptor" />
     </plugins>

    3)在你的查询方法之前,加入PageHelper方法调用

     @Test
     public void testSelect() throws IOException {
      //获取第 1 页,3 条内容
      PageHelper.startPage(1,3);
      List<Student> studentList = studentDao.selectStudents();
      studentList.forEach( stu -> System.out.println(stu));
     }

     

     

  • 相关阅读:
    <自动化测试>之<使用unittest Python测试框架进行参数化测试>
    <自动化测试>之<unittest框架使用1>
    <自动化测试>之<selenium API 查找元素操作底层方法>
    <自动化测试>之<selenium API 用法2>
    <自动化测试>之<Selenium API 的用法1>
    <Jmeter入门不放弃>之<3.两种常见录制脚本的方法>
    <Jmeter入门不放弃>之<2.常用功能>
    <Jmeter入门不放弃>之<1.认识jmeter>
    <自动化测试>之<SeleniumIDE使用详解 >
    sql 注入get与post模式语句
  • 原文地址:https://www.cnblogs.com/WKPCTO/p/13844009.html
Copyright © 2011-2022 走看看