相关概念介绍(一)
1.日志
有时候需要打印日志,知道mybatis执行了什么样的SQL语句,以便进行调试。这时,就需要开启日志,而mybatis自身是没有带日志的,使用的都是第三方日志,这里介绍如何开启log4j日志功能。
在src目录下,新建文件log4j.properties,其作用是输出mybatis包下参与Mybatis的类的SQL语句输出:
1 # Global logging configuration 2 log4j.rootLogger=ERROR, stdout 3 # MyBatis logging configuration... 4 log4j.logger.mybatis=TRACE 5 # Console output... 6 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 7 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 8 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
2.事务管理
在一个事务中,只要有一个操作发生错误,那么其他的操作也无效。在Mysql中,只有当表的类型是INNODB的时候,才支持事务。
3.延迟加载
基于注解方式的一对多来了解延迟加载的配置办法。
<1>测试代码,一种分类对应多个产品。但是当只获取分类,不获取产品名字的时候,通过执行日志的输出可以发现,获取产品的sql语句也执行了。
1 package mybatis.annotation; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.List; 6 7 import org.apache.ibatis.session.SqlSession; 8 import org.apache.ibatis.session.SqlSessionFactory; 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 10 11 import mybatis.mapper.CategoryMapper; 12 import mybatis.pojo.Category; 13 14 public class testOneToMany { 15 16 public static void main(String[] args) throws IOException { 17 // TODO Auto-generated method stub 18 String resource = "mybatis-config.xml"; 19 InputStream inputStream = org.apache.ibatis.io.Resources.getResourceAsStream(resource); 20 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 21 SqlSession session = sqlSessionFactory.openSession(); 22 CategoryMapper categoryMapper = session.getMapper(CategoryMapper.class); 23 24 listAll(categoryMapper); 25 26 session.commit(); 27 session.close(); 28 } 29 30 private static void listAll(CategoryMapper mapper) { 31 List<Category> categories = mapper.list2(); 32 for (Category c : categories) { 33 System.out.println(c.getName()); 34 // List<Product> products = c.getProducts(); 35 // if (products.size() != 0) { 36 // for (Product product : products) { 37 // System.out.println(" " + product.getName()); 38 // } 39 // } 40 } 41 } 42 43 }
执行结果:
<2>在mybatis-config.xml中添加延迟加载配置。
1 <settings> 2 <!-- 打开延迟加载的开关 --> 3 <setting name="lazyLoadingEnabled" value="true"/> 4 <!-- 将积极加载改为消息加载,即按需加载 --> 5 <setting name="aggressiveLazyLoading" value="false"/> 6 </settings>
<3>执行相同的操作,可以看到,当只查询category中的数据时,并没有查询product表中的数据。
<4>只有在查询产品的时候,才会看到相应的SQL语句。(把代码中的注释去掉,输出产品名称)
4.分页
<1>增加100条记录
1 public static void add(CategoryMapper categoryMapper) { 2 for (int i = 0; i < 100; i++) { 3 Category category = new Category(); 4 category.setName("category name " + i); 5 categoryMapper.add(category); 6 } 7 }
<2>进行分页查询
①xml方式
在Category.xml下添加如下代码:
1 <select id="listByPage" resultType="Category"> 2 select * from category 3 <if test="start!=null and count!=null"> 4 limit #{start},#{count} 5 </if> 6 </select>
②注解方式
在CategoryMapper.java中添加如下代码:
1 @Select("select * from category limit #{start},#{count}") 2 public List<Category> listByPage(@Param("start") int start, @Param("count") int count);
<3>测试
1 package mybatis.annotation; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.HashMap; 6 import java.util.List; 7 import java.util.Map; 8 9 import org.apache.ibatis.session.SqlSession; 10 import org.apache.ibatis.session.SqlSessionFactory; 11 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 12 13 import mybatis.mapper.CategoryMapper; 14 import mybatis.pojo.Category; 15 16 public class testPaging { 17 18 public static void main(String[] args) throws IOException { 19 // TODO Auto-generated method stub 20 String resource = "mybatis-config.xml"; 21 InputStream inputStream = org.apache.ibatis.io.Resources.getResourceAsStream(resource); 22 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 23 SqlSession session = sqlSessionFactory.openSession(); 24 CategoryMapper categoryMapper = session.getMapper(CategoryMapper.class); 25 26 // add(categoryMapper); 27 // xmlPage(session); 28 annotationPage(categoryMapper); 29 session.commit(); 30 session.close(); 31 } 32 33 public static void list(CategoryMapper categoryMapper) { 34 List<Category> categories = categoryMapper.list(); 35 for (Category category : categories) { 36 System.out.println(category); 37 } 38 } 39 40 public static void add(CategoryMapper categoryMapper) { 41 for (int i = 0; i < 100; i++) { 42 Category category = new Category(); 43 category.setName("category name " + i); 44 categoryMapper.add(category); 45 } 46 } 47 48 public static void xmlPage(SqlSession session) { 49 Map<String, Integer> params = new HashMap<String, Integer>(); 50 params.put("start", 0); 51 params.put("count", 5); 52 List<Category> categories = session.selectList("listByPageXML", params); 53 for (Category category : categories) { 54 System.out.println(category); 55 } 56 } 57 58 public static void annotationPage(CategoryMapper categoryMapper) { 59 List<Category> categories = categoryMapper.listByPage(1, 1); 60 for (Category category : categories) { 61 System.out.println(category); 62 } 63 } 64 65 }
5.PageHelper
<1>使用第三方分页工具,先导入jar包:jsqlparser-1.0.jar、pagehelper-5.1.0-beta2.jar
<2>在mybatis-config.xml中配置插件。
1 <plugins> 2 <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin> 3 </plugins>
<3>在Category.xml中添加新的查询语句
1 <select id="listByPageHelper" resultType="Category"> 2 select * from category 3 </select>
<4>测试,在testPaging.java中添加新方法
1 public static void pageHelper(SqlSession session) { 2 PageHelper.offsetPage(0, 5); 3 List<Category> categories = session.selectList("listByPageHelper"); 4 for (Category category : categories) { 5 System.out.println(category); 6 } 7 }