首页 > 其他分享 >Mybatis

Mybatis

时间:2022-10-31 10:23:32浏览次数:37  
标签:JDBC MyBatis 配置文件 mybatis SqlSession SQL Mybatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

与Mybatis作用相同的持久层框架Hibernate。

1、灵活性和效率不如原生JDBC程序。

由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL。

Hibernate封装了JDBC,但没有原生的JDBC程序直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用Hibernate 。

2、配置文件复杂。

框架中使用ORM原则,导致配置过于复杂,一旦遇到大型项目,比如300张表以上,配置文件和内容是非常庞大的,另外,DTO满天飞,性能和维护问题随之而来

3、不适于复杂关系的数据表维护。

如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。

4、批量操作上的弱势。

Hibernate在批量数据处理时有弱势,对于批量的修改,删除,不适合用Hibernate,这也是ORM框架的弱点

为什么需要使用mybatis

mybatis底层封装了对JDBC的操作。每次通过JDBC对数据库进行操作时,过程繁琐,查询结果时需要频繁的类型转换,使用完JDBC时,必须进行关闭操作。

Class.forName(driver); //注册驱动
Connection conn = getConnection(); //获取连接
PreparedStatement pstmt = conn.preparedStatement(sql); //预处理sql语句
pstmt.setObject(key,value); //为sql语句赋值
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
   //获取值
   Object value = rs.getObject(1); //获取第一个列的值
   //封装到一个对象
   //难点:不知道value的具体类型
}
rs.close();
pstmt.close();
conn.close();

导入maven依赖

<!--导入mybatis的依赖-->
<dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.5.7</version>
</dependency>

mybatis工作流程

 

 

 

SqlSessionFactory 基于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>
   <!--配置外部的jdbc配置文件-->
   <properties resource="jdbc.properties"></properties>
   
   <settings>
       <!--配置mybatis使用的日志框架-->
       <setting name="logImpl" value="SLF4J"/>
   </settings>
   
   <!--配置数据源-->
<environments default="development">
       <!--开发时使用的数据源-->
       <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>
</configuration>

根据全局配置文件得到SqlSessionFactory

final String CONFIG = "mybatis-config.xml";
try {
   //得到全局配置文件的字符输入流
   Reader resourceAsReader = Resources.getResourceAsReader(CONFIG);
   //根据全局配置文件构建SqlSessionFactory
   sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader);
   logger.info("sqlSessionFactory构建成功");
} catch (IOException e) {
   //e.printStackTrace();
   logger.error("出现异常",e);
}

SqlSession

SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句

SqlSession session = sqlSessionFactory.openSession();
//...
session.close();

 

MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现,这使得 MyBatis 在过去的数年间得以流行。如果你用过旧版本的 MyBatis,你应该对这个概念比较熟悉。 但相比于之前的版本,新版本改进了许多 XML 的配置,后面我们会提到这些改进。这里给出一个基于 XML 映射语句的示例,它应该可以满足上个示例中 SqlSession 的调用.

准备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/mapper包中的接口名-->
<mapper namespace="org.mybatis.example.BlogMapper">
 <!--
id:对应BlogMapper接口中的selectBlog方法
resultType:查询的结果映射为Blog类型
 -->
 <select id="selectBlog" resultType="Blog">
  select * from Blog where id = #{id}
 </select>
</mapper>

在学习三层架构时,我们通过dao包中的接口定义抽象方法。通过dao.impl包中定义接口的实现类实现对数据库的CRUD操作。现在mybatis提供的代理能够解决我们手动创建实现类。我们只需要关注接口中有什么抽象方法;方法中实现的CRUD的sql语句是什么就能够实现。

/*
BlogMapper 等价于BlogDao,在使用mybatis后,命名都为XxxMapper
mybatis根据xml配置文件生成代理对象。该代理对象实现了BlogMapper接口中的所有方法
*/
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
 

标签:JDBC,MyBatis,配置文件,mybatis,SqlSession,SQL,Mybatis
From: https://www.cnblogs.com/huang2979127746/p/16843388.html

相关文章