JdbcTemplate和Mybatis的差异
前言:最近在复习spring,看到jdbcTemplate蚌埠住了,IOC和AOP我还有点印象,jdbcTemplate是什么?于是复习了一下
JdbcTemplate
定义:
Spring对Jdbc的封装,方便更好的对数据库进行管理
实现过程
(不感兴趣可以直接跳过看结论)
-
导入相关的jar包
-
配置数据库连接池
<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>
- xml配置文件中创建JdbcTemplate对象
bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
- 创建数据库
- 创建实体类等一系列操作
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);
}
}
- 开启组件扫描
<!--开启组件扫描-->
<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>
- 测试
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);
}
}
运行结果
JdbcTemplate的总结
所以看完整个流程 总结一下JdbcTemplate
优:
- 相比于Jdbc来说,spring对于jdbc的封装解决了sql语句直接在java代码中写的格式,使用在xml文件中以及加入的·AOP可以在不改变源码的情况下修改数据。
- spring 提供了统一的异常处理,框架处理了异常。不论Dao层运用什么技术实现 出现的错误全部封装成了DatyaAccessException
缺:
- sql的编写依然是原生写法,每次实现都需要实现sql编写;
- 数据库操作基本都是写在了业务层,和业务耦合性很强;
- 有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实现。
工作流程
- mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。 - mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
- 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
- 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
- mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
- Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
- Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
- Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
Mybatis的总结
-
优点:
- 操作简单:mybatis是最简单的持久化框架,小巧简单易学;
- 解耦合:mybatis灵活,SQL写在XML里面,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,可重用;
- 灵活:提供多种XML标签,支持各种场景的动态SQL拼接编写,基本能应付所有的操作场景,提供映射标签,支持对象与数据库的ORM字段关系映射(在XML中配置映射关系,也可以使用注解)
- 专注:mybatis可以让开发者专注于SQL本身,是一个足够灵活的DAO层解决方案;
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
-
缺点:
- 半编程:mybatis属于半编程模式,基本的增删改次都需要使用者自己写XML实现(当然支持注解方式);
- xml编写稍复杂:SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求;
- 移植性差: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)