zoukankan      html  css  js  c++  java
  • 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的实例不能被共享
  • 相关阅读:
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    Java实现 LeetCode 803 打砖块 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    Java实现 LeetCode 803 打砖块 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    英文标点
    post sharp 与log4net 结合使用,含执行源码 转拷
  • 原文地址:https://www.cnblogs.com/honzhez/p/13392946.html
Copyright © 2011-2022 走看看