MyBatis 框架

MyBatis 框架文章浏览阅读691次。mybatis基础_mybatispom

目录

一、MyBatis介绍

(一)、MyBatis主要提供的一些服务

(二)、MyBatis框架开发环境搭建

1、将依赖的jar包,引入pom.xml文件中

2、 创建resources文件夹(存在静态文件的地方),创建项目中MyBatis的核心文件、已经对应操作实例类的文件

3、通过MyBatis操作数据库 

 (三)核心类库以及MyBatis内部流程

(四)、parameterType属性 

 1、基本数据类型

 2、实体类数据类型

 3、Map数据类型

 (五)、resultType属性

 (六)、为实体类的全限定名设置一个简短别名

1、针对单个实体类设置别名( 不推荐)

2、针对整个实体包(存放所有实体类的包)进行设置,别名为实体类首字母小写的名称 (推荐)

 (七)、设置控制台打印日志信息

二、Dao代理服务

(一)、Dao代理服务介绍

 (二)、获取Dao层代理步骤

1、Sql映射文件名称必须和Dao层接口名称完全相同        

2、Sql映射文件必须要和 Dao层接口在同一个文件夹下

3、Sql映射文件的namespace属性的值必须是对应的Dao

4、Sql映射文件中的Sql 语句的ID编号必须与Dao接口中的方法名相同

5、写个测试类测试一下

 三、动态SQL服务

(一)、介绍

(二)、动态 SQL 之标签

 (二)、动态 SQL 之

   (三)、动态 SQL 之

  (四)、动态 SQL 之代码片段

 四、多表查询

(一)、多表查询介绍

(二)、mybaits 进行多表查询

1、一对一查询

2、一对多

3、多对一 

4、多对多 


一、MyBatis介绍

        MyBatis 是一个优秀的基于 java 的持久层框架,内部封装了 jdbc,开发者只需要关注 sql 语句 本身,而不需要处理加载驱动、创建连接、创建 statement、关闭连接,资源等繁杂的过程。         MyBatis 通过 xml 或注解两种方式将要执行的各种 sql 语句配置起来,并通过 java 对象和 sql 的 动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。

(一)、MyBatis主要提供的一些服务

1、封装了JDBC的流程,比如注册驱动、获取con、pre等对象,关闭对象等流程,降低了开发人员使用JDBC的难度;

2、封装了JDBC占位符赋值操作,避免预编译后进行占位符赋值的操作;

3、封装了JDBC中将ResultSet转换成了实体类的操作;

4、提供了Dao代理服务,降低了进行Dao层的开发难度;

(二)、MyBatis框架开发环境搭建

1、将依赖的jar包,引入pom.xml文件中

MyBatis 框架

2、 创建resources文件夹(存在静态文件的地方),创建项目中MyBatis的核心文件、已经对应操作实例类的文件

MyBatis 框架

MyBatis核心文件模板,只需要修改对应的信息

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--
       1.设置访问的数据库信息(url,username,password)
       2.设置Connection管理方式
       3.设置事务管理方式
    -->
    <!-- 配置 mybatis 环境 -->
    <environments default="mysql">
    <!--id: 数据源的名称 -->
    <environment id="mysql">
    <!-- 配置事务类型:使用 JDBC 事务(使用 Connection 的提交和回滚) -->
      <transactionManager type="JDBC"/>
    <!-- 数据源 dataSource :创建数据库 Connection 对象
    type: POOLED 使用数据库的连接池
    -->
        <dataSource type="POOLED">
            <!-- 连接数据库的四个要素 -->
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/s_t"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </dataSource>
    </environment>
    </environments>

    <!--设置sql映射文件,在项目中存储位置-->
    <mappers>
        <mapper resource="student.xml"/>
    </mappers>

</configuration>

1)SQL映射文件: 是xml文件。一个SQL映射文件中存储一张表的增删改查语句。
2)mybatis核心配置文件:
                                  提供连接数据库的三要素
                                  提供数据库连接池管理方案
                                  提供SQL映射文件存储位置 

实例的操作文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
 namespace:必须有值,自定义的唯一字符串
 推荐使用:dao 接口的全限定名称
-->
<mapper namespace="com.bjpowernode.dao.StudentDao">
    <!--
    <select>: 查询数据, 标签中必须是 select 语句
    id: sql 语句的自定义名称,推荐使用 dao 接口中方法名称,
    使用名称表示要执行的 sql 语句
    resultType: 查询语句的返回结果数据类型,使用全限定类名
    -->
