6.5 映射器(mappers)
MapperRegistry
方式一 使用相对于类路径的资源引用
<mappers>
<mapper resource="com/kuang/dao/UserMapper.xml"/>
</mappers>
方式二 使用class文件绑定注册
<mappers>
<mapper resource="com.kuang.dao.UserMapper"/>
</mappers>
注意点:
-
接口和Mapper配置文件必须同名
-
接口和Mapper配置文件必须在同一个包下
方式三 使用扫描包进行注入绑定
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
注意点:
-
接口和Mapper配置文件必须同名
-
接口和Mapper配置文件必须在同一个包下
7.作用域和生命周期
作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder
- 一旦创建了 SqlSessionFactory,就不再需要它了
- 局部变量
SqlSessionFactory
- 想象为数据库连接池
- SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
- SqlSessionFactory 的最佳作用域是应用作用域
- 最简单的就是使用单例模式或者静态单例模式
SqlSession
连接到数据库的一个请求
SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域
用完之后赶紧关闭 否则占用资源
8.解决属性名和字段名不一致的问题
public class User {
private int id;
private String name;
private String pwd;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jyMRTexF-1615813105994)(C:\Users\HSL\AppData\Roaming\Typora\typora-user-images\1615601122832.png)]
解决方法:
8.1起别名:
<select id="getUserById" resultType="com.kuang.pojo.user">
select id,name,pwd as password from mybatis.user where id=#{id}
</select>
8.2resultMap
结果集映射
表 id name pwd
实体类 id name password
<select id="getUserById" resultMap="UserMap">
select * from mybatis.user where id=#{id}
</select>
<resultMap id="UserResultMap" type="user">
<result colum="id" property="id"/>
<result colum="name" property="name" />
上面两行可以省略 属性名一样不需要
<result colum="pwd" property="password"/>
</resultMap>
<select id="getUserById" resultMap="UserMap">
select * from mybatis.user where id=#{id}
</select>
-
resultMap
元素是 MyBatis 中最重要最强大的元素 -
ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
-
ResultMap
的优秀之处——你完全可以不用显式地配置它们
9.日志
9.1日志工厂
如果一个数据库操作出现异常,我们需要拍错,日志是最好的助手
曾经:sout、debug
现在:日志工厂
<select id="getUserById" resultType="com.kuang.pojo.User" parameterType="int"> 多写一个点 出错
select * from mybatis.user where id.=#{id}
</select>
9.2、Log4j
9.2.1什么是log4j
- Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件
- 我们也可以控制每一条日志的输出格式;
- 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
- 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
10.使用注解开发
10.1面向接口编程
在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。
1.关于接口的理解。
接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
接口的本身反映了系统设计人员对系统的抽象理解。
接口应有两类:第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);
第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);
2.三个面向的区别
面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法
面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现
接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题
baidu.com/item/面向对象)是指,我们考虑问题时,以对象为单位,考虑它的属性及方法
面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现
接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题