Mybatis基本总结

简单介绍

MyBatis是一个半自动化的持久层ORM框架,并且是apache的一个开源项目

为什么要使用MyBatis?

  • 数据库连接,使用时就创建,使用完毕就关闭,这样会对数据库进行频繁的获取连接和关闭连接,造成数据库资源浪费,影响数据库性能
  • 将 sql 语句硬编码到程序中,如果sql语句修改了,那么需要重新编译 Java 代码,不利于系统维护
  • 在 PreparedStatement 中设置参数,对占位符设置值都是硬编码在Java代码中,不利于系统维护
  • 从 resultset 中遍历结果集时,对表的字段存在硬编码,不利于系统维护
  • 重复性代码特别多,频繁的 try-catch
  • sql 的移植性不好,如果换个数据库,那么sql 语句可能要重写

实现方式

目前MyBatis可以采用如下三种方式,实现映射

  • 基于XML:所有的Sql写到xml文件中,SQL代码写到配置文件中
  • 基于注释:利用接口实现,SQL代码写到注释里面,通过Mapper类访问
  • 基于接口和XML:利用接口实现,自动匹配的XML文件【注意:接口和xml文件必须在相同目录】,通过Mapper类访问

基于XML创建一个简单项目

本文基于Maven创建,目录结构基于Maven

  • 首先pom.xml文件中添加依赖
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.5</version>
</dependency>
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
</dependency>
  • 添加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">
<configuration>
    <typeAliases>
        <typeAlias alias="AutoTask" type="com.example.demoweb01.AutoTask"></typeAlias>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
                <property name="url" value="jdbc:sqlserver://127.0.0.1:1433;databaseName=OnLineDB"/>
                <property name="username" value=""/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/AutoTask.xml"/>
    </mappers>
</configuration>
  • 添加实体对象

public class Article {
    private int id;
    private String title;
    private String author;
    
    // get set
}
  • 添加AutoTask.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">

<mapper namespace="com.example.demoweb01">
    <select id="listAutoTask" resultType="AutoTask">
        select * from TAutoTask
    </select>
</mapper>
  • 查询
public String getAutoTask() {
    SqlSessionFactory sqlSessionFactory = null;
    SqlSession sqlSession = null;

    try {
        sqlSessionFactory = MySqlSessionFactory.getSqlSessionFactory();
        sqlSession = sqlSessionFactory.openSession();

        List<AutoTask> listStudent = sqlSession.selectList("listAutoTask");
        for (AutoTask student : listStudent) {
            return "ID:" + student.getTaskId() + ",NAME:" + student.getTaskName();
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
    } finally {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }

    return "Hello SpringBoot!";
}

public class MySqlSessionFactory {
    public static SqlSessionFactory getSqlSessionFactory() {
        //String path = Thread.currentThread().getContextClassLoader().getResource("mybatis-config.xml).getPath();
        //System.out.println(path);

        try {
            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            // 一个MyBatis的应用程序都是以一个SqlSessionFactory实例为核心,建议使用单例模式
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

            return sqlSessionFactory;
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
}

采用注释创建项目

  • 首先pom.xml文件中添加依赖【参考上一个】
  • 添加mybatis-config.xml配置文件【参考上一个】,然后这里注意下
<mapper class="com.example.demoweb01.mapper.ArticleMapper"/>
  • 添加实体对象【参考上一个】
  • 添加接口
public interface ArticleMapper {
    @Select("SELECT id,title,author FROM Article WHERE id =#{id}")
    public Article getArticle(int id);
}
  • 查询,这里可以直接使用Mapper类进行操作数据
sqlSessionFactory = MySqlSessionFactory.getSqlSessionFactory();
sqlSession = sqlSessionFactory.openSession();

ArticleMapper sm = sqlSession.getMapper(ArticleMapper.class);
Article article = sm.getArticle(1);
return article.getTitle();

采用接口+注释

  • 首先pom.xml文件中添加依赖【参考上一个】
  • 添加mybatis-config.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">

<mapper namespace="com.example.demoweb01.mapper.ArticleMapper">
    <select id="getArticle" parameterType="int" resultType="com.example.demoweb01.entities.Article">
        SELECT id,title,author FROM Article WHERE id =#{id}
    </select>
</mapper>
  • 添加接口,这里注意,已经去掉了注释
public interface ArticleMapper {
    public Article getArticle(int id);
}
  • 查询,这里可以直接使用Mapper类进行操作数据【参考上一个】,保持不变
  • 注意1:这里xml文件和Mapper类,必须在相同目录,相同名称
  • 注意2:xml文件没有在资源文件中,所以要选择发布复制,查看注意事项

注意事项

基于接口+配置文件方式,不起作用

  • 接口和xml文件必须在相同文件夹,名称必须一致
  • 需要注意发布复制功能,正常情况下,src目录的配置文件,无法发布到target目录,pom.xml需要添加
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

mybatis-config.xml节点顺序有要求,否则会出现错误

  1. properties
  2. settings
  3. typeAliases
  4. typeHandlers
  5. objectFactory
  6. objectWrapperFactory
  7. reflectorFactory
  8. plugins
  9. environments
  10. databaseIdProvider
  11. mappers

核销类

  • SqlSessionFactory:一个MyBatis的应用程序都是以一个SqlSessionFactory实例为核心,建议使用单例模式
  • SqlSession
    • SqlSession的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句
    • SqlSession是线程不安全的,每个线程都应该有它自己的SqlSession实例,SqlSession的实例不能被共享

posted on 2020-07-28 18:24  hongzhez  阅读(174)  评论(0编辑  收藏  举报

导航