-
MyBatis的前身是IBaties框架。
- MyBatis对JDBC的轻量级封装。JDBC可以说是Mybatis的老父亲,长江后浪退前浪JDBC大哥可以安心去了。
- 特点:巧,轻,便。实话实说这并不是什么能值得一提的优点,但是却从各个方面吊打JDBC
- 特点:支持动态SQL。更加接近程序员让他们可以充分发挥脑袋的逻辑。
- 特点:拥有缓存机制。一级二级缓存是如此高级把我写的蹩脚代码都拉高了一档。
- 特点:引入了SQL Mapper。就好像打怪遇见大佬,苦苦学习普A技能 'JDBC',一朝被大招流SqlMapper深深折服。
- 特点:MyBatis的源码思想。这并不是特点但是却可以让我们变得更强,一个男人总是需要强大的力量来装逼,但是最好的装逼其实是给予他人鼓励。我希望每个辛苦探索的求知者能把技术思想用到生活里,我们并不是为了技术而生活被代码控制让自己没有了自我是一种很可悲的事情。
-
阅读准备。
- 这是我单独整理我自己的MyBatis笔记,不整合任框架可能后面会加。不希望有人特意去看或者赋予它任何火遍博客的目的,一切来源于我的自娱自乐。
- 工具:Eclipse/IDEA。代码工具基本都是IDEA但是本人还是学生对Eclipse可谓一往情深。
- 前置技能:会用游览器找bug并且会一点Sql。
-
重要提醒:《MyBatis 3源码深度解析》一书的许多桥段给了我很多启发可以多多看看。我总是向书本虚心请教,用到之时我会标记出来。
我什么都不讲但是我认为学习某个东西前都需要先踏出第一步,然后开始懂得嘲讽这门技术,学习越深入就越要嘲讽这样新的变化就会从中诞生!
下面列出一个JavaWeb项目使用Mybatis的项目步骤。
我们使用一个 Javaweb 项目来部署(使用web项目是为了了解daoimpl层的变化)
创建一个web项目看看目录结构(如果你还没有用上小三maven还是老实点导包如下图的三个驱动)
接下来持久层数据库(mysql)
在此之前我们需要一份数据库文件来交互,我们可以选自己数据库心仪的表来使用。
这里我选择了VoteUser表。下图是表的结构(注:你完全可以使用自己表因为我正是如此!)
下面为表建立对用的实体类(entity)
dao接口(单纯定义了一个查询所有数据的接口)
点击查看代码
import java.util.List;
import entity.VoteUser;
public interface VoteUserDao {
//查询所有的VoteUser数据
public abstract List<VoteUser> SelectAllVoteUser();
}
daoImpl实现类(以前的daoimpl类消失了现在你获得了新的力量Mapper)
原来daoimpl实现类都是继承dao接口并且使用Mysql API来帮助交互
现在Mapper.xml 来帮助程序员实现了代码 SQL分离,下面我们会知悉Mapper.xml怎么写。
现在你只需要懂得VoteUserImpl实现类消失了被VoteUserMapper.xml配置给取代了。
关于怎么个取代法:《mybatis 3源码深度解析》一书给出的回答。
我们可以将XML文件中的SQL配置与一个Java接口进行绑定,SQL配置的命名空间对应Java接口的完全限定名,而具体的每个SQL语句的配置对应Java接口中的一个方法,建立绑定后,可以通过调用Java接口中定义的方法来执行XML文件中配置的SQL语句。
如下图:
那么Mapper.xml到底长什么样呢?
点击查看代码<?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">
<!--namespace需要与dao的完全限定名绑定 让MyBaties知道这个Mapper与那个dao匹配 -->
<mapper namespace="dao.VoteUserDao">
<!--下面的id绑定的是Voteuserdao中规定的方法名,resultType绑定的是当查询后返回的结果是VoteUser类型以此映射 -->
<select id="SelectAllVoteUser" resultType="entity.VoteUser">
SELECT * FROM VOTEUSER
</select>
</mapper>
Service类以及ServiceImpl类并没有变化(仍然是业务的处理所以Mybaties是持久层的框架)我们略过这两个业务直接去测试
-
建立test测试类
public class Test_VoteUserMapper { public static void main(String[] args) throws IOException { //读取Mybatis配置 String resource = "Mybatis-config.xml"; InputStream inputStream = null; inputStream = Resources.getResourceAsStream(resource); //通过SqlSessionFactoryBuilder()配置产生sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //通过sqlSessionFactory产生sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //实现接口调用方法(这里并没有直接使用mapper.xml获取希望加以区分) VoteUserDao dao = sqlSession.getMapper(VoteUserDao.class); dao.SelectAllVoteUser(); //关闭资源 sqlSession.close(); inputStream.close(); } }
发现Mybatis-config.xml我们并没有创建, SqlSessionFactory SqlSession是什么牛马
答:MyBatis-config是对Mybatis的整体配置里面包含mybatis要连接到那个数据库,是否开启二级缓存,懒加载,注册Mapper.xml让系统知道对应的那个dao。所以MyBatis-config还是很重要的。我们正常会在src的同级目录下面建立一个RESOURCES文件来放我们的Mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--首先整体配置很多该xml文件是极致的简化为的是与JDBC做对比 -->
<!--配置标签configuration所有的配置都写在这组标签下 -->
<configuration>
<!--环境标签environments 可以看得出里面可以存放很多子environment 是为了提供动态的连接选择 -->
<environments default="development">
<!--子环境标签environment 配置数据库连接池数据源等可以有多个 -->
<environment id="development">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- dataSouurce是产生connection的一种方式还有另外一种是JDBC中的DriverManage-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/survey?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="747452"/>
</dataSource>
</environment>
</environments>
<!--加载mapper映射文件 创建的Mapper都需要在这里注册声明才会被读到-->
<mappers>
<mapper resource="daoimpl/VoteUser.xml"/>
</mappers>
</configuration>
答:SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
答:既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。使用和指定语句的参数和返回值相匹配的接口(比如 BlogMapper.class),现在你的代码不仅更清晰,更加类型安全,还不用担心可能出错的字符串字面值以及强制类型转换。
到此你已经成功的搭建一个mybatis项目了,其实你已经入门了。现在为我们的大业添砖加瓦吧。