传统开发模式
JDBC 操作数据库弊端:
1.SQL语句自己手写,访问不同的表代码有雷同,枯燥
2.必须操作Connection、Statement ResultSet[为了实体封装]代码
3.SQL语句实际中很容易发生改变,代码与SQL语句耦合死
4.影响系统性能【用时创建、用后释放,Connection、Statement需要进行资源释放】
5.需要手动将查询出来的结果映射到实体中去
Mybatis相应解决措施:
1.将sql语句抽取到配置文件中
2.提供了一个SqlSesssion对象,内部封装了对JDBC的繁琐操作
3.引入数据源的概念,事先实例化数据源,初始化部分连接资源,用时去哪,用完放回
4.使用orm的思想解决了实体和数据库之间的映射关系
优点:使开发者不用关注繁杂的JDBC操作,专注于SQL代码本身
引入步骤
导入数据库驱动
导入mybatis驱动
创建mapper 文件(约束头、namespace resulteType)
编写核心配置文件 sqlMapConfig(核心文件约束头)
1.配置数据源环境
- 加载映射文件
<mappers>
<mapper resource = "">
</mappers>
SqlSession
概述:Mybatis中非常强大的类,里面有所有执行语句、提交回滚事务、获取映射器实例的方法
执行SqlSession的对象,内部封装了JDBC的繁琐操作
1.根据Resources对象获取核心配置文件
new SqlSessionFactoryBuilder().build(resourceAsStream )
2获取SqlSessionFactory对象,根据其获取SqlSession对象【执行sql语句的对象】
SqlSession对象是数据库操作的核心对象,也需要进行资源释放
Mybatis默认是事务不提交的,对表有影响操作需要用到事务
// mybatis 提交事务方法
sqlSession.commit()
sqlSession.close()
注:也可以创建一可以进行自动提交事务的sqlSession对象
SqlMapConfig重点配置
properties属性:加载外部properties文件
typeAliases:设置类型别名,设置后可以直接使用类的大小写替代全类名,可以通过包扫描的方式,将一个包下的所有类都配成实例
environments 重点
mappers 中 包含mapper,加载映射配置
mapper 加载方式有如下几种
1.使用相对于类路径的资源引用
2.url
3.映射器接口实现类的完全限定类名
- 包内的类
plugins 重点
Properties标签:
数据源的相关配置信息单独抽取成一个properties文件
<properties resource = "jdbc.properties" > </properties>
约束头作用
1.约束标签内容
- 起提示作用
别名
Integer ------》可以使用int代替
int 可以使用_int进行替代
动态SQL
根据相关条件进行查询时,标签体内为空,执行相关代码
<where > </where> 套在if外面 相当与where 1 = 1;
<if test = " ">
</If>
where 子标签有if 和forEach
<foreach collection = "list" open = "id in (" close = ")" item = "id" close separator> </foreach>
一对一,一对多,多对一的解决方案
MyBatis中在mapper配置文件中,将sql语句的返回值改为resultMap,并在Mapper中配置resultMap,注意Mybatis对常见的数据类型提供了映射,注意其大小写问题
resultMapd相关子标签
《association》 子标签 表示1
《collection》 表示多