<!--    <select id="selectStudents" resultType="com.bjpowernode.domain.Student">-->
<!--        &lt;!&ndash;要执行的 sql 语句&ndash;&gt;-->
<!--        select id,name,email,age from student-->
<!--    </select>-->
    <insert id="insertStu">
        insert into student(name,age,address) value ('zs',19, 'newYork')
    </insert>

    <update id="stuUpdate">
        update student set age=25, address = 'yellowCity' where name ='zs'
    </update>

    <delete id="stuDelete">
        delete from student where id = '1'
    </delete>
</mapper>

3、通过MyBatis操作数据库 

直接提交

MyBatis 框架

手动提交 

MyBatis 框架

 (三)核心类库以及MyBatis内部流程

  • SqlSession接口和实现类
  • SqlSessionFactory接口和实现类
  • SqlSessionFactoryBuilder类

MyBatis 框架

(四)、parameterType属性 

        1.parameterType属性存在与<insert><update><delete><select> 

        2.parameterType属性表示当前sql语句中占位符需要的数据类型

        3.parameterType属性赋值可以【基本数据类型】,【实体类数据类型】、【Map

 1、基本数据类型

MyBatis 框架

MyBatis 框架

 2、实体类数据类型

MyBatis 框架

MyBatis 框架

 3、Map数据类型

MyBatis 框架 MyBatis 框架

 (五)、resultType属性

1)、resultType,仅仅存在的<select>标签内,定义查询到数据的格式,不能省略;
2)、resultType,既可以是基本数据类型,也可以是实体数据类型;
3)、resultType属性是基本数据类型,说明本次查询只返回一个值
4)、resultType是实体数据类型,此时MyBatis要求将临时表中数据行的内容转换成实例类对象存储,
此时要求临时表的字段名称与实体类的属性名相同,但是可以忽略大小写

MyBatis 框架

 MyBatis 框架

 (六)、为实体类的全限定名设置一个简短别名

        我们实例类的sql映射文件中,使用resultType或者parameterType都需要使用实体类对应的路径,我们给实体类起一个别名后,以后只需要使用别名即可。设置别名需要在MyBatis全局配置文件中,进行设置,有两种方式设置;

1、针对单个实体类设置别名( 不推荐)

    <typeAliases>
        <!--  针对与单个实体类起别名,实体类映射文件中直接使用别名。      -->
          <typeAlias type="com.zxb.entity.Student" alias="student"/>
    </typeAliases>

MyBatis 框架

 别名可以起任何名字,最好还是和实体类名称相同,这样容易辨认;

2、针对整个实体包(存放所有实体类的包)进行设置,别名为实体类首字母小写的名称 (推荐)

    <typeAliases>
        <!--别名是类名首字母小写形式-->
        <package name="com.zxb.entity"/>
    </typeAliases>

MyBatis 框架

MyBatis 框架

 (七)、设置控制台打印日志信息

        在MyBatis.xml文件configuration 标签下设置下面标签即可;

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>

 MyBatis 框架

MyBatis 框架

二、Dao代理服务

(一)、Dao代理服务介绍

        1、项目开发中,开发人员只需要开发【Dao】层接口,以及关联的【Sql】即可

        2、由MyBatis框架负责在【在内存中创建Dao层接口的实现类】并且负责创建这些【Dao层实现类】的实例化对象

 (二)、获取Dao层代理步骤

1、Sql映射文件名称必须和Dao层接口名称完全相同        

         例如:IStudent、IStudent.xml

2、Sql映射文件必须要和 Dao层接口在同一个文件夹下

 MyBatis 框架

3、Sql映射文件的namespace属性的值必须是对应的Dao

MyBatis 框架

4、Sql映射文件中的Sql 语句的ID编号必须与Dao接口中的方法名相同

MyBatis 框架

 MyBatis 框架

5、写个测试类测试一下

MyBatis 框架 运行:报错提示没有找到student.xml文件

### The error may exist in student.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource student.xml

MyBatis 框架

 原因:因为Maven编译不会将非resoures文件夹下的非java文件进行,从下图可以看出,编译后的classes文件夹下Dao文件夹下没有student.xml文件。

MyBatis 框架

 解决办法:在pom文件中添加下面的插件

    <!-- 解决maven编译的时候,不将非java文件进行编译   -->
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目录-->
        <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>

MyBatis 框架

 添加完了,再次运行测试方法:报错

org.apache.ibatis.binding.BindingException: Type interface com.zxb.Dao.IStudent is not known to the MapperRegistry.

