79.【Mybatis】(四)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 79.【Mybatis】

6.设置(settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

7.映射器(mappers)

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。

(1).使用相对于类路径的资源引用(扫描XML文件)
  • 切记这里使用的是: " / "进行间隔
<mappers>
      使用资源路径
<mapper resource="Com/Jsxs/Dao/UserMapper.xml"/>
    </mappers>

(2).使用映射器接口实现类的完全限定类名===>(扫描Class)
  • 接口和他的Mapper配置文件必须同名
  • 接口和他的Mapper配置文件必须在同一个包下
  • 这里的路径使用的是"."进行间隔。
<mappers>
使用类路径进行查询,切记这个类不能放在resource目录中,否则报错
        <mapper class="Com.Jsxs.Dao.UserMapper"></mapper>
    </mappers>

(3).将包内的映射器接口全部注册为映射器 (扫描包)
  • 只需要写到包名即可
  • 接口和他的Mapper配置文件必须同名
  • 接口和他的Mapper配置文件必须在同一个包下
<mappers>
    使用包名
        <package name="Com.Jsxs.Dao"/>
    </mappers>

(4).如果接口的名字改变

如果接口的名字改变,那么核心配置文件就会自动发生改变。我们只需要改变测试处的类名就可以了。

(八)、生命周期和作用域

1.生命周期图

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

2.介绍四个模式

车辆制造厂制造了100辆车,然后买给了租车公司,然后租给了用户,客户办完事情,然后退回给租车公司。

(1). sqlSessionFactoryBuilder:
  • 主要作用就是为了创建sqlSessionFactory工厂
  • 只要创建sqlSessionFactory工厂之后,那么就不在需要它了
  • 我们需要把这个函数放在局部变量
(2).sqlSessionFactory
  • 可以理解为: 数据库连接池
  • sqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实列。
  • sqlSessionFactory的最佳作用域是全局作用域(静态模式或单列模式)
(3).sqlSession
  • 链接到连接池的一个请求
  • sqlSession的实列不是线程安全,因此不能被共享,所以它的最佳作用域是请求或方法作用域
  • 用完之后赶紧关闭,否则资源被占用。
(4).Mapper
  • 每一个Mapper对应一张表。
  • Mapper是一个具体的业务。
  • Mapper对应的是一个接口。

(九)、解决属性名和字段名不一致的问题

1.实体类属性名和数据库字段名不一致

数据库中的字段

实体类的字段

package Com.Jsxs.pojo;
public class User {
    private int id;
    private String name;
    private String password;
    public User(int id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }
    public User() {
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

产生问题: 属性名不一致的会查不到数据叫做 null

产生问题

产生原因

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace绑定一个对应的Dao/Mapper接口-->
<mapper namespace="Com.Jsxs.Dao.UserMapper">
<!--    根据ID查询用户-->
    <select id="getUserById" parameterType="int" resultType="User">
        select *from mybatis.user where id=#{id}
    </select>
</mapper>

查询语句的真实语句

select id,name,pwd from mybatis.user where id=#{id}。然而我们用的是password去查询,所以我们在进行数据库查询的时候,查询的数据是password

2.解决方法

(1).类型处理器=====》起别名

就是给字段起别名

select id,name,pwd as password from mybatis.user where id=#{id}

(2).ResuletMap(结果集映射)
  • resultMap 元素是 MyBatis 中最重要最强大的元素。
  • resultMap 的设计思想是: 对于简单的语句根本不需要配置显示的结果映射,而对于复杂一点的语句只需要描述他们的关系就行了。
  • resultMap 最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显示的用到它们。
  • 返回类型是: ReusltMap 不是ResultType
<resultMap id="A" type=" 返回类型 ">
<!--  column对应数据库的字段,  property对应实体类的属性    -->
        <result column="id" property="id"></result>
        <result column="name" property="name"></result>
        <result column="pwd" property="password"></result>
    </resultMap>
    <select id="getUserById" parameterType="int" resultMap="A">
        select id,name,pwd from mybatis.user where id=#{id}
    </select>
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace绑定一个对应的Dao/Mapper接口-->
<mapper namespace="Com.Jsxs.Dao.UserMapper">
<!--结果集映射-->
    <resultMap id="UserMap" type="User">
<!--  column对应数据库的字段,  property对应实体类的属性    -->
        <result column="id" property="id"></result>
        <result column="name" property="name"></result>
        <result column="pwd" property="password"></result>
    </resultMap>
    <select id="getUserById" parameterType="int" resultMap="UserMap">
        select id,name,pwd from mybatis.user where id=#{id}
    </select>
</mapper>

(十)、日志

1.日志工厂

指定 MyBatis 所用日志的具体实现,未指定时将自动查找。

如果一个数据库操作出现了异常,我们需要排错。可以帮助我们自动打印sql语句,日志就是最好的助手。

曾经: sout、debug

现在: 日志工厂

SLF4J |

LOG4J(3.5.9 起废弃)【掌握】

LOG4J2

JDK_LOGGING

COMMONS_LOGGING

STDOUT_LOGGING 【掌握】

NO_LOGGING

(1).在mybatis中具体使用哪一个日志实现,在设置中设定

(1).标准日志输出

STDOUT_LOGGING标准日志输出。

<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
  • 切记约定大于配置
  • 切记不能有任何的改变
  • 空格啥的也不能有,原样输出
  • 我们粘贴过去一个工厂日志的时候,后面会有一个空格,千万要删除


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
13天前
|
SQL 缓存 Java
Mybatis汇总
Mybatis汇总
21 1
|
SQL Java 数据库连接
MyBatis大全
MyBatis大全
52 0
|
1月前
|
SQL 缓存 Java
MyBatis系列
MyBatis系列
|
SQL Java 数据库连接
Mybatis之discriminator(鉴别器)详解
前言 最近干了一个工作是使用discriminator去写一个新的API,那么写这个新的API原因是什么呢?原因是这样的:我们的项目使用Mybatis,我们项目中有一个实体类叫做User,在User中还含有很多别的实体类,例如Role,Permission,Address等(有经验的肯定知道这种嵌套实体类的情况,使用和)。
4138 0
|
4月前
|
SQL Java 数据库连接
Mybatis(一)
Mybatis(一)
37 0
|
6月前
|
Java 数据库连接 数据库
mybatis的@MappedTypes
mybatis的@MappedTypes
98 1
|
SQL 安全 Java
Mybatis
参数传递 单个普通参数:Mybatis可以直接使用这个值,取值#{ },不会对它进行处理 多个参数:任意多个参数,都会被Mybatis封装成一个Map传入,map的key时param1,param2,或者0.1.2.......,就是参数的值
52 1
|
11月前
|
Java 数据库连接 测试技术
mybatis中@Many
mybatis中@Many
94 0
|
SQL Java 数据库连接
|
XML Java 数据库连接
MyBatis-Plus使用
MyBatis-Plus使用