Mybatis01_mybatis的使用

一、mybatis概念

        MyBatis(半自动) 是一款优秀的持久层dao框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

mybatis – MyBatis 3 | 简介

1.1 持久层框架 orm 框架 ( object relation mapping ) 对象关系映射

java

database

对象

一行数据(主键)

属性

二、 mybatis配置文件

2.1 properties

        这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。例如:

<!--    全局配置-->
    <properties resource="db.properties">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
    </properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

 2.2 settings

        这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等

    <settings>
         <!--   关闭二级缓存-->
        <setting name="cacheEnabled" value="false"/>
        <!--    开启日志-->
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>

         测试一级缓存:mybatis的一级缓存,在同一个sqlsession中生效,一旦sqlsession关闭,缓存自动消失,查询相同的内容,需要重新连接数据库获取。

    @Test
//    mybatis的一级缓存,在同一个sqlsession中生效,
//    一旦sqlsession关闭,缓存自动消失,查询相同的内容,需要重新连接数据库获取
    public void findAllEmpInfo() {
        // 从测试案例可以看出,同一次会话,默认缓存数据,第二次查询相同的数据,直接从缓存中获取。
        System.out.println("第一次查询");
        List<EmpEntity> allEmpInfo = empDao.selectEmpInfo();
        for (EmpEntity empEntity : allEmpInfo) {
            System.out.println("实体类"+empEntity.toString());
        }
        System.out.println("第二次查询");
        List<EmpEntity> allEmpInfo1 = empDao.selectEmpInfo();
        for (EmpEntity empEntity : allEmpInfo1) {
            System.out.println("实体类"+empEntity.toString());
        }
//         第三次关闭sqlsession,重新打开一个sqlsession
//         测试案例可以发现,一旦sqlsession关闭,缓存自动消失,查询相同的内容,需要重新连接数据库获取。
        //重新打开一个新的sqlsession
        SqlSession sqlSession1 = MySqlsessionFactory.getSQLSession();
        EmpInfoMybatisDao empDao1 = sqlSession1.getMapper(EmpInfoMybatisDao.class);
        System.out.println("第三次查询");
        List<EmpEntity> allEmpInfo2 = empDao1.selectEmpInfo();
        for (EmpEntity empEntity : allEmpInfo2) {
            System.out.println("实体类"+empEntity.toString());
        }
    }

        测试结果显示

 2.3 typeAliases

        类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:

<!--    设置别名-->
<typeAliases>
    <typeAlias alias="xxx" type="com.aaa.entity.Emp"></typeAlias>
</typeAliases>

三、mybatis的具体使用

步骤一:pom.xml文件中引入jar包

如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:

<mybatis.version>3.5.6</mybatis.version>
<!-- 引入mybatis -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>${mybatis.version}</version>
</dependency>

步骤二:配置全局配置文件mybatis-config.xml

      每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

        在 resources中 创建一个全局配置文件  mybatis-config.xml

<?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>
<!--    全局属性配置   resource导入外部文件进行属性配置-->
    <properties resource="db.properties">
    </properties>
<!--    设置setting-->
    <settings>
<!--        关闭二级缓冲-->
        <setting name="cacheEnabled" value="false"/>
<!--        指定 MyBatis 所用日志的具体实现,未指定将自动查找-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
<!--    设置别名-->
    <typeAliases>
        <typeAlias type="com.aaa.entity.EmpEntity" alias="emp"></typeAlias>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--    映射文件-->
    <!--  第六步  创建mapper  加载映射文件 注意文件路径位置-->
    <mappers>
        <mapper resource="Mapper/EmpMapper.xml"/>
    </mappers>
</configuration>

第三步:构建 SqlSessionFactory

        可以从配置或者直接编码来创建SqlSessionFactory 通过SqlSessionFactory创建SqlSession

package com.aaa.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
/**
 * @author :caicai
 * @date :Created in 2022/6/9 11:08
 * @description:  第三步  构建sqlsession的工具类   获取session
 * @modified By:
 * @version:
 */
public class MySqlsessionFactory {
    // 全局配置文件
    static String resource = "mybatis-config.xml";
    static SqlSessionFactory sqlSessionFactory;
    static {
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
    /**
     * @create by:
     * * @description: 获取sqlsession
     * * @create time: 2020/12/9 10:29
     * * @return SqlSession
     */
    public static SqlSession getSQLSession() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
}

步骤四:创建dao接口

import java.util.Map;
/**
 * @description:   第四步 创建dao接口
 */
// 接口和映射文件是相关联的   他们是成对出现的
public interface EmpInfoMybatisDao {
    List<EmpEntity> selectEmpInfo();
}

步骤五:创建mapper映射文件

<?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">
<!-- 第五步  创建mapper映射文件-->
<!--关联dao层接口   书写接口的全路径-->
<mapper namespace="com.aaa.dao.EmpInfoMybatisDao">
    <resultMap id="empResultMap" type="emp">   <!-- emp属性别名-->
<!--  id是对应数据库中的主键-->
<!--  property是javabean的属性名   column是数据库的列名  jdbcType数据库列的类型  java属性类型-->
<!--        <id property="empno" column="empno"></id>-->
        <result property="gongzi" column="sal"></result>
    </resultMap>
<!--    如果 数据库 中的列名和 java实体类 中 属性名 完全一致,可以使用resultType。-->
<!--    如果数据库的列名和实体类的属性名不一致,或者复杂查询产生临时列,新属性,临时列和新属性的名字不一致,resultmap就必须要使用了。-->
    <select id="selectEmpInfo" resultMap="empResultMap">
        select  * from emp
    </select>
    <!--    id 方法名   resultType 方法值的返回的类型-->
    <select id="selectEmpMapInfo" resultType="Map">
        select  * from emp
    </select>
</mapper>

步骤六:调用session.commit()提交事务

        如果是更新、添加、删除语句,我们还需要提交一下事务。

步骤七:调用session.close()关闭会话

        一定要记得关闭会话。

 @After
//    测试之后
    public void tearDown() throws Exception {
        System.out.println("结束测试");
        if(sqlSession!=null){
            // 事物提交
            sqlSession.commit();
        }else {
            // 关闭sqlSession
            sqlSession.close();
        }
    }

步骤八:使用junit测试工具单元测试

  • 导入junit的jarzai
<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.11</version>
   <scope>test</scope>
</dependency>

 在测试类中进行测试

public class EmpInfoMybatisDaoTest {
    private SqlSession sqlSession;
    private EmpInfoMybatisDao empDao;
    @Before
//    测试之前
    public void setUp() throws Exception {
        System.out.println("开始测试");
        sqlSession = MySqlsessionFactory.getSQLSession();
        empDao = sqlSession.getMapper(EmpInfoMybatisDao.class);
    }
    @After
//    测试之后
    public void tearDown() throws Exception {
        System.out.println("结束测试");
        if(sqlSession!=null){
            // 事物提交
            sqlSession.commit();
        }else {
            // 关闭sqlSession
            sqlSession.close();
        }
    }
    @Test
    public void searchUsesEmpInfo2() {
        List<EmpEntity> useInfo = empDao.queryUsesInfo2("张三",20000f);
        for (EmpEntity empEntity : useInfo) {
            System.out.println(empEntity);
        }
    }
}

 测试结果:

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

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340