MyBatis:一款半自动化的持久层框架 是基于java面向对象的持久层框架
jdbc则是一个面向关系型数据库的持久层技术
三个主要特点:
1.支持定制的sql语句(灵活)
2.存储过程(PLSQL模块化的组件,类似于方法,过程内的sql语句不用重复 写):存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参 数、输出参数、返回单个或多个结果集以及返回值。
3.高级映射(表映射为bean以及bean映射为表)
MyBatis框架的结构图:
说明:
SqlMapConfig.xml:核心的配置文件,连接数据库,加载mapper.xml配置文件
Mapper.xml:用于配置sql语句
SqlSessinFactory:根据配置文件,创建SqlSession接口
SqlSession接口:面向用户的接口,封装好了用于对操作数据库(发出sql增删改查)
Executor (执行器):是一个接口(基本执行器、缓存执行器)、SqlSession 内部通过执行器操作数据库
Mapped Statement (底层封装对象):对操作数据库存储封装,包括 sql 语句、输入参数、输出结果类型
MyBatis项目流程
1.创建maven工程 在pom.xml中添加项目的依赖库
先添加本地库,再在maven官网找到需要的库复制以下代码加到配置文件中
2.在resources中添加配置文件:
db.properties、log4j.properties、SqlMapConfig.xml(Mybatis的核心配制文件)
3.创建对应数据表的映射类,再在上图的mapper文件夹中添加User.xml配置文件配置对数据库操作的sql语句,例如:(select标签,delete标签,update标签,insert标签)
select * from user where id=#{id}
其中: id:唯一标识 相当于方法的名称
parameterType:输入参数的类型 相当于方法的参数类型
resultMap:方法的返回值类型 注意:全路径(包名+类名)
4.在junit测试
要有@Test注解
读取并解析SqlMapConfig.xml:
InputStream inputStream = Resources.getResourceAsStream( "SqlMapConfig.xml");
创建会话工厂(SqlSessionFactory)传入mybatis的配置信息
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
获取SqlSession对象,用于对数据库进行操作
SqlSession sqlSession = sessionFactory.openSession();
关联User.xml文件进行操作
User user = sqlSession.selectOne("test.findUserById", 1);
释放资源
sqlSession.close();
以上是简单的基础流程,接下来使用三层结构中的Dao实现类的方式操作数据库
前三步操作不变,不直接写测试类了
4.创建Dao接口以及接口的实现类
在实现类中注入 SqlSessionFactory,这里通过构造器注入
private SqlSessionFactory sqlsessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlsessionFactory = sqlSessionFactory;
}
注意:Dao中的方法名最好跟User.xml中配置sql的id一致,以下就是Dao实现类中的方法
5.junit测试
在测试类中需要用setUp()方法注入 SqlSessionFactory对象
有了SqlSessionFactory对象,就可以实例化Dao了(由参构造),这就是Dao中的应用
Mybatis中的mapper接口(规范写法 在项目中的应用 在项目中我们只需要配置号mapper.xml文件就可以了)
mapper接口相当于Dao接口,对应的就要有mapper.xml映射文件,mybatis 可以自动生成 mapper 接口类代理对象。
开发规范:
1.在 mapper.xml 中 namespace 等于 mapper 接口地址(所在包名的全路径)
2.在 xxxmapper.java 接口中的方法名要与 xxxMapper.xml 中 statement 的 id 一致。
3.在 xxxmapper.java 接口中的输入参数类型要与 xxxMapper.xml 中 statement 的 parameterType 指定的参数类型一致。
4.在 xxxmapper.java 接口中的返回值类型要与 xxxMapper.xml 中 statement 的 resultType 指定的类型一致。
5.接口文件名要与xml映射文件名一致(UserMapper.java和UserMapper.xml)
与Dao实现类不同的地方在于:
测试时不在调用sqlsession的增删改查方法,而是调用getMapper(UserMapper.class)方法来实例化UserMapper接口直接调用配置文件中的id(方法名)
复合条件查询(动态sql)
是Mybatis的强大特性之一,
if,choose(when,otherwise),trim(where,set),foreach
在使用复合条件查询时应用到po类(persistant object 持久对象),继承表映射,操作灵活,可以扩展用户的信息;
例如:mapper.xml中的配置 用include引用下图的sql语句 refid与id相对映
以拼接的形式写出sql语句,判断条件是否存在,然后在拼接条件,可以很据情况选择条件来创建sql语句,更加灵活
MyBatis中的关联查询
在数据库中表之间是可能存在关联关系的
主要有三种关联:1对多 1对1 多对多
在开始项目时,要先对数据库表的结构进行分析:
1、每张表记录的数据内容
分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程。
2、每张表重要的字段设置
非空字段、外键字段
3、数据库级别表与表之间的关系
外键关系
4、表与表之间的业务关系
在分析表与表之间的业务关系时一定要建立 在某个业务意义基础上去分析。
在配置一对多关系时的描述:collection标签 extends继承了下一图中的配置 根据id
ofType:List集合汇总的类型 一般出现在一对多的关系中
javaType:普通的java PO类
在配置一对一关系时的描述: association标签
在描述多对多时,要一次根据关联信息描述一对多和一对一
还要注意在bean中要创建关联信息的属性