Mybatis 是一个连接数据库和我们java项目的持久层框架。
我们常用的连接DB的方式还有:
- JDBC方式直接连接
- 优点:快
- 缺点:需要自己写大量获取连接,维护连接的jdbc相关代码,实现数据库表到对象的转换。而这些东西与我们的业务代码不相关。
- Hibernate方式连接
- 优点: hibernate帮我们封装了jdbc相关操作,实现了对象和表之间映射关系,我们只需要进行简单配置即可,大大简化了开发流程
- 缺点: 当我们需要进行多表join来获取数据时,hibernate实现起来就比较麻烦,而且效率也会降低
Mybatis 就是集JDBC和Hibernate的优点于一体的一个产物
Mybatis 配置
Mybatis的配置文件核心由三部分构成
<?xml version="1.0" encoding="UTF-8" ?>
<!-- part1 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--part2 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- part3 -->
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
part1: 指定了mybatis的dtd文件路径,这个是必须的,固定写法
Body configuration 由两部分组成
part2: environments,顾名思义配置了我们连接db的信息
- transactionManager 定义了事务管理方式
- dataSource 则配置了所要连接的db的详细信息
part3: mapper, 定义了我们可以执行的sql语句,我们可以通过sqlSession来执行它们。
我们通过一个简单的例子来学习一下mapper相关知识
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
我们可以通过id来引用定义的sql语句,#{xx} 代表输入参数,其他都是自解释的相信直接可以看懂,不在多解释。
调用方式1:namespace+id 方式
Blog blog = session.selectOne(
"org.mybatis.example.BlogMapper.selectBlog", 101);
- 缺点: 需要记住namespace name, string拼写容易出错
所以这里还有一个更好的,也是我个人推荐用的一个方式:
定义一个和mapper文件namespace同名的interface,其中的方法名和我们定义的id名相同,返回类型也相同,参数也一样。
然后我们就可以通过下面这样调用
public Interface BlogMapper{
Blog selectBlog(int id);
}
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
是不是更简单,更酷。
当然这里还有其他配置,我们这里只是列出了最基本,最核心不可缺的几个部分
Mybatis 调用
下面我们介绍如何调用mybatis来读取数据库
//resource 必须是类路径下的,要不会找不到
String resource = "org/mybatis/example/mybatis-config.xml";
//step1
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
//step2
SqlSession sqlSession = sqlSessionFactory.openSession();
//step3
BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);
step4
Blog blog = mapper.selectBlog(101);
//step5
sqlSession.close();
So easy.
- step1: 通过我们的配置文件,获取一个SqlSessionFactory
- step2: 通过sqlSessionFactory获取一个sqlSession
- step3: 通过sqlSession获取一个Mapper;
- step4: 调用mapper的具体方法,执行对应的sql,获取数据
- step5: 关闭session