JdbcTemplate和Mybatis的差异

JdbcTemplate和Mybatis的差异

前言:最近在复习spring,看到jdbcTemplate蚌埠住了,IOC和AOP我还有点印象,jdbcTemplate是什么?于是复习了一下

image-20221208192230503

JdbcTemplate

定义:

Spring对Jdbc的封装,方便更好的对数据库进行管理

实现过程

img

(不感兴趣可以直接跳过看结论)

  1. 导入相关的jar包

  2. 配置数据库连接池

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
          <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
          <property name="url" value="jdbc:mysql.Driver"></property>
          <property name="username" value="root"></property>
          <property name="password" value="123456"></property>
    
   </bean>
  1. xml配置文件中创建JdbcTemplate对象
bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <!--注入dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
  1. 创建数据库

image-20221207181857612

  1. 创建实体类等一系列操作
package entity;
public class User {
private int Userid;
private String Username;
private String Userstatge;
    public void setUserid(int userid) {
        Userid = userid;
    }
    public void setUsername(String username) {
        Username = username;
    }
    public void setUserstatge(String userstatge) {
        Userstatge = userstatge;
    }
    public int getUserid() {
        return Userid;
    }
    public String getUsername() {
        return Username;
    }
    public String getUserstatge() {
        return Userstatge;
    }
}
  • 创建两个类 Service和dao

BookDao层

package dao;
import entity.Book;
public interface BookDao {
    void add(Book book);
}

BookDao实现类

(记住这里是要有实现类的,因为 JdbcTemplate中提供了AOP的实现 而AOP原理就是动态代理,所以这里就需要实现类

ackage dao;
import entity.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class BookDaoImp implements BookDao {
//    注入JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public void add(Book book) {

//        1.创建Sql语句
        String sql = "insert into user values(?,?,?)";
//        2.调用方法来实现
        int update = jdbcTemplate.update(sql, book.getUserid(), book.getUsername(), book.getUserstatge());
        System.out.println(update);
    }
}

BookService

package service;
import dao.BookDao;
import entity.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BookService {

//    注入Dao
    @Autowired
    private BookDao bookDao;

//    添加的方法
   public void addBook(Book book){
         bookDao.add(book);
   }
}
  1. 开启组件扫描
<!--开启组件扫描-->
    <context:component-scan base-package="dao"></context:component-scan>
    <context:component-scan base-package="entity"></context:component-scan>
    <context:component-scan base-package="service"></context:component-scan>
  1. 测试
public class TestSql {
    @Test
    public void Testadd(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean9.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        Book book = new Book();

        book.setUserid(1);
        book.setUsername("超人");
        book.setUserstatge("变身中");
        bookService.addBook(book);
    }
}
运行结果

image-20221207182814314


JdbcTemplate的总结

所以看完整个流程 总结一下JdbcTemplate

优:

  • 相比于Jdbc来说,spring对于jdbc的封装解决了sql语句直接在java代码中写的格式,使用在xml文件中以及加入的·AOP可以在不改变源码的情况下修改数据。
  • spring 提供了统一的异常处理,框架处理了异常。不论Dao层运用什么技术实现 出现的错误全部封装成了DatyaAccessException

缺:

  1. sql的编写依然是原生写法,每次实现都需要实现sql编写;
  2. 数据库操作基本都是写在了业务层,和业务耦合性很强;
  3. 有sql注入的风险,编写时一不小心就容易发生;

Mybatis

定义:

mybatis是Clinton Begin在2001年发起的一个开源项目。最初侧重于码软件开发,后续发展成为一款基于java的持久层框架。Mybatis是一款优秀的持久层框架支持自定义SQL查询、存储过程和高级映射,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用简单的XML或者注解进行映射和配置,通过将参数映射到配置的SQL最终解析为执行的SQL语句,查询后将SQl结果集映射成java对象返回。MyBatis提供的持久层框架包括SQL Maps(Mapper)和Data Access Objects(DAO),相对于Hibernate而言它提供的是一种把反自动化的ORM实现。

工作流程

img

  1. mybatis配置
    SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
  2. mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
  3. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
  4. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
  5. mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
  6. Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
  7. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
  8. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

Mybatis的总结
  • 优点:

    1. 操作简单:mybatis是最简单的持久化框架,小巧简单易学;
    2. 解耦合:mybatis灵活,SQL写在XML里面,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,可重用;
    3. 灵活:提供多种XML标签,支持各种场景的动态SQL拼接编写,基本能应付所有的操作场景,提供映射标签,支持对象与数据库的ORM字段关系映射(在XML中配置映射关系,也可以使用注解)
    4. 专注:mybatis可以让开发者专注于SQL本身,是一个足够灵活的DAO层解决方案;
      内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 缺点:

    1. 半编程:mybatis属于半编程模式,基本的增删改次都需要使用者自己写XML实现(当然支持注解方式);
    2. xml编写稍复杂:SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求;
    3. 移植性差:Mybatis中XML写的SQL依赖数据库,数据库移植性差,比如mysql变为oracle时,xml里面的写法就需要做相应改变;

总结

框架名称解耦合能力
JdbcTemplate不强
Mybatis

原因:jdbcTemplate中的sql代码基本都写在了业务层,和业务层逻辑代码耦合度很高。Mybatis中sql代码写在xml配置文件中,与java代码彻底分离,降低耦合度。

框架名称sql写法方便程度流行程度
JdbcTemplate原生不方便* *
Mybatis半自动较方便* * * * * *

当Mybatis使用逆向工程生成 mapper、mapper.xml、实体类的时候,jdbcTemplate还在龟速写代码,半自动化要比手动快的多。Mybatis更加灵活了。

当然MybatisPlus>Mybatis>JdbcTemplate (doge)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值