什么是 MyBatis?

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

与Hibernate比较

  • mybatis:更加轻巧,简单,性能优,可以针对sql优化,学习成本低。
  • Hibernate:数据库无关性好,O/R映射能力强,开发效率高,学习成本高,且难精通。
  • 总结:两者都是非常优秀的持久层框架,精通后能大大提高开发效率。不过,个人更倾向于mybatis,轻巧,灵活,且性能优。

Mybatis官方架构图

相关入门知识见官方文档(有中文)

http://mybatis.github.io/mybatis-3/zh/getting-started.html

下面是一个spring+mybatis用注解的方式基于ehcache实现二级缓存的简单例子

mybatis-configuration.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
  8. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  9. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  10. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
  11. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
  12. http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring
  13. http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd">
  14. <context:component-scan base-package="com.dempe.summer.app.user" />
  15.  
  16. <!-- Enables the Spring MVC @Controller programming model -->
  17. <mvc:annotation-driven />
  18. <ehcache:annotation-driven cache-manager="ehCacheManager" />
  19.  
  20. <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
  21. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  22. <property name="url" value="jdbc:mysql://172.30.254.38:5000/test" />
  23. <property name="username" value="azheng" />
  24. <property name="password" value="123" />
  25. </bean>
  26.  
  27. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  28. <property name="dataSource" ref="dataSource" />
  29. </bean>
  30.  
  31. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  32. <property name="basePackage" value="com.dempe.summer.app.user.persist" />
  33. </bean>
  34.  
  35. <bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
  36. <property name="configLocation" value="classpath:ehcache-mybatis.xml" />
  37. </bean>
  38.  
  39. </beans>

MapperScannerConfigurer

没有必要在 Spring 的 XML 配置文件中注册所有的映射器。相反,你可以使用一个 MapperScannerConfigurer , 它 将 会 查 找 类 路 径 下 的 映 射 器 并 自 动 将 它 们 创 建 成 MapperFactoryBean。

basePackage 属性是让你为映射器接口文件设置基本的包路径。 你可以使用分号或逗号 作为分隔符设置多于一个的包路径。每个映射器将会在指定的包路径中递归地被搜索到。

ehcache-mybatis.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false">
  4. <!--
  5. | Please see http://ehcache.sourceforge.net/documentation/configuration.html for
  6. | detailed information on how to configurigure caches in this file
  7. +-->
  8. <!-- Location of persistent caches on disk -->
  9. <diskStore path="java.io.tmpdir/EhCacheSpringAnnotationsExampleApp" />
  10.  
  11. <defaultCache eternal="false" maxElementsInMemory="1000"
  12. overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
  13. timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>
  14.  
  15. <cache name="testCache" eternal="false"
  16. maxElementsInMemory="100" overflowToDisk="false" diskPersistent="false"
  17. timeToIdleSeconds="0" timeToLiveSeconds="300"
  18. memoryStoreEvictionPolicy="LRU" />
  19.  
  20. </ehcache>

  log4j.properties

  1. # Global logging configuration
  2. log4j.rootLogger=info, stdout
  3. # MyBatis logging configuration...
  4. log4j.logger.org.mybatis.example.BlogMapper=DEBUG
  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
  9.  
  10. log4j.logger.java.sql=info,stdout

  

 log4j.logger.java.sql=info,stdout,打开sql语句开关,级别为info,可以输出sql语句,方便查看缓存是否生效

UserModel

  1. package com.dempe.summer.app.user.model;
  2.  
  3. import java.io.Serializable;
  4.  
  5. /**
  6. * @author: Zheng Dongping
  7. * @version 1.0 date: 2013-12-23
  8. */
  9. public class UserModel implements Serializable {
  10.  
  11. private static final long serialVersionUID = 1L;
  12.  
  13. private Integer id;
  14.  
  15. private String username;
  16.  
  17. private String password;
  18.  
  19. public Integer getId() {
  20. return id;
  21. }
  22.  
  23. public void setId(Integer id) {
  24. this.id = id;
  25. }
  26.  
  27. public String getUsername() {
  28. return username;
  29. }
  30.  
  31. public void setUsername(String username) {
  32. this.username = username;
  33. }
  34.  
  35. public String getPassword() {
  36. return password;
  37. }
  38.  
  39. public void setPassword(String password) {
  40. this.password = password;
  41. }
  42.  
  43. }

这里应该会有一些和数据库表建立映射关系的注解。  

UserMapper

  1. package com.dempe.summer.app.user.persist;
  2.  
  3. import org.apache.ibatis.annotations.Param;
  4. import org.apache.ibatis.annotations.Select;
  5.  
  6. import com.dempe.summer.app.user.model.UserModel;
  7. import com.googlecode.ehcache.annotations.Cacheable;
  8.  
  9. /**
  10. * @author: Zheng Dongping
  11. * @version 1.0 date: 2013-12-23
  12. */
  13. public interface UserMapper {
  14.  
  15. @Select("SELECT * FROM user_info WHERE username = #{username} and password = #{password}")
  16. UserModel findUserByNameAndPassword(UserModel user);
  17.  
  18. @Cacheable(cacheName = "testCache")
  19. @Select("SELECT * FROM user_info WHERE username = #{username}")
  20. UserModel findUserByName(@Param("userName") String userName);
  21.  
  22. }

