• MyBatis入门学习(三)


    配置解析

    1、核心配置文件

    mybatis-config.xml文件包含了会深深影响MyBatis行为的设置和属性信息。

    configuration(配置)
    properties(属性)
    settings(设置)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境配置)
    environment(环境变量)
    transactionManager(事务管理器)
    dataSource(数据源)
    databaseIdProvider(数据库厂商标识)
    mappers(映射器)
    

    2、环境配置(environments)

    MyBatis可以配置成适应多种环境

    尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境。

    MyBatis默认的事务管理器为:JDBC,连接池为:POOLED

    3、属性(properties)

    我们可以通过peopreties属性来实现引用配置文件

    这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,也可以通过properties元素的子元素来传递。

    编写一个配置文件db.properties

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
    username=root
    password=123456
    

    在mybatis-config.xml中引入

        <properties resource="db.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="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
    

    4、类型别名(typeAliases)

    类型别名是为Java类型设置一个短的名字,用来减少类完全限定名的冗余

    • 可以给实体类起别名
        <typeAliases>
            <typeAlias type="com.star.pojo.User" alias="User"/>
        </typeAliases>
    
    • 也可以指定一个包名,MyBatis会在报名下面搜索需要的JavaBean;
        <!--扫描实体类的包,默认别名就为这个类的类名,首字母小写-->
        <typeAliases>
            <package name="com.star.pojo"/>
        </typeAliases>
    

    在实体类比较少的时候,使用第一种方式,如果实体类十分多,建议使用第二种。

    5、设置(settings)

    查看官方文档,看一看到settings可以配置日志,开启或者关闭驼峰命名转换!

    在数据库中,属性名中会由'_'符号,而Java中一般是驼峰命名,比如:
    数据库中为:create_Date

    Java中为:createDate

    开启驼峰命名转换后就会对应起来!

        <settings>
            <!--开启日志和驼峰命名转换-->
            <!--配置日志,就可以看到具体的SQL信息,从而找到出错的原因-->
            <setting name="mapUnderscoreToCamelCase" value="true"/>
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        </settings>
    

    6、映射器(Mapper)

    每一个Mapper都需要在MyBatis核心配置文件中注册!

    • 方法一:使用resource(资源对应的路径)
        <mappers>
            <mapper resource="com/star/mapper/UserMapper.xml"/>
        </mappers>
    
    • 方法二:使用class文件绑定注册(接口对应的路径,前提是UserMapper.xml和UserMapper接口在同一包下)
        <mappers>
            <mapper class="com.star.mapper.UserMapper"/>
        </mappers>
    
    • 方法三:扫描包进行注入绑定
        <mappers>
            <package name="com.star.mapper"/>
        </mappers>
    

    一般使用扫描包!

    7、生命周期和作用域

    生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题

    SqlSessionFactoryBuilder:

    • 一旦创建了SqlSessionFactory,就不在需要它了
    • 它是局部变量;

    SqlSessionFactory:

    • 可以看做数据库连接池
    • SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
    • 一次SqlSessionFactory的最佳作用域是应用作用域
    • 最简单的就是使用单例模式挥着静态单例模式;

    SqlSession:

    • 连接到数据库的应该请求!
    • SqlSession的实例不是线程安全的,因此是不能被共享的,所有它的最佳的作用域是请求或方法作用域。
    • 用完之后需要赶紧关闭,否则资源被占用!

    结果集映射(ResultMap)

    问题:属性名和字段名不一致会发生什么

    数据库中的字段

    新建一个项目,实体类字段不一致

    public class User {
        
        private int id;
        private String name;
        private String password;
    }
    

    对应的接口

    package com.star.mapper;
    
    import com.star.pojo.User;
    
    public interface RMapper {
        User selectById(int id);
    }
    

    配置文件

    <?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="com.star.mapper.RMapper">
    
        <select id="selectById" parameterType="int" resultType="user">
            select * from user where id=#{id};
        </select>
    
    </mapper>
    

    测试

        @Test
        public void testSelect() {
            SqlSession session = MybatisUtils.getSession();
            RMapper mapper = session.getMapper(RMapper.class);
            User user = mapper.selectById(2);
            System.out.println(user);
    

    测试结果:

    可以看到,password为空

    解决问题(ResultMap)

    修改配置文件

        <resultMap id="RMapper" type="user">
            <!--column数据库中的字段,property实体类中的属性-->
            <!--id是数据库中主键的字段  result对应普通的字段-->
            <!--属性名和字段一致时可以省略-->
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="password" column="pwd"/>
        </resultMap>
    
        <select id="selectById" parameterType="int" resultMap="RMapper">
            select * from user where id=#{id};
        </select>
    

    测试结果:

    结论:

    • resultMap元素时MyBatis中最重要最强大的元素
    • ResultMao的设计思想是:对于简单的语句根本不需要配置显示的结果映射,而对于复杂一点的语句只需要描述他们的关系就行了
  • 相关阅读:
    LeetCode 345. Reverse Vowels of a String 题解
    LeetCode 344. Reverse String 题解
    LeetCode 27. Remove Element 题解
    LeetCode 61. Rotate List 题解
    LeetCode 19.Remove Nth Node From End of List 题解
    Android耗电量
    Android 使用adb查看和修改电池信息
    Android AOP AspectJ 插桩
    Flask相关用法
    Monkey日志信息的11种Event percentage
  • 原文地址:https://www.cnblogs.com/lmx-181028/p/12347524.html
Copyright © 2020-2023  润新知