mybatis笔记(二)

配置解析

核心配置文件

环境配置

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

不过要记住:尽管可以配置多个环境,但每个SqlSessionFactory实例智能选择一种环境。

Mybatis默认的事务管理器就是JDBC,连接池POOLED

属性(properties)

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

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。

编写一个配置文件:db.properties

1
2
3
4
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username=root
password=root

在核心配置文件中引入

1
2
<!--    引入外部配置文件-->
<properties resource="db.properties"/>

类型别名

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

1
2
3
4
<!--  可以给实体类起别名-->
<typeAliases>
<typeAlias type="cn.demomybatis.domain.Student" alias="Student"/>
</typeAliases>

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean

扫描实体类的包,他的默认别名就为这个类的类名首字母小写

设置

设置名 描述 有效值 默认值
mapUnderscoreToCamelCase 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 true|False false

映射器

MapperRegistry:注册绑定我们的Mapper文件

方式一:

1
2
3
4
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="cn/demomybatis/dao/StudentDao.xml"/>
</mappers>

方式二:

1
2
3
4
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="cn.demomybatis.dao.StudentDao"/>
</mappers>

方式三:

1
2
3
4
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="cn.demomybatis.dao"/>
</mappers>

生命周期和作用域

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

解决属性名和字段名不一致问题

resultMap

结果集映射

1
2
3
4
5
<!--    结果集映射-->
<resultMap id="StudentMap" type="Student">
<!-- column是数据库中的字段,property是实体类中的字段-->
<result column="u_id" property="id"></result>
</resultMap>
  • resultMap元素是MyBatis中最重要最强大的元素

  • ResultMap的设计思想是,对于简单的语句根本不需要配置显式的结果映射,对于复杂一点的语句只需要猫叔他们的关系就行了

  • ResultMap最优秀的地方在于,虽然你已经对他相当了解了,但根本不需要显式的用到他们。

日志

日志工厂

如果一个数据库操作出现了异常,我们需要排错。日志就是最好的帮手!

设置名 描述 有效值 默认值
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J,LOG4J,LOG4J2,JDK_LOGGING,COMMONS_LOGGING,STDOUT_LOGGING,NO_LOGGING 未设置
1
2
3
4
<settings>
<!-- 标准的日志实现-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

LOG4J

什么式log4j?

  • Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件
  • 我们也可以控制每一条日志的输出格式
  • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
  • 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

1.先导入LOG4J的jar包

2.log4j.properties配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#############################################
#
# Log4J 配置文件
#
#############################################

# 定义缺省的日志级别和输出对象
log4j.rootLogger=DEBUG,INFO, logfile,console

# 设定控制台输出模式
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%d{MM/dd HH:mm:ss}] [%-3p] %c{1}: %m%n

# 针对package定义日志级别
log4j.logger.org.apache=WARN
log4j.logger.com.paic.pafademo=DEBUG

# 设定日志文件的输出模式
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.DatePattern=yyyyMMdd
# ${pafa.log.home}通过参数-D指定,比如启动WebLogic时加入参数-Dpafa.log.home=c:/
log4j.appender.logfile.File=${log.home}/appdemo/pafa.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{MM/dd HH:mm:ss} [%-3p] %c{1}: %m%n

# 如果要查看iBATIS的SQL日志信息,确保有下面配置
log4j.logger.com.ibatis=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

3.配置log4j为日志的实现

1
2
3
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
简单使用

1.在要使用的Log4j的类中,导入import org.apache.log4j.Logger;

2.日志对象,参数为当前类的class

1
static Logger logger = Logger.getLogger(mybatistest.class);

分页

使用limit分类

使用MyBatis实现分页,核心SQL

1.接口

1
2
//分页
List<Student> getStudentByLimit(Map<String,Integer> map);

2.StudentDao.xml

1
2
3
<select id="getStudentByLimit" resultType="Student" parameterType="map">
select * from student limit #{startIndex},#{pageSize}
</select>

3.测试

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void getStudentByLimit(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
Map<String,Integer> map = new HashMap();
map.put("startIndex",0);
map.put("pageSize",2);
List<Student> studentList = studentDao.getStudentByLimit(map);
for (Student student : studentList) {
System.out.println(student);
}
sqlSession.close();
}

RowBounds分页

评论