之前用mybatis一直是xml配置mapper的方式,现在发现了注解,所以尝试了用注解,感觉很方便。

但貌似官方比较推崇xml方式,说mybatis的核心功能都在xml中体现。随着深入了解,没有找到Mapper可以继承的辅助类,所以基础的curd都得自己写。

有网友写了依赖org.apache.ibatis.jdbc.SqlBuilder写了通用的模板,但是现在SqlBuilder已经不被推荐使用,所以建议mybatis正式项目还是用回xml配置的方式,发挥最大的功效。

junit测试类

  1. package com.dempe.summer.mybatis;
  2.  
  3. import javax.annotation.Resource;
  4.  
  5. import org.junit.Test;
  6. import org.junit.runner.RunWith;
  7. import org.springframework.test.context.ContextConfiguration;
  8. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  9.  
  10. import com.dempe.summer.app.user.model.UserModel;
  11. import com.dempe.summer.app.user.persist.UserMapper;
  12.  
  13. /**
  14. * @author: Zheng Dongping
  15. * @version 1.0 date: 2013-12-23
  16. */
  17. @ContextConfiguration("/mybatis-configuration.xml")
  18. @RunWith(SpringJUnit4ClassRunner.class)
  19. public class MybatisTest {
  20.  
  21. @Resource
  22. private UserMapper userMapper;
  23.  
  24. @Test
  25. public void test() {
  26. UserModel user = new UserModel();
  27. user.setPassword("123");
  28. user.setUsername("dempe");
  29. UserModel um2 = userMapper.findUserByName("dempe");
  30. for (int i = 0; i < 100; i++) {
  31. userMapper.findUserByName("dempe");
  32. }
  33.  
  34. System.out.println("-----------------------------------------------");
  35. for (int i = 0; i < 10; i++) {
  36. userMapper.findUserByNameAndPassword(user);
  37. }
  38.  
  39. System.out.println(um2.getUsername());
  40. }
  41.  
  42. }

 通过日志可以看到,findUserByName方法是有读到缓存的。

java 持久框架mybatis的初步学习的更多相关文章

  1. Java数据持久层框架 MyBatis之API学习一(简介)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  2. Java数据持久层框架 MyBatis之API学习八(Java API详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  3. Java数据持久层框架 MyBatis之API学习九(SQL语句构建器详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  4. Java数据持久层框架 MyBatis之API学习七(动态 SQL详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  5. Java数据持久层框架 MyBatis之API学习六(Mapper XML 文件详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  6. Java数据持久层框架 MyBatis之API学习四(xml配置文件详解)

    摘录网址: http://blog.csdn.net/u010107350/article/details/51292500 对于MyBatis的学习而言,最好去MyBatis的官方文档:http:/ ...

  7. Java数据持久层框架 MyBatis之API学习二(入门)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  8. Java数据持久层框架 MyBatis之API学习十(Logging详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  9. Java数据持久层框架 MyBatis之API学习五(Mapper XML 文件)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

随机推荐

  1. C#计算一段程序运行时间的三种方法

    第一种方法利用System.DateTime.Now: static void SubTest() { DateTime beforDT = System.DateTime.Now; //耗时巨大的代 ...

  2. 查找(四)-------基于B树的查找和所谓的B树

    关于B树,不想写太多了,因为花在基于树的查找上的时间已经特么有点多了,就简单写写算了,如果以后有需要,或者有时间,可以再深入写写 首先说一下,为什么要有B树,以及B树是什么,很多数据结构和算法的书上来 ...

  3. IntelliJ运行下载的Servlet时报错 Error running Tomcat 8.5.8: Unable to open debugger port (127.0.0.1:49551): java.net.SocketException

    学习Java Servlet时,从Wrox上下载了示例代码,准备run/debug时发现以下错误: Error running Tomcat 8.5.8: Unable to open debugge ...

  4. Python为8bit深度图像应用color map

    图片中存在着色版的概念,二维矩阵的每个元素的值指定了一种颜色,因此可以显示出彩色. 迁移调色板 下述python代码将VOC数据集中的某个语义分割的图片的调色板直接应用在一个二维矩阵代表的图像上 #l ...

  5. php 使用函数中遇到的坑之----strpos

    strpos — 查找字符串首次出现的位置 mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) <?ph ...

  6. v-for遍历出的元素上添加click事件,获取对应元素上的属性id值

    <span v-for="(n,nav) in floorList" data-id="{{nav.itemId}}" v-on:click=" ...

  7. vue2.0---模板语法

    ***插值 #文本 数据绑定最常见的形式就是双大括号的形式: <div id="app">{{message}}</div> 只要绑定的属性message上 ...

  8. spring mvc 的jpa JpaRepository数据层 访问方式汇总

    本文转载至:http://perfy315.iteye.com/blog/1460226 AppleFramework在数据访问控制层采用了Spring Data作为这一层的解决方案,下面就对Spri ...

  9. myeclipse环境下开发freemarker

    最近在着手一个项目,其中就要使用到freemarker模版,当把html漂亮写完时,改写成freemarker时,问题来了.全屏都是白底黑色,没有高亮显示,没有语法提示,不能格式化.看着眼花,还容易出 ...

  10. android 一些常用开源框架

    网络请求compile 'com.squareup.okhttp:okhttp:2.6.0'okhttp依赖compile 'com.squareup.okio:okio:1.6.0'json解析co ...