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

Mybatis

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

Mybatis

文章目录
  • MyBatis
    • 基本介绍
    • MyBatis开发(常规)
    • MyBatis开发(接口)
    • MyBatis开发(注解)
    • MyBatis的基本架构
    • MyBatis的作用域和生命周期
      • 1. 作用域
      • 2. SqlSessionFactory对象的自定义获取
    • MyBatis的简单封装
    • 核心配置文件Configuration.xml的几种元素
      • ① properties
      • ② Settings
      • ③ typeAliases
      • ④ Typehandlers
      • ⑤ Plugins
      • ⑥ Environments
      • ⑦ databaseIdProvider
      • ⑧ Mappers
    • 核心映射文件Mappers.xml
      • 1. 修改sql操作
      • 2. 入参处理
      • 3. Sql中的取值方式
      • 4. 返回值类型的处理
      • 5. select元素
      • 6. 返回结果映射规则
    • 级联关系-association
      • 1. N-1
        • 方式一:对象限定符
        • 方式二:association赋值
        • 方式三:分步查询
      • 2. 1-N
        • 方式一:collection元素进行赋值
        • 方式二:分步查询
      • 3. Discriminator鉴别器
    • 动态sql
      • 1. if
      • 2. choose
      • 3. where
      • 4. trim
      • 5. set
      • 6. foreach
      • 7. bind标签
      • 8. Sql片段
    • MyBatis内置参数
    • 特殊字符处理
    • MyBatis的缓存
      • 一级缓存LocalCaching
      • 二级缓存CachingExecutor
      • 第三方缓存接口Ehcache
    • SSM框架整合
    • MBG
    • MyBatis源码分析

MyBatis 基本介绍

Hibernate:全自动化的持久化(把内存中的瞬时数据永久的保存在磁盘上/数据库中的过程)框架

MyBatis:ORM 半自动化的持久化框架(SQL语句可以自己管理)

都是ORM (对象 关系 映射)框架

  • O:javabean
  • R:关系型数据库
  • M:映射

MyBatis开发(常规)

① 下载地址

https://github.com/mybatis/mybatis-3/releases

https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.4.6

② 导入相应jar

③ 创建核心配置文件




	
		
			
			
				
				
				
				
			
		
	
	
	
	
		
	

​ 在url后加上?useUnicode=true&characterEncoding=utf8是因为可能会出现字符集不匹配的问题

④ 创建实体映射bean

⑤ 创建sql映射文件(mapper文件)




	
		select * from usertable where uid = #{uid}
	

③ 测试

mybatis通过接口方式是以Java动态代理模式进行实现的。

MyBatis开发(注解)

① 无需创建xml映射文件

② 创建接口DAO,并在接口方法前通过@Select定义sql语句

​ “_name” --> @Param指定当前参数(sql中)的值

③ 在核心配置文件(configuration.xml)中加载接口

④ 测试

以接口的方式进行测试即可

MyBatis的基本架构

MyBatis的作用域和生命周期 1. 作用域

●SqISessionFactoryBuilder

​ 可以在任何时候被实例化、使用和销毁。一旦您创造 了SqISessionFactory就不需要再保留它

●SqlSessionFactory

​ SqlSessionFactory 一旦创建将会存在于您的应用程序整个运行生命周期中,不要在一个应用中多次创 建SqlSessionFactory

●SqISession

​ 每个线程都有一个SqlSession 实例,SqlSession 实例是不被共享的,并且是线程不安全的作用域是request或者method

2. SqlSessionFactory对象的自定义获取
import java.beans.PropertyVetoException;
import javax.sql.DataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import bean.User;
import dao.UserDao;

public class Test2 {

	public static void main(String[] args) {

		TransactionFactory transactionFactory = new JdbcTransactionFactory();
		Environment environment = new Environment("deve", transactionFactory, getDataSource());
		Configuration config = new Configuration(environment);
		
		//加载映射文件
		config.addMapper(UserDao.class);
		
		SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
		SqlSession session = ssf.openSession();
		System.out.println("----------注解方式-------------");
		UserDao userdao = session.getMapper(UserDao.class);
		int i = userdao.selectUidByName("吴治峰");
		System.out.println(i);
		session.close();

	}

	private static DataSource getDataSource() {
		
		ComboPooledDataSource ds = new ComboPooledDataSource();
		try {
			ds.setDriverClass("com.mysql.cj.jdbc.Driver");
			ds.setJdbcUrl("jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC");
			ds.setUser("root");
			ds.setPassword("123456");
		} catch (PropertyVetoException e) {
			e.printStackTrace();
		}
		return ds;
	}

}
MyBatis的简单封装
package utils;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class GetSqlSession {
	
	
	public static SqlSession getSqlSession() {
		
		String resource = "configuration.xml";
		Reader reader = null;
		try {
			reader = Resources.getResourceAsReader(resource);
		} catch (IOException e) {
			e.printStackTrace();
		}
		SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = ssf.openSession();
		return session;
	}
	
	
}

核心配置文件Configuration.xml的几种元素

① properties

引入外部属性文件

② Settings

设置或改变Mybatis运行过程中的行为方式

如上例子:mapUnderscoreToCamelCase选项开启,则开启驼峰命名映射,

如果数据库字段为A_NAME,则会映射为aName,首字母小写,去掉下划线,后面驼峰

③ typeAliases

别名使用注意:

④ Typehandlers

⑤ Plugins

⑥ Environments

⑦ databaseIdProvider

⑧ Mappers

核心映射文件Mappers.xml

1. 修改sql操作
public class Test4 {

	public static void main(String[] args) {

		String resource = "configuration.xml";
		SqlSession session = GetSqlSession.getSqlSession(resource);
		
		User user = new User(0,"张五","24",1);
		UserDao userdao = session.getMapper(UserDao.class);
		int i = userdao.insert(user);
		if( i == 1) {
			System.out.println("插入成功");
		} else {
			System.out.println("插入失败");
		}
		//session.commit();需要此函数才能提交到数据库
		//或者SqlSession session = ssf.openSession(true);
        //封装在了GetSqlSession.getSqlSession()里
		session.close();

	}

}

	
		select uid,name,sex from usertable where name like #{name,jdbcType=NULL} order by #{sex}
	

③ Map

A、返回单条记录:key就是列名,value为列的值,resultType=”map”/“Map”

public Map selectMapOne(int uid);

		select uid,name,sex from usertable where uid < #{uid}
	
System.out.println("--------返回List---------");
		User user = new User(5, "张%", "age", 1);
		List list = userdao.selectParam(user);
		for(User t :list) {
			System.out.println(t);
		}
		
		System.out.println("--------返回Map(单条记录)---------");
		Map map = userdao.selectMapOne(1);
		for(Entry entry : map.entrySet()) {
			System.out.println(entry.getKey()+":"+entry.getValue());
		}
		
		System.out.println("--------返回Map(多条记录)---------");
		Map map1 = userdao.selectMap(5);
		for(Entry entry : map1.entrySet()) {
			System.out.println(entry.getKey()+":"+entry.getValue());
		}
符号转义字符说明
<<小于
<=<=小于等于
>>大于
>=>=大于等于
&&逻辑与
‘xxx’'单引号
“xxx”"双引号
5. select元素

① parameterType可省略,mybatis会根据TypeHandler.class and TypeHandlerRegistry.class进行自动匹配转换

② 元素属性

6. 返回结果映射规则

① 可在全局setting中进行设置,实现的是自动映射

Setting的属性:默认是开启自动映射的功能,要求列名和属性名要一致,如果把值设为null,则取消自动映射

② 驼峰映射规则:A_COLUMN 自动映射成属性 aColumn,需要开启mapUnderscoreToCamelCase

③ 手动映射配置

级联关系-association 1. N-1 方式一:对象限定符

① 在N端定义1端的对象属性

② 定义resultMap映射


		
		
		
		
		
		
	

③ Sql语句

	
		select aid,aname from address where aid = #{aid}
		 

② 在N端通过association元素进行映射

	
		
		
		
		
		
        
		
	

		select a.aid aid,aname,uid,name from address a, usertable u
		where a.aid = u.aid and a.aid = #{aid}
	
方式二:分步查询

		
		
		
		
		
	

	
		select uid,name from usertable 
				where aid = #{aid}
		

注意:映射文件中的sql元素需要和接口中的方法名要一致,mybatis是通过接口的动态代理去调用sql元素

懒加载策略和N-1中的一致

分步查询中传递多个参数:

把1端的多个元素作为查询的条件

延迟加载策略属性:

3. Discriminator鉴别器

根据得到的某个参数值,不同的值/情况将会有不同的动作,其实就是if/else

动态sql

动态sql可以灵活的根据业务逻辑条件自动组装最终执行的sql语句

OGNL:对象图导航语言,object.name

先附上测试:

public static void main(String[] args) {

		String resource = "configuration.xml";
		SqlSession session = GetSqlSession.getSqlSession(resource);
		
		UserDao userDao = session.getMapper(UserDao.class);
		User user = new User(0, "张%", "45", 1);
		
//		System.out.println("----------动态sql:if/choose-----------");
//		List userlist = userDao.getUser_if_choose(user);
//		for(User u : userlist) {
//			System.out.println(u);
//		}
		
//		System.out.println("----------动态sql:where/trim-----------");
//		List userlist1 = userDao.getUser_where_trim(user);
//		for(User u : userlist1) {
//			System.out.println(u);
//		}
		
//		System.out.println("----------动态sql:set-----------");
//		User user1 = new User(9, "王五", "45", 0);
//		int i = userDao.updateUser_set(user1);
//		System.out.println(i);
		
		System.out.println("----------动态sql:foreach-----------");
		List list = Arrays.asList(1,2,4,5,9);
		List userlist2 = userDao.getUser_foreach(list);
		for(User u : userlist2) {
			System.out.println(u);
		}
		session.close();

	}
1. if

​ test是条件,特殊字符用转义字符来写,&—>& “”

2. choose

从多个选项中选择一个值,类似switch…case

子标签:when otherwise

	
		select 
			from usertable
			
			 
			 	
					 and name like #{name}
				
				
					and sex = #{sex}
				
			 
	
5. set
	
		update usertable
		
			
				name = #{name},
			
			
				age = #{age},
			
		
		where uid = #{uid}
	

使用trim替换set实现:

6. foreach

接口中的参数可以是集合或数组类型,MyBatis会把参数自动的封装成Map对象,其中List对象的key是“list”,数组对象的key是”array”。


批量保存:

7. bind标签

把某一个参数值绑定到上下文中的一个变量中,可以在sql中重复使用

8. Sql片段

MyBatis内置参数

特殊字符处理

MyBatis的缓存

MyBatis中默认的缓存有两级缓存,分别是一级缓存和二级缓存

一级缓存LocalCaching

与数据库在同一次会话期间所查询的数据会自动缓存到一级缓存中(本地缓存),如果后续对相同数据的查询,那么就会直接从本地缓存中进行获取,就不会再去查询数据库了。

		String resource = "configuration.xml";
		SqlSession session = GetSqlSession.getSqlSession(resource);
		//注意是同一个session
		UserDao userDao = session.getMapper(UserDao.class);
		//首次查询的结果会放入一级缓存中
		User user = userDao.selectUser(1);
		System.out.println(user);
		//第二次查询相同的数据时就直接从以及缓存中获取
		User user1 = userDao.selectUser(1);
		System.out.println(user1);
		System.out.println(user==user1);
		session.close();

二级缓存CachingExecutor

① 二级缓存介绍

import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import bean.User;
import dao.UserDao;

public class TestGlobalCache {

	public static void main(String[] args) {

		String resource = "configuration.xml";
		Reader reader = null;
		try {
			reader = Resources.getResourceAsReader(resource);
		} catch (IOException e) {
			e.printStackTrace();
		}
		SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = ssf.openSession(true);
		UserDao userDao = session.getMapper(UserDao.class);
		//首次查询的结果放在一级缓存里
		User user = userDao.selectUser(1);
		System.out.println(user);
		//关闭session,会把一级缓存里的内容转移到二级缓存里
		session.close();
		
		SqlSession session1 = ssf.openSession(true);
		UserDao userDao1 = session1.getMapper(UserDao.class);
		//查找: 先二级缓存,在一级缓存,最后DB
		User user1 = userDao1.selectUser(1);
		System.out.println(user1);
		System.out.println(user==user1);//true
		session1.close();

	}

}

SqlSessionFactory要是同一个!!!

③ 二级缓存的运行过程

第三方缓存接口Ehcache

MyBatis主要是处理ORM的业务,并非专门做缓存处理的,MyBatis定义了Cache缓存接口方便开发者自定义缓存扩展,MyBatis官方提供了很多种集成缓存的Adapter适配器。

Ehcache是纯java写的缓存框架,是Hibernate中默认的缓存策略。

SSM框架整合

SSM主要是指spring和mybatis的整合,spring和mybatis的整合需要在mybatis官网上下载mybatis-spring.jar整合包

① 创建web工程,引入ssm的jar

② 搭建Mybatis的环境

③ 搭建SpringMVC的环境

④ 搭建Spring的环境(Spring整合MyBatis的配置)

MBG

MyBatis源码分析


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1023232.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号