MyBatis简介:
MyBatis是一款优秀的持久层框架,支持自定义sql、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的xml或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录,采用ORM对象关系映射。
ORM对象关系映射:数据库中的每一张表都与一个实体类相对应,表中字段与实体中的属性是一一配置的。
MyBatis就是帮助程序员将数据存入数据库和从数据库中取数据。
传统的JDBC操作,有很多重复代码。比如:数据取出时的封装, 数据库的建立连接,通过框架可以减少重复代码,提高开发效率。
MyBatis是一个半自动化的ORM框架,半自动体现在sql可以自己手写,写在xml或者注解中都可以,一般写在xml 中,可以实现sql与核心模块的分离,可以在sql的层面上优化工程。
MyBatis特点:
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供xml标签,支持编写动态sql。
官网xml配置示例:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--environment标签可以有多个,即多个策略,通过default来选择策略,参数为environment的id--><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><mappers><!--BlogMapper.xml用来写sql--><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers></configuration>
项目结构:
使用mybatis时持久层不用写实现类,只需要写接口,mybatis底层会通过动态代理创建对应的实现类
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><environments default="development"><!--environment标签可以有多个,即多个策略,通过default来选择策略,参数为environment的id--><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}"/>--><property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=GMT&characterEncoding=utf-8"/><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><!--BlogMapper.xml用来写sql--><mapper resource="com/jy/dao/UserDaoMapper.xml"/></mappers></configuration>
UserDaoMapper.xml:sql语句都写在此文件中
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace 命名空间 其中内容为持久层接口全类名--><mapper namespace="com.jy.dao.UserDao"><!--查询所有的用户数据--><!--id为对应方法名--><!--resultType:结果类型--><select id="getList" resultType="com.jy.pojo.User">select * from test03</select></mapper>
测试类:其中创建sqlSessionFactory对象
public class MyBatisTest {@Testpublic void test01(){InputStream resourceAsStream =null;SqlSession sqlSession = null;//根据流对象来解析mybatis核心配置文件,读取相关数据try {resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");//创建sqlSessionFactory对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);//将sqlSession对象从工厂取出来sqlSession = sqlSessionFactory.openSession();//mybatis底层会通过动态代理为持久层接口创建对应的实现类UserDao userDao = sqlSession.getMapper(UserDao.class);//调用查询用户信息的方法List<User> list = userDao.getList();for (User user : list) {System.out.println(user);}} catch (IOException e) {e.printStackTrace();}finally {if (resourceAsStream != null){try {resourceAsStream.close();} catch (IOException e) {e.printStackTrace();}}if (sqlSession != null){sqlSession.close();}}}}
将测试类代码进行优化:将每新建一个test都需要写的重复代码提出,只保留核心代码
public class MyBatisTest {InputStream resourceAsStream =null;SqlSessionFactory sqlSessionFactory = null;SqlSession sqlSession = null;/*** @Before 会在所有的测试单元执行之前执行*/@Beforepublic void mybatisBefore(){//根据流对象来解析mybatis核心配置文件,读取相关数据try {resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");} catch (IOException e) {e.printStackTrace();}//创建sqlSessionFactory对象sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);//将sqlSession对象从工厂取出来sqlSession = sqlSessionFactory.openSession();}/*** @After 会在所有的测试单元执行之后执行*/@Afterpublic void mybatisAfter(){if (resourceAsStream != null){try {resourceAsStream.close();} catch (IOException e) {e.printStackTrace();}}if (sqlSession != null){sqlSession.close();}}@Testpublic void test01(){//mybatis底层会通过动态代理为持久层接口创建对应的实现类UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//调用查询用户信息的方法List<User> list = userMapper.getUserList();for (User user : list) {System.out.println(user);}}}
