栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis学习笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis学习笔记

MyBatis学习笔记
  • 1、MyBatis简介
    • 1.1 什么是MyBatis
    • 1.2 持久化
    • 1.3 持久层
    • 1.4 MyBatis的优点
  • 2、使用MyBatis的步骤
    • 2.1 搭建环境
    • 2.2 导入MyBatis
    • 2.3 编写代码
    • 2.4 测试
  • 3、CRUD操作
    • 3.1 namespace
    • 3.2 select、insert、update、delete
  • 4、配置解析
    • 4.1 核心配置文件
    • 4.2 environments元素
    • 4.3 mappers元素
    • 4.4 Properties优化
    • 4.5 typeAlias优化
    • 4.6 settings
    • 4.7 typeHandlers
    • 4.8 objectFactory
  • 5、生命周期与作用域
    • 5.1 MyBatis执行过程
    • 5.2 作用域(scope)
  • 6、ResultMap
    • 6.1 解决方案
  • 7、日志
    • 7.1 日志工厂
    • 7.2 Log4j
  • 8、分页
    • 8.1 为什么需要分页?
    • 8.2 使用Limit进行分页
    • 8.3 RowBounds分页
    • 8.4 PageHelper
  • 9、使用注解开发
    • 9.1 使用步骤
    • 9.2 本质上利用了jvm的动态代理机制
    • 9.3 Mybatis详细的执行流程
    • 9.4 使用注解增删改查
    • 9.5 关于@Param
    • 9.6 #与$的区别
  • 10、一对多与多对一的处理
    • 10.1 按查询嵌套处理;
    • 10.2 按结果嵌套处理;
  • 11、动态SQL
  • 12、缓存
    • 12.1 简介
    • 12.2 Mybatis缓存
    • 12.3 一级缓存
    • 12.4 一级缓存的失效
    • 12.5 二级缓存
    • 12.6 结论
    • 12.7 缓存原理
    • 12.8 EhCache

1、MyBatis简介 1.1 什么是MyBatis
  1. 持久层框架;
  2. 几乎避免所有的JDBC代码和手动设置参数以及获取结果集的过程;
  3. 使用简单的XML或注解来配置和映射原生信息,将接口和Java的实体类映射为数据库中的记录;
  4. MyBatis官方文档:https://mybatis.org/mybatis-3/zh/index.html
  5. GitHUb:https://github.com/mybatis/mybatis-3
1.2 持久化
  1. 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。
  2. 内存断电后数据会丢失;
  3. 内存过于昂贵;
1.3 持久层
  1. 完成持久化工作的代码层;
1.4 MyBatis的优点
  1. 简单易学;
  2. 灵活:不会对应用程序或者数据库的现有设计强加任何影响;SQL语句写在XML里,便于统一管理和优化;
  3. 解除SQL语句与程序代码的耦合:通过提供DAO层,将业务逻辑与数据访问逻辑分离。是系统的设计更加清晰,更易维护,更易单元测试;
  4. 提供XML标签,支持编写动态SQL;
2、使用MyBatis的步骤 2.1 搭建环境
  1. 进行数据库准备工作;
2.2 导入MyBatis
  1. 导入相关jar包;
2.3 编写代码
  1. 编写MyBatis核心配置文件;
  2. 编写MyBatis工具类,核心代码如下:
    public class MybatisUtils {
    	private static SqlSessionFactory sqlSessionFactory; 
    	static { 
    		try {
    			String resource = "mybatis-config.xml"; 
    			InputStream inputStream = Resources.getResourceAsStream(resource);
    			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
    		} catch (IOException e) { 
    			e.printStackTrace(); 
    		} 
    	}
    	//获取SqlSession连接 
    	public static SqlSession getSession(){ 
    		return sqlSessionFactory.openSession(); 
    	} 
    }
    
  3. 创建实体类,对应数据库表结构;
  4. 编写Mapper接口;
  5. 编写Mapper.xml;
2.4 测试
  1. 编写测试类;
3、CRUD操作 3.1 namespace
  1. XML中namespace为接口完整包名;
3.2 select、insert、update、delete
  1. 增删改操作需要提交事务;
  2. 编写模糊查询Like语句时,应在Java语句中添加通配符,而不是在SQL中拼接通配符,后者可能引起SQL注入;
