相关概念介绍(一)

1.日志

  有时候需要打印日志,知道mybatis执行了什么样的SQL语句,以便进行调试。这时,就需要开启日志,而mybatis自身是没有带日志的,使用的都是第三方日志,这里介绍如何开启log4j日志功能。

  在src目录下,新建文件log4j.properties,其作用是输出mybatis包下参与Mybatis的类的SQL语句输出:

 # Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.mybatis=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

2.事务管理

在一个事务中,只要有一个操作发生错误,那么其他的操作也无效。在Mysql中,只有当表的类型是INNODB的时候,才支持事务。

3.延迟加载

基于注解方式的一对多来了解延迟加载的配置办法。

<1>测试代码,一种分类对应多个产品。但是当只获取分类,不获取产品名字的时候,通过执行日志的输出可以发现,获取产品的sql语句也执行了。

 package mybatis.annotation;

 import java.io.IOException;
import java.io.InputStream;
import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import mybatis.mapper.CategoryMapper;
import mybatis.pojo.Category; public class testOneToMany { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String resource = "mybatis-config.xml";
InputStream inputStream = org.apache.ibatis.io.Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
CategoryMapper categoryMapper = session.getMapper(CategoryMapper.class); listAll(categoryMapper); session.commit();
session.close();
} private static void listAll(CategoryMapper mapper) {
List<Category> categories = mapper.list2();
for (Category c : categories) {
System.out.println(c.getName());
// List<Product> products = c.getProducts();
// if (products.size() != 0) {
// for (Product product : products) {
// System.out.println("\t" + product.getName());
// }
// }
}
} }

执行结果:

<2>在mybatis-config.xml中添加延迟加载配置。

     <settings>
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改为消息加载,即按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>

<3>执行相同的操作,可以看到,当只查询category中的数据时,并没有查询product表中的数据。

<4>只有在查询产品的时候,才会看到相应的SQL语句。(把代码中的注释去掉,输出产品名称)

4.分页

<1>增加100条记录

     public static void add(CategoryMapper categoryMapper) {
for (int i = 0; i < 100; i++) {
Category category = new Category();
category.setName("category name " + i);
categoryMapper.add(category);
}
}

<2>进行分页查询

①xml方式

在Category.xml下添加如下代码:

     <select id="listByPage" resultType="Category">
select * from category
<if test="start!=null and count!=null">
limit #{start},#{count}
</if>
</select>

②注解方式

在CategoryMapper.java中添加如下代码:

 @Select("select * from category limit #{start},#{count}")
public List<Category> listByPage(@Param("start") int start, @Param("count") int count);

<3>测试

 package mybatis.annotation;

 import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import mybatis.mapper.CategoryMapper;
import mybatis.pojo.Category; public class testPaging { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String resource = "mybatis-config.xml";
InputStream inputStream = org.apache.ibatis.io.Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
CategoryMapper categoryMapper = session.getMapper(CategoryMapper.class); // add(categoryMapper);
// xmlPage(session);
annotationPage(categoryMapper);
session.commit();
session.close();
} public static void list(CategoryMapper categoryMapper) {
List<Category> categories = categoryMapper.list();
for (Category category : categories) {
System.out.println(category);
}
} public static void add(CategoryMapper categoryMapper) {
for (int i = 0; i < 100; i++) {
Category category = new Category();
category.setName("category name " + i);
categoryMapper.add(category);
}
} public static void xmlPage(SqlSession session) {
Map<String, Integer> params = new HashMap<String, Integer>();
params.put("start", 0);
params.put("count", 5);
List<Category> categories = session.selectList("listByPageXML", params);
for (Category category : categories) {
System.out.println(category);
}
} public static void annotationPage(CategoryMapper categoryMapper) {
List<Category> categories = categoryMapper.listByPage(1, 1);
for (Category category : categories) {
System.out.println(category);
}
} }

5.PageHelper

<1>使用第三方分页工具,先导入jar包:jsqlparser-1.0.jar、pagehelper-5.1.0-beta2.jar

<2>在mybatis-config.xml中配置插件。

     <plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