MyBatis 框架

 原因:MyBatis框架扫描指定包下所有的Sql文件,MyBatis会找到同一个包下与Sql映射文件同名的接口,并会认为这个接口就是Dao接口,我们需要在MyBatis的配置文件中,告诉 MyBatis那个是Dao接口,如果不指定的话,就会抛出上面的异常;

MyBatis 框架

 再次运行,正常,查询出结果了

MyBatis 框架

 三、动态SQL服务

(一)、介绍

        根据实际传入的数据决定Sql语句组成部分

(二)、动态 SQL 之<if>标签

        对于该标签的执行,当 test 的值为 true 时,会将其包含的 SQL 片断拼接到其所在的 SQL 语句中。 语法: sql 语句的部分

MyBatis 框架

MyBatis 框架

 (二)、动态 SQL 之<where>

         <where>标签的中存在一个比较麻烦的地方:需要在 where 后手工添加 1=1 的子句。因为,若 where 后 的所有条件均为 false,而 where 后若又没有 1=1 子句,则 SQL 中就会只剩下一个空的 where,SQL 出错。所以,在 where 后,需要添加永为真子句 1=1,以防止这种情况的发生。但当数据量很大时,会 严重影响查询效率。

         使用标签,在有查询条件时,可以自动添加上 where 子句;没有查询条件时,不会添加 where 子句。需要注意的是,第一个标签中的 SQL 片断,可以不包含 and。不过,写上 and 也不错, 系统会将多出的 and 去掉。但其它中 SQL 片断的 and,必须要求写上。否则 SQL 语句将拼接出错 。 语法: 其他动态 sql

MyBatis 框架

MyBatis 框架 MyBatis 框架

   (三)、动态 SQL 之 <foreach>

         <foreach>标签用于实现对于数组与集合的遍历。对其使用,需要注意: ➢ collection 表示要遍历的集合类型, list ,array 等。 ➢ open、close、separator 为对遍历内容的 SQL 拼接。

        MyBatis 框架

MyBatis 框架

 其余foreach参数等使用见此博客:mybatis总结–动态sql之foreach标签 – Town125 – 博客园

(四)、动态 SQL 之代码片段<include>

       <include> 标签用于定义 SQL 片断,以便其它 SQL 标签复用。而其它标签使用该 SQL 片断,需要使用 子标签。该标签可以定义 SQL 语句中的任何部分,所以子标签可以放在动态 SQL 的任何位置。 

MyBatis 框架 MyBatis 框架

 四、多表查询

(一)、多表查询介绍

        数据库表与表之间进行关联很常见,常见有:一对一、一对多、多对一、多对多

一对一:例如:学生表与身份证信息存储表,就是一对一的关系,因为一个人就只有一个身份证,一个身份证号就属于一个人;

一对多:例如:部门表和员工表,一个部门下面有多个员工;

多对一:多对一其实和一对多相反,只要区别看以谁为主表。例如:员工表和部门表,多个员工都是在一个部门下;

多对多:多对多,要依赖第三张表,主要存储两张表直接的关系。例如:学生表和课程表,一个学生可以选择多个课程,一个课程也可以被多个学生选择,这个就是典型的多对多关系;

(二)、mybaits 进行多表查询

1、一对一查询

:创建一个学生表,一个身份证表

MyBatis 框架

MyBatis 框架

实体类

学生类:可以看出我定义idCardId属性,这个对应我们student表中的idCardId列,我下面又定义一个IdCard类型idCard对象,定义的原因就是通过关联关系查询到IdCard表中的信息,将它存储到idCard对象中

MyBatis 框架

身份证实体类

MyBatis 框架

 定义dao层接口

MyBatis 框架

 Sql映射文件

MyBatis 框架

 我们发现,select标签中 需要添加一个resultMap属性,resultMap属性表示你可以自定义查询数据的映射关系;

<resultMap属性>      id:表示查询数据映射关系的唯一标识   type: 表示主表的实体类

<result>    column:表示查询语句,查询的数据列名称; property: 表示对应实体类的属性名称

<association> 一对一,多对一时候使用。 property: 表示对应实体类的属性名称 javaType:表示对应属性的类型

MyBatis 框架

测试类

MyBatis 框架 MyBatis 框架

2、一对多

:学生表 和 部门表 (一个部门下面有多个学生)

MyBatis 框架

MyBatis 框架

 实体类

部门类

MyBatis 框架

因为一个部门下可能有多个学生,因此我们需要定一个List属性,来接收查到的所有学生信息; 

 学生类MyBatis 框架

 dao层服务

MyBatis 框架

 Sql映射文件

MyBatis 框架

 <collection>一对多、多对多,类型是集合使用。property属性名称,ofType list里面存储对象的数据类型