4、配置解析 4.1 核心配置文件
  1. mybatis-config.xml 系统核心配置文件
  2. MyBatis 的配置文件包含了影响 MyBatis 行为的设置和属性信息。
  3. 能配置的内容如下:
    configuration(配置) 
    properties(属性) 
    settings(设置) 
    typeAliases(类型别名) 
    typeHandlers(类型处理器) 
    objectFactory(对象工厂) 
    plugins(插件) 
    environments(环境配置) 
    environment(环境变量) 
    transactionManager(事务管理器) 
    dataSource(数据源) 
    databaseIdProvider(数据库厂商标识) 
    mappers(映射器) 
    
    
4.2 environments元素
  1. 可以配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定);
  2. 子元素节点:environment,具体的一套环境,通过设置id进行区别,id保证唯一!
  3. 子元素节点:数据源(dataSource)使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。数据源是必须配置的。有三种内建的数据源类型:
    unpooled: 这个数据源的实现只是每次被请求时打开和关闭连接。
    pooled: 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
    jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
    
  4. 数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等…
4.3 mappers元素
  1. mappers:映射器,定义映射SQL语句文件,告诉 MyBatis 到哪里去找到这些语句;
  2. 引入资源方式:
     
     
    	 
    
    
     
     
    	 
    
    
     
     
    	 
    
    
     
     
    	 
    
    
  3. Mapper文件
     
     
     
    
    
    
    namespace和子元素的id联合保证唯一 , 区别不同的mapper;
    namespace的命名必须跟某个接口同名;
    接口中的方法与映射文件中sql语句id应该一一对应;
    namespace命名规则 : 包名+类名;
4.4 Properties优化
  1. 在资源目录下新建一个db.properties:
    driver=com.mysql.jdbc.Driver 
    url=jdbc:mysql://localhost:3306/mybatis? 
    useSSL=true&useUnicode=true&characterEncoding=utf8 
    username=root 
    password=123456
    
  2. 将文件导入properties 配置文件:
     
    	 
    	 
    	 
    		 
    			 
    			 
    				 
    				 
    				 
    				
    			 
    		 
    	 
    	 
    		 
    	 
    
    
4.5 typeAlias优化
  1. 类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
     
    	 
    
    
4.6 settings
  1. 官方文档:https://mybatis.org/mybatis-3/zh/configuration.html#settings
  2. 一个完整的settings元素的示例如下:
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    
4.7 typeHandlers
  1. 官方文档:https://mybatis.org/mybatis-3/zh/configuration.html#typeHandlers
4.8 objectFactory
  1. 官方文档:https://mybatis.org/mybatis-3/zh/configuration.html#objectFactory
5、生命周期与作用域 5.1 MyBatis执行过程

5.2 作用域(scope)
  1. SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
  2. SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。因为MyBatis 的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个MyBatis 的应用之中,所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用MyBatis 应用,所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。
  3. 由于 SqlSessionFactory 是一个对数据库的连接池,所以它占据着数据库的连接资源。如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例,让它在应用中被共享。所以说 SqlSessionFactory 的最佳作用域是应用作用域。
  4. 如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。所以 SqlSession 的最佳的作用域是请求或方法作用域
6、ResultMap
  • 要解决的问题:属性名和字段名不一致
6.1 解决方案
  1. 为列名指定别名;
  2. 采用ResultMap:
     
    	 
    	 
    	 
    	 
    	 
     
    
     
    	select * from user limit #{startIndex},#{pageSize} 
    
    
  3. Mapper接口,参数为map:
    //选择全部用户实现分页 
    List selectUser(Map map);
    
  4. 在测试类中传入参数测试,起始位置 = (当前页面 - 1 ) * 页面大小:
    //分页查询 , 两个参数startIndex , pageSize 
    @Test 
    public void testSelectUser() { 
    	SqlSession session = MybatisUtils.getSession();
    	UserMapper mapper = session.getMapper(UserMapper.class); 
    	int currentPage = 1; //第几页 
    	int pageSize = 2; //每页显示几个 
    	Map map = new HashMap(); 
    	map.put("startIndex",(currentPage-1)*pageSize); 
    	map.put("pageSize",pageSize); 
    	List users = mapper.selectUser(map); 
    	for (User user: users){ 
    		System.out.println(user); 
    	}
    	session.close(); 
    }
    
8.3 RowBounds分页
  1. mapper接口:
    //选择全部用户RowBounds实现分页 
    List getUserByRowBounds();
    
  2. mapper文件: