MyBatis快速入门 配置文件解析 动态sql

mybatis 基础目标

目标
1.Mybatis概述
2.MyBatis快速入门
3.配置文件解析(mybatis 的核心)
4.mapper配置文件解析
5.动态SQL

Mybatis概述

ORM ,即对象关系映射(ORM Obeject Relational Mapping) 。ORM模型就是数据库的表与简单Java对象(POJO)的映射模型,它主要解决数据库数据和POJO对象的相互映射。

对象关系映射

1.ORM 与JDBC的区别

/*jdbc代码*/
...
Connection conn =null;
statement state=null;
try{
	//注册mysql 驱动
	class.forName(“com.mysql.jdbc.Driver”);
	//建立数据库连接
	conn=DriverManager.getConnection();
	//建立运行对象
	Statement st = connection.createStatement();
	// prepareStatement 和 Statement 区别?前者高效且可以防止sql注入,这里不做过多的解释
	//运行sql语句
	String sql="..";
	//需要设置事务手动提交用于回滚事务
	ResultSet rs=st.executeQuery(sql)
	//st.executeUpdate(sql)
	//处理运行结果
	if (rs.next()) {
		...
	}
}catch(){
}finally{
 //关闭连接
 rs.close();
 st.close();
 conn.close();
}

JDBC操作数据库——步骤:

第1步:注册驱动 (仅仅做一次)
第2步:建立连接(Connection)
第3步:创建运行SQL的语句(Statement)
第4步:运行语句
第5步:处理运行结果(ResultSet)
第6步:释放资源*

传统的JDBC编程存在的弊端:

1.工作量大,操作数据库至少要5步;
2.业务代码和技术代码高耦合;
3.连接资源手动关闭,带来了隐患;

ORM优势

1.工作量减少了,更加贴合面向对象的编程语意
2.业务代码和技术代码解耦
3.连接资源自动关闭

ORM 下的两大框架hibernate和mybatis的区别?

hibernate 优劣

缺点
1.无法自定义组装sql,复杂的关联关系以及复杂的sql语句处理支持弱
2.不支持存储过程
3.HQL黑盒封装,调优复杂。
4.性能较差,不适合大型互联网高性能要求,适合OA,ERP等办公管理系统。
优点
1.不需要写sql语句
2.移植性好
3.二级缓存良好

mybatis 优劣

缺点
1.需要写大量的sql语句,工作量大。
2.移植性弱
优点
1.学习门槛低,易于维护
2.高度灵活,几乎可以取代JDBC
3.调优方便,基于底层SQL的优化能力
4.性能较高。

2.MyBatis快速入门

mybatis 是面向接口编程。

其原因是它是通过xml配置文件直接映射到mapper接口上的,而没有具体实现,我们用的时候就是直接调用mapper接口。

mybatis执行流程

SqlSessionFactoryBuilder:读取配置信息创建SqlSessionFactory,建造者模式,方法级别生命周期;
SqlSessionFactory:创建Sqlsession,工厂单例模式,存在于程序的整个生命周期;
SqlSession:代表一次数据库连接,可以直接发送SQL执行,也可以通过调用Mapper访问数据库;线程不安全,要保证线程独享(方法级);
SQL Mapper:由一个Java接口和XML文件组成,包含了要执行的SQL语句和结果集映射规则。方法级别生命周期;
config.xml是mybatis核心配置文件

	private SqlSessionFactory sqlSessionFactory;

	@Before
	public void init() throws IOException {
		String resource = "config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 1.读取mybatis配置文件创SqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		inputStream.close();
	}

	@Test
	// 测试自动映射
	public void testAutoMapping() throws IOException {
		// 2.获取sqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 3.获取对应mapper
		TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
		// 4.执行查询语句并返回结果
		TUser user = mapper.selectByPrimaryKey(1);
		System.out.println(user);
	}

3.配置文件解析(mybatis 的核心)

属性名 说明 备注
properties 定义配置,配置的属性可以在整个配置文件中其他位置进行引用; 重要,优先使用property配置文件解耦
settings 设置,用于指定MyBatis的一些全局配置属性,这些属性非常重要,它们会改变MyBatis的运行时行为; 重要
typeAliases 别名,为Java类型设置一个短的名字,映射时方便使用;分为系统定义别名和自定义别名; 可以通过xml和注解配置
typeHandlers 用于jdbcType与javaType之间的转换 用于jdbcType与javaType之间的转换;
plugins 插件,MyBatis允许你在已映射的语句执行过程中的某一点进行拦截调用; 重要
environments 用于配置多个数据源,每个数据源分为数据库源和事务的配置; 在多数据源环境使用
ObjectFactory MyBatis每次创建结果对象的新实例时,它都会使用对象工厂(ObjectFactory)去构建POJO 大部分场景下无需修改
mappers 配置引入映射器的方法。可以使用相对于类路径的资源引用、或完全限定资源定位符(包括file:///的URL),或类名和包名等等 重要

config.xml

4.mapper配置文件解析

cache – 给定命名空间的缓存配置。
cache-ref – 其他命名空间缓存配置的引用。
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
sql – 可被其他语句引用的可重用语句块。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句

insert 标签,delete 标签,select标签,update标签
其传递多个查询入参时规范如下:

使用map传递参数;可读性差,导致可维护性和可扩展性差,杜绝使用;
使用注解传递参数;直观明了,当参数较少一般小于5个的时候,建议使用;
使用Java Bean的方式传递参数;当参数大于5个的时候,建议使用;

自动映射使用resultType

自动映射前提:SQL列名和JavaBean的属性是一致的;
自动映射等级autoMappingBehavior设置为PARTIAL,需要谨慎使用FULL;
如果列名和JavaBean不一致,但列名符合单词下划线分割,Java是驼峰命名法,则mapUnderscoreToCamelCase可设置为true;

一般企业上用的是resultMap 手动映射
resultMap标签

constructor - 用于在实例化类时,注入结果到构造方法中
idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
arg - 将被注入到构造方法的一个普通结果
id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
result – 注入到字段或 JavaBean 属性的普通结果
association – 一个复杂类型的关联;许多结果将包装成这种类型
嵌套结果映射 – 关联可以指定为一个 resultMap 元素,或者引用一个
collection – 一个复杂类型的集合
嵌套结果映射 – 集合可以指定为一个 resultMap 元素,或者引用一个
discriminator – 使用结果值来决定使用哪个 resultMap
case – 基于某些值的结果映射
嵌套结果映射 – 一个 case 也是一个映射它本身的结果,因此可以包含很多相 同的元素,或者它可以参照一个外部的 resultMap

sql标签

参数:向sql语句中传递的可变参数
预编译 #{}:将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号,能够很大程度防止sql注入;
传值 $ {} :传入的数据直接显示生成在sql中,无法防止sql注入;
表名、选取的列是动态的,order by和in操作, 可以考虑使用$

5.动态SQL

标签 作用 备注
if 判断语句 单条件分支判断
choose、when、otherwise 相当于java的case when 多条件分支判断
Trim、where、set 用于处理sql拼装问题
foreach 在in语句等列举条件常用,常用于实现批量操作 循环语句
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章