<3>在Category.xml中添加新的查询语句

     <select id="listByPageHelper" resultType="Category">
select * from category
</select>

<4>测试,在testPaging.java中添加新方法

     public static void pageHelper(SqlSession session) {
PageHelper.offsetPage(0, 5);
List<Category> categories = session.selectList("listByPageHelper");
for (Category category : categories) {
System.out.println(category);
}
}

笔记55 Mybatis快速入门(六)的更多相关文章

  1. MyBatis学习笔记(一)——MyBatis快速入门

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优 ...

  2. mybatis快速入门(六)

    前面mybatis的入门程序基本上都写完了,就看大家的灵活运用了,今天来吧前面的整合一下封装一个公共的BaseDao 只需要把前面的改造下然后创建一个BaseDao的接口,其它的继承BaseDao接口 ...

  3. 笔记56 Mybatis快速入门(七)

    相关概念介绍(二) 6.一级缓存 <1>在一个session里查询相同id的数据 package mybatis.annotation; import java.io.IOExceptio ...

  4. 笔记50 Mybatis快速入门(一)

    一.Mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  5. 笔记54 Mybatis快速入门(五)

    Mybatis中注解的使用 1.XML方式的CRUD 新增加接口CategoryMapper ,并在接口中声明的方法上,加上注解对比配置文件Category.xml,其实就是把SQL语句从XML挪到了 ...

  6. 笔记53 Mybatis快速入门(四)

    动态SQL 1.if 假设需要对Product执行两条sql语句,一个是查询所有,一个是根据名称模糊查询.那么按照现在的方式,必须提供两条sql语句:listProduct和listProductBy ...

  7. 笔记52 Mybatis快速入门(三)

    一.更多查询 1.模糊查询 修改Category.xml,提供listCategoryByName查询语句select * from category where name like concat(' ...

  8. 笔记51 Mybatis快速入门(二)

    Mybatis的CRUD 1.修改配置文件Category.xml,提供CRUD对应的sql语句. <?xml version="1.0" encoding="UT ...

  9. MyBatis学习总结(一)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

随机推荐

  1. Vue-cli中的静态资源管理(src/assets和static/的区别)

    资源打包 为了回答这个问题,我们需要了解webpack是如何处理静态资源的.在所有的*.vue文件中你所有的templates 和CSS 都被vue-html-loader 和css-loader 查 ...

  2. bzoj4550 小奇的博弈

    我看出了是个 Nimk 问题.... dp我明白意思,我也会推组合数.... 但是...神tm统计答案啊...蒟蒻不会~

  3. leetcode-164周赛-1268-搜索推荐系统

    题目描述: 自己的提交: class Solution: def suggestedProducts(self, products: List[str], searchWord: str) -> ...

  4. 【多线程】volatile

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  5. sql INSERT语句

    当我们需要向数据库表中插入一条新记录时,就必须使用INSERT语句. INSERT语句的基本语法是: INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1 ...

  6. Java中遍历数组的三种方式复习

    1 for循环遍历 通常遍历数组都是使用for循环来实现.遍历一维数组很简单,遍历二维数组需要使用双层for循环,通过数组的length属性可获得数组的长度. 程序示例: package captai ...

  7. 思维构造+匹配——cf1199E

    直接枚举每条边,如果边加到图中后还是个匹配图,就直接加,反之就不加 这样加完所有边后,剩下的点必定可以组成一个独立集:因为如果剩下的点中还有互相匹配的,那么这对点应该在加边时就被算到匹配图中 所以要么 ...

  8. 洛谷 2327 [SCOI2005]扫雷

    输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一列中雷的摆放方案数. 输入输出样例 输入样例#1 ...

  9. noip1998 提高组t3 挖地雷

    题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任一处 ...

  10. AcWing 144. 最长异或值路径 01字典树打卡

    给定一个树,树上的边都具有权值. 树中一条路径的异或长度被定义为路径上所有边的权值的异或和: ⊕ 为异或符号. 给定上述的具有n个节点的树,你能找到异或长度最大的路径吗? 输入格式 第一行包含整数n, ...