Mybatis学习三 - Alias的博客

Mybatis学习三:

一、Mybatis生命周期和作用域:

关于mybatis的执行流程:

SqlSessionFactoryBuilder

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 所以他只存在于创建SqlSessionFactory的方法中,而不要让他长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”,会出现资源消耗和系统宕机等情况。因此 SqlSessionFactory 的最佳作用域是应用作用域。

SqlSessionFactory可以被当做是一个数据库连接池,用于创建SqlSession接口对象

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。SqlSession相当于一个数据库连接,可在一个事务里执行多条sql,所以他应该存活在一个业务请求中,但是处理完整个请求后必须立刻关闭它,否则会耗费数据库资源。

二、ResultMap

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

    解决方案:

    方案一:起别名

​ 方案二:使用resultmap结果集映射

​ 2.ResultMap

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。

ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

三、日志工厂

Mybatis 通过使用内置的日志工厂提供日志功能。内置日志工厂将会把日志工作委托给下面的实现之一:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j
  • JDK logging

标准日志实现:

1
2
3
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

使用log4j:

Log4j是Apache的一个开源项目

通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件

通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

  1. 导包

    导包

1
2
3
4
5
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

​ 2.编写配置文件

在resource下创建一个log4j.properties文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
### set log levels ###
log4j.rootLogger = DEBUG,console,file
###控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
###文件输出的相关设置
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.MaxFileSize=10
log4j.appender.file.File=./log/my.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
###日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

3.setting设置日志实现

1
2
3
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>

4.在程序中使用log4j进行输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static Logger logger = Logger.getLogger(UserMapperTest.class);
@Test
public void test() {
//获取sqlsession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
logger.info("info");
logger.error("error");
logger.debug("debug");
//getMapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
System.out.println(userList);
//关闭sqlsession
sqlSession.close();
}

在控制台观察输出

四、分页

1、使用limit分页

修改mapper文件

1
2
3
<select id="getUserByLimit" parameterType="map" resultType="user">
select * from mybatis.user limit #{start},#{pageSize}
</select>

Mapper接口:

1
2
//分页
List<User> getUserByLimit(Map<String,Object> map);

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("start",0);
map.put("pageSize",2);
List<User> userList = mapper.getUserByLimit(map);
for (User user : userList) {
System.out.println(user);
}

sqlSession.close();
}

2、RowBounds实现分页

了解就行,一般不用

五、使用注解开发

使用注解时就不需要mapper.xml映射文件了

1、在接口添加注解

1
2
@Select("select * from user")
List<User> getUsers();

2、在核心配置文件注入

1
2
3
<mappers>
<mapper class="dao.UserMapper"></mapper>
</mappers>

3、测试

1
2
3
4
5
6
7
8
9
10
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUsers();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。

4、mybatis详细执行流程

评论