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>
- 切记约定大于配置
- 切记不能有任何的改变
- 空格啥的也不能有,原样输出
- 我们粘贴过去一个工厂日志的时候,后面会有一个空格,千万要删除