Mybatis学习三:
一、Mybatis生命周期和作用域:
关于mybatis的执行流程:
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 所以他只存在于创建SqlSessionFactory的方法中,而不要让他长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”,会出现资源消耗和系统宕机等情况。因此 SqlSessionFactory 的最佳作用域是应用作用域。
SqlSessionFactory可以被当做是一个数据库连接池,用于创建SqlSession接口对象
SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。SqlSession相当于一个数据库连接,可在一个事务里执行多条sql,所以他应该存活在一个业务请求中,但是处理完整个请求后必须立刻关闭它,否则会耗费数据库资源。
二、ResultMap
解决属性名和字段名不一致的问题
解决方案:
方案一:起别名
方案二:使用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 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
| 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 = MybatisUtils.getSqlSession(); logger.info("info"); logger.error("error"); logger.debug("debug"); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); System.out.println(userList); 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详细执行流程