Mybatis的mapper文件和全局配置文件详解

Mybatis的Mapper文件和全局配置文件详解

1、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 根节点
        namespace   命名空间,一般情况下一个mapper映射文件对应不同的命名空间,利于管理和维护
            书写:默认情况下可以随意输入,但是如果使用接口绑定的方式就必须要输入对应的接口的完整限定名
        namespace如果是基于statementId的方式去执行SQL就可以随便写
        如果是基于接口绑定的方式就需要输入相应接口的完整限定名-->
<mapper namespace="cool.ale.mapper.EmpMapper">

      <select id="selectEmp" resultType="cool.ale.pojo.Emp">
         select id,name from emp where id = #{id}
      </select>

      <!-- id 可以设置不同的命名中唯一的标识符,可以被用来引用这条语句。
      如果是接口绑定的是一定要保证接口和方法名相同
      parameterType     用来设置该Sql的参数类型,可以当它不存在,因为mybatis会根据接口方法的参数自动读取到参数类型
      statementType     设置当前的statement
            STATEMENT   代表jdbc的statement            不支持参数预解析
            PREPARED    代表jdbc的PreparedStatement    支持参数预解析,默认的
            CALLABLE    代表jdbc的CallableStatement    执行存储过程
      useGeneratedKeys  获取插入后的自动增长的主键(mysql 和 sql server)
      keyProperty       属性名,自动增长的列
      要获取自动获取的主键        设置 useGeneratedKeys 和 keyProperty
      keyColumn         如果该表是一个联合主键的话,指定是其中哪一个字段
      databaseId        用于配合数据库厂商id指定不同数据库下不同的SQL
      -->
      <insert id="insertEmp">
            <!-- 设置子查询,可以在增删改之前或之后执行
                可以解决数据库列不自动增长
                可以先查出一个id,然后返回给插入的Sql
                 resultType     返回类型
                 order      之前还是之后执行   AFTER、BEFORE-->
            <selectKey order="BEFORE" keyProperty="id" resultType="int">
                    SELECT MAX(ID)+1 FROM EMP
            </selectKey>
            INSERT INTO `mybatis`.`emp`(`id`, `name`) VALUES (#{id}, #{name});
      </insert>

      <update id="updateEmp">
            UPDATE emp SET name = #{name} WHERE id = #{id};
      </update>

      <delete id="deleteEmp">
            DELETE FROM emp WHERE id = #{id};
      </delete>

</mapper>

2、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">
<!-- 就是 DOCTYPE 后面对应的根节点 -->
<configuration>

    <!-- 配置外部属性资源文件   通过${}进行引用 -->
    <!--<properties resource="db.properties">
        &lt;!&ndash; 可以在定义内部的属性  引用方式是一样的 &ndash;&gt;
        <property name="mysql.name" value="root"/>
    </properties>-->
    <properties resource="db.properties"></properties>

    <!-- mybatis的设置选项   可以改变mybatis的运行时行为 -->
    <settings>
        <!-- 是否允许在Sql中设置别名,默认为true -->
        <setting name="useColumnLabel" value="true"/>
        <!-- 设置自动生成主键,并且递增 -->
        <!--<setting name="useGeneratedKeys" value="true"/>-->
        <!-- 当 数据库的字段名 和 对象中的属性名 对应不上的时候,报一个value级别的错误
                默认是NONE,什么都不发生,如果没有映射上就不赋值
                WARNING FAILING-->
        <!--<setting name="autoMappingUnknownColumnBehavior" value="FAILING"/>-->
        <!-- 设置默认执行器:
                SIMPLE      默认的,普通的执行器,每次都需要预解释sql
                REUSE       服务器会重用Sql,不会每一次都预解释sql
                BATCH       执行器不仅重用Sql,且会批量执行
         -->
        <!--<setting name="defaultExecutorType" value="SIMPLE"/>-->
        <!-- 设置调用数据库超时时间,单位是秒 -->
        <!--<setting name="defaultStatementTimeout" value="10"/>-->
        <!-- 是否将数据库的蛇形命名 映射为 驼峰命名 -->
        <!--<setting name="mapUnderscoreToCamelCase" value="true"/>-->
        <!-- 当往数据库插入数据某个数据值为null时映射到数据库的类型:
                默认:OTHER    mysql是可以识别出OTHER类型的
                      NULL     如果是 ORACLE 一定要设置成 NULL,ORACLE设别不出OTHER类型
                      VARCHAR   当属性值为空时为数据库设置一个空字符串
                      -->
        <!--<setting name="jdbcTypeForNull" value="OTHER"/>-->
        <!-- 假如 mybatis 框架中实现了多个日志框架,可以使用 logImpl 属性来设置使用哪一个
            如果使用了 SLF4J 可以不用设置该配置,因为SLF4J本身就是选择使用那种日志框架的 -->
        <!--<setting name="logImpl" value="SLF4J"/>-->
        <!--  打开延迟加载的开关  -->
        <!--<setting name="lazyLoadingEnabled" value="true" />-->
        <!--  将加载改为按需加载  -->
        <!--<setting name="aggressiveLazyLoading" value="false"/>-->
    </settings>

    <!-- 设置别名 -->
    <typeAliases>
        <!-- 根据包设置包里面所有的类的别名 (会将类的名字设置别名,并且忽略大小写)
         接着resultType的值就可以直接写类名-->
        <package name="cool.ale.pojo"/>
    </typeAliases>

    <!-- 相当于mybatis的拦截器,可以拦截4大对象,可以拦截SQL,给SQL添加一些公共的功能 -->
    <!--<plugins>
        <plugin interceptor=""></plugin>
    </plugins>-->
    
    <!-- 数据库环境,可以设置多个,default 默认环境 -->
    <environments default="development">
        <!-- 配置单个数据库环境,id指定当前数据库环境的唯一标识,会被上面的default标志所设置 -->
        <environment id="development">
            <!-- 事务管理器,类型
             type = JDBC 使用jdbc的事务管理器
             type = MANAGED 不运用事务
             -->
            <transactionManager type="JDBC"/>
            <!--
                数据源
                type 指定连接池
                POOLED  指定使用mybatis连接池
                UNPOOLED    不使用连接池
                JNDI    JNDI连接池 可以在tomcat中使用
             -->
            <dataSource type="POOLED">
                <property name="driver" value="${mysql.driver}"/>
                <property name="url" value="${mysql.url}"/>
                <property name="username" value="${mysql.username}"/>
                <property name="password" value="${mysql.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 数据库厂商表示:mybatis提供用于跨数据库平台
        type="DB_VENDOR" 利用数据库的厂商名称来区分
        在Sql里面可以通过databaseId属性指定使用特定数据库的Sql
        获取数据库厂商名字:
        String databaseProductName = sqlSession.getConnection().getMetaData().getDatabaseProductName();
        步骤:
            1、为需要跨越不同的数据库设置不同的厂商名称
            2、编写不同的SQL databaseId必须使用厂商的value
     -->
    <databaseIdProvider type="DB_VENDOR">
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle"/>
    </databaseIdProvider>

    <!-- 设置映射器 -->
    <mappers>
        <!-- 4种映射方式
                1、<mapper resource  设置MapperXml 这种方式适用于根据statementId进行操作
                2、<mapper class     设置Mapper接口 这种方式适用于接口绑定的方式
                3、<mapper url       使用磁盘的绝对路径
                4、<package name     根据包路径,设置包路径下的所有Mapper接口,适用于接口绑定和注解
         -->
        <!--<mapper resource="EmpMapper.xml"/>-->
        <mapper class="cool.ale.mapper.EmpMapper"></mapper>
    </mappers>
</configuration>

3、测试类

package cool.ale.tests;

import cool.ale.mapper.EmpMapper;
import cool.ale.pojo.Emp;
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 org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;


public class MybatisTest {


    @Test
    public void test() throws IOException, SQLException {
        // 从 xml中构建 SqlSessionFactory
        String resource = "mybatis-config.xml";
        // 从xml构建输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 构建 SqlSessionFactory:将全局配置文件和所有的 mapper 全部加载到 Configuration 对象中去
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // true是设置自动提交,SqlSession 负责执行具体的数据操作
        /**
         * 给 openSession 设置不同的参数会给 SqlSession 后续的数据库操作造成不同影响
         * (传递 true 或 false,true代表自动提交):可以设置事务的自动提交方式(是否在增删改操作时自动提交)
         * Connection var1:将由当前环境配置的 DataSource 实例中获取 Connection 对象
         * TransactionIsolationLevel var1:事务隔离级别将会使用驱动或数据源的默认设置
         * ExecutorType var1:预处理语句是否复用,是否批量处理更新
         */
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 获取数据库厂商名字
        String databaseProductName = sqlSession.getConnection().getMetaData().getDatabaseProductName();
        System.out.println(databaseProductName);
        // Mybatis 在 getMapper 就会创建 jdk 动态代理
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.selectEmp(101);
        System.out.println(emp);
    }

}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个开源的Java持久化框架,它可以将SQL语句与Java对象之间的映射关系进行配置。在MyBatis中,Mapper文件用于定义SQL语句和映射关系的配置。 Mapper文件通常以`.xml`作为后缀名,位于项目的资源路径下。它包含了一系列SQL语句的定义和映射关系的配置。 一个典型的Mapper文件包括以下几个部分: 1. `mapper`根元素:用于定义命名空间和引入其他命名空间的依赖。 2. `resultMap`元素:用于定义结果集的映射关系,将查询结果集中的列与Java对象的属性进行映射。 3. `select`、`insert`、`update`、`delete`等元素:用于定义具体的SQL语句和参数映射。 4. `parameterType`和`resultType`属性:用于指定参数类型和结果类型。 5. `include`元素:用于引入其他Mapper文件中定义的SQL片段。 以下是一个简单的Mapper文件示例: ```xml <mapper namespace="com.example.UserMapper"> <resultMap id="UserResultMap" type="com.example.User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> <result property="email" column="user_email"/> </resultMap> <select id="getUserById" resultMap="UserResultMap"> SELECT * FROM user WHERE id = #{id} </select> <insert id="insertUser" parameterType="com.example.User"> INSERT INTO user (user_name, user_email) VALUES (#{name}, #{email}) </insert> <!-- 其他SQL语句的定义 --> </mapper> ``` 以上是一个简单的Mapper文件示例,其中定义了一个`User`对象的映射关系,并包含了查询和插入的SQL语句。 在使用MyBatis时,你需要将Mapper文件配置到MyBatis配置文件中,并使用相应的接口来执行SQL语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值