MyBatis 框架

测试类 

MyBatis 框架

MyBatis 框架

3、多对一 

         表:学生表 和 部门表 

MyBatis 框架

 MyBatis 框架

 实体类

学生实体

MyBatis 框架

        我们可以理解,一个学生只会属于一个部门,其实多对一和一对一是一样的; 

部门实体类 

MyBatis 框架

 Sql映射文件

MyBatis 框架

测试类

MyBatis 框架

MyBatis 框架

4、多对多 

:学生表 和 课程表 和中间表(存储学生和课程之间的关系)

 MyBatis 框架

 MyBatis 框架

实体类 

学生实体类

MyBatis 框架

         一个学生可能选择多个课程,因此需要通过List接收每个课程对象,由此可以看出,多对多和一对多一样;

课程实体类

MyBatis 框架

 Sql映射文件

MyBatis 框架

         可以发现我们查出了课程的id和name并且给它们两个起了别名,我们为什么要起别名呢?

如果不起别名会有什么效果呢?

MyBatis 框架

因为courses表中列名称也是id和name, student表列名称也有id和name,我们在ResultMap里面定义student的id和name的映射关系,在collection里面定义courses表的映射关系,如果我们定义的时候没有使用别名,依然使用id映射id,name映射name,mybatis查询到数据后,会将courses表的中id和name覆盖成student表的id和name

MyBatis 框架 MyBatis 框架

 我们发现就是出现了覆盖,我们本来查询课程id和课程名称,但是被学生id和name给覆盖

 下面使用别名可以解决上面的问题MyBatis 框架

 测试类

MyBatis 框架

MyBatis 框架

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/37295.html

(0)

相关推荐

  • MongoDB基础入门

    MongoDB基础入门简介 • MongoDB是为快速开发互联网Web应用而设计的数据库系统。 • MongoDB的设计目标是极简、灵活、作为Web应用栈的一部分。 • MongoDB的数据模型是面向文档的,所谓文档是一种

    2023-02-18
    140
  • ORACLE数据库的DBLINK问题「建议收藏」

    ORACLE数据库的DBLINK问题「建议收藏」当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。下面讲介绍我之前项目…

    2022-12-15
    123
  • 共享的注意事项及解决方法「建议收藏」

    共享的注意事项及解决方法「建议收藏」2018年,文件共享服务项目DropBox使西北大学在2年的时间内“浏览了与新项目文件夹有关的数据信息”——遮盖了1000所高校中的约四十万名客户。那么文件共享的注意事项及解决方法有哪些呢? 该类电…

    2023-04-11
    135
  • redis持久化rdb和aof_redis的aof

    redis持久化rdb和aof_redis的aofRedis 默认支持持久化,依据自己的方式,将缓存在内存中的数据存储在磁盘上! Redis支持两种持久化数据的方式。第一种持久化方法为时间点转储(point-in-time dump),转储操作既可以

    2023-03-29
    163
  • SQL 入门教程:子查询「终于解决」

    SQL 入门教程:子查询「终于解决」目录汇总:SQL 入门教程:面向萌新小白的零基础入门教程 SELECT 语句 是 SQL 的查询。我们迄今为止所看到的所有 SELECT 语句都是简单查询,即从单个数据库表中检索数据的单条语句。 查询

    2023-04-20
    137
  • 高级玩家必备:深度剖析 MySQL 事务隔离「建议收藏」

    高级玩家必备:深度剖析 MySQL 事务隔离「建议收藏」如果对一个唯一索引使用了唯一的检索条件,那么只需要锁定相应的索引记录就好;如果是没有使用唯一索引作为检索条件,或者用到了索引范围扫描,那么将会使

    2023-05-23
    131
  • awr保留时间_快照备份

    awr保留时间_快照备份例如改为7天(7*24*60),每小时收集一次,默认情况下当前系统的保留时间为8天,1小时采样一次。 1、查看当前的快照保留时间和采集周期: SQL> select * from dba_hist_…

    2023-01-28
    163
  • mysql执行计划Explain详解,再也不用怕sql优化了!

    mysql执行计划Explain详解,再也不用怕sql优化了!大家都知道,mysql在执行查询的时候会进行查询优化。简单来讲就是执行的时候先基于成本和规则优化生成执行计划,然后再按照执行计划执行查询。本文主要介绍EXPLAIN各输出项的含义,从而帮助大家更好的进行sql性能优化! 我们可以在查询语句前面加上EXPLAIN关键字来查看这个查…

    2023-07-31
    90

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注