MyBatis
是一个半ORM的数据库持久化框架,就是来替换JDBC的,底层还是JDBC(所有持久层框架底层都是),所以单用Mybatis时,事务需要手动提交
历史扩展:它本是apache的一个开源项目iBatis,所以很多jar的名字还是iBatis
ORM:对象关系映射(Object Relational Mapping),一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术;
操作数据库关系方式有很多种,常用的是这两种:
1、半映射:把SQL写在配置文件中,通过不同SQL中完成对象实体和数据库关系相互转换的操作,如Mybatis
2、完整映射:直接使用对象实体和数据库关系进行映射,不用写SQL(简单的操作),由框架自己生成,如JPA、Hibenate
(P.S:就是需要写sql的就是半映射,不需要的就是完整映射,但是完整映射的sql也只是简单级别的,复杂度高的还是要自己写 )
=============================================================
1、核心配置文件:MyBatis-Config.xml,放在Source Folder下(这种文件夹下的文件,项目启动后会自动去读取)
<configuration>
<properties resource="db.properties">properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
dataSource>
environment>
environments>
<mappers>
<mapper resource="cn/itsource/domain/ProductMapper.xml" />
mappers>
configuration>
2、映射文件:关于配置文件,都放在resource文件下,包和java的要相同,这样在硬盘中是在同一目录下的
<mapper namespace="cn.itsource.dao.IProductDao">
<select id="findById" parameterType="long" resultType="cn.itsource.domain.Product">
select * from product where id = #{id}
select>
mapper>
3、抽取工具
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession opSession() {
if (sqlSessionFactory != null) {
return sqlSessionFactory.openSession();
}
return null;
}
}
4、测试:执行xml中的sql语句
4.1、传统方式:
@Test
public void testFindAll() throws Exception{
//获取到会话对象
SqlSession session = MybatisUtils.opSession();
//通过命名空间+id,调用sql
Product product = session.findById(“cn.itsource.dao.IProductDao”,1L);
}
4.2、映射器Mapper
创建条件:
(1)Mapper映射文件(.xml)的命名空间,必须和接口的"完全限定名"一致;
(2)定义sql标签的id,需要和"接口的方法名"一致;
@Test
public void testFindAll() throws Exception{
//获取到会话对象
SqlSession session = MybatisUtils.opSession();
//拿到映射对象,是通过mybatis自动创建的指定接口代理对象
ProductMapper mapper = session.getMapper(ProductMapper.class);
List<Product> products = mapper.findById(1L);
//如果是增删改操作,事务需要手动提交
//session.commit()
//lambda表达式
products.forEach(System.out::println);
}