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配置示例:

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <!--environment标签可以有多个,即多个策略,通过default来选择策略,参数为environmentid-->
    7. <environment id="development">
    8. <!--开启事务-->
    9. <transactionManager type="JDBC"/>
    10. <!--配置数据源信息-->
    11. <dataSource type="POOLED">
    12. <!--源数据-->
    13. <property name="driver" value="${driver}"/>
    14. <property name="url" value="${url}"/>
    15. <property name="username" value="${username}"/>
    16. <property name="password" value="${password}"/>
    17. </dataSource>
    18. </environment>
    19. </environments>
    20. <mappers>
    21. <!--BlogMapper.xml用来写sql-->
    22. <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    23. </mappers>
    24. </configuration>

    项目结构:
    image.png
    使用mybatis时持久层不用写实现类,只需要写接口,mybatis底层会通过动态代理创建对应的实现类
    mybatis-config.xml

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <environments default="development">
    7. <!--environment标签可以有多个,即多个策略,通过default来选择策略,参数为environmentid-->
    8. <environment id="development">
    9. <!--开启事务-->
    10. <transactionManager type="JDBC"/>
    11. <!--配置数据源信息-->
    12. <dataSource type="POOLED">
    13. <!--源数据-->
    14. <!--<property name="driver" value="${driver}"/>
    15. <property name="url" value="${url}"/>
    16. <property name="username" value="${username}"/>
    17. <property name="password" value="${password}"/>-->
    18. <property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=GMT&amp;characterEncoding=utf-8"/>
    19. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    20. <property name="username" value="root"/>
    21. <property name="password" value="root"/>
    22. </dataSource>
    23. </environment>
    24. </environments>
    25. <mappers>
    26. <!--BlogMapper.xml用来写sql-->
    27. <mapper resource="com/jy/dao/UserDaoMapper.xml"/>
    28. </mappers>
    29. </configuration>

    UserDaoMapper.xml:sql语句都写在此文件中

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <!--namespace 命名空间 其中内容为持久层接口全类名-->
    6. <mapper namespace="com.jy.dao.UserDao">
    7. <!--查询所有的用户数据-->
    8. <!--id为对应方法名-->
    9. <!--resultType:结果类型-->
    10. <select id="getList" resultType="com.jy.pojo.User">
    11. select * from test03
    12. </select>
    13. </mapper>

    测试类:其中创建sqlSessionFactory对象

    1. public class MyBatisTest {
    2. @Test
    3. public void test01(){
    4. InputStream resourceAsStream =null;
    5. SqlSession sqlSession = null;
    6. //根据流对象来解析mybatis核心配置文件,读取相关数据
    7. try {
    8. resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
    9. //创建sqlSessionFactory对象
    10. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    11. //将sqlSession对象从工厂取出来
    12. sqlSession = sqlSessionFactory.openSession();
    13. //mybatis底层会通过动态代理为持久层接口创建对应的实现类
    14. UserDao userDao = sqlSession.getMapper(UserDao.class);
    15. //调用查询用户信息的方法
    16. List<User> list = userDao.getList();
    17. for (User user : list) {
    18. System.out.println(user);
    19. }
    20. } catch (IOException e) {
    21. e.printStackTrace();
    22. }finally {
    23. if (resourceAsStream != null){
    24. try {
    25. resourceAsStream.close();
    26. } catch (IOException e) {
    27. e.printStackTrace();
    28. }
    29. }
    30. if (sqlSession != null){
    31. sqlSession.close();
    32. }
    33. }
    34. }
    35. }

    将测试类代码进行优化:将每新建一个test都需要写的重复代码提出,只保留核心代码

    1. public class MyBatisTest {
    2. InputStream resourceAsStream =null;
    3. SqlSessionFactory sqlSessionFactory = null;
    4. SqlSession sqlSession = null;
    5. /**
    6. * @Before 会在所有的测试单元执行之前执行
    7. */
    8. @Before
    9. public void mybatisBefore(){
    10. //根据流对象来解析mybatis核心配置文件,读取相关数据
    11. try {
    12. resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
    13. } catch (IOException e) {
    14. e.printStackTrace();
    15. }
    16. //创建sqlSessionFactory对象
    17. sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    18. //将sqlSession对象从工厂取出来
    19. sqlSession = sqlSessionFactory.openSession();
    20. }
    21. /**
    22. * @After 会在所有的测试单元执行之后执行
    23. */
    24. @After
    25. public void mybatisAfter(){
    26. if (resourceAsStream != null){
    27. try {
    28. resourceAsStream.close();
    29. } catch (IOException e) {
    30. e.printStackTrace();
    31. }
    32. }
    33. if (sqlSession != null){
    34. sqlSession.close();
    35. }
    36. }
    37. @Test
    38. public void test01(){
    39. //mybatis底层会通过动态代理为持久层接口创建对应的实现类
    40. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    41. //调用查询用户信息的方法
    42. List<User> list = userMapper.getUserList();
    43. for (User user : list) {
    44. System.out.println(user);
    45. }
    46. }
    47. }