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);
        }
    }
}

 测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸡本蔡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值