【MyBatis系列1】MyBatis快速入门demo(基于传统JDBC,DBUtils,Hibernate的对比分析)(1)

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

在这里插入图片描述

最新整理电子书

在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

}

然后写一个测试类:

package com.lonelyWolf.mybatis;

import com.lonelyWolf.mybatis.model.LwUser;

import java.sql.*;

public class TestJDBC {

public static void main(String[] args) {

Connection conn = null;

Statement stmt = null;

try {

//1、注册JDBC驱动

Class.forName(“com.mysql.jdbc.Driver”);

//2、打开连接,获得Connection对象

conn = DriverManager.getConnection(“jdbc:mysql://10.xxx.xxx.xxx:3306/lonely_wolf”, “root”, “123456”);

//3、获得Statement对象

stmt = conn.createStatement();

//4、执行sql语句获取结果集ResultSet

String sql = “select user_id,user_name from lw_user”;

ResultSet rs = stmt.executeQuery(sql);

//5、将结果集转换为Java对象

while (rs.next()) {

LwUser lwUser = new LwUser();

String userId = rs.getString(“user_id”);

String userName = rs.getString(“user_name”);

lwUser.setUserId(userId);

lwUser.setUserName(userName);

System.out.println(JSONObject.toJSONString(lwUser));

}

//6、关闭资源

rs.close();

stmt.close();

conn.close();

} catch (SQLException se) {

se.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (stmt != null) stmt.close();

} catch (SQLException se2) {

}

try {

if (conn != null) conn.close();

} catch (SQLException se) {

se.printStackTrace();

}

}

}

}

这就是一个简单的原生JDBC编程的代码,而且是不带参数的查询,如果待参数的话需要进行如下改写:

String sql = “select user_id,user_name from lw_user where user_id=?”;

PreparedStatement ps = conn.prepareStatement(sql);

ps.setString(1,“1”);//第1个1表示参数位置,第二个是参数的值

ResultSet rs = ps.executeQuery();

也就是说我们需要知道参数具体位置,具体类型然后按顺序设置参数。

可以很明显看到,我们只是想执行一个简单的查询,却需要写很多底层操作的和业务无关的逻辑。

具有以下明显的缺陷:

  • 1、需要手动管理资源

  • 2、代码重复

  • 3、业务逻辑与数据操作的代码耦合

  • 4、SQL语句需要硬编码写在业务代码内

  • 5、设置参数时必须要知道参数具体位置

  • 6、结果集需要手动处理

既然这么多和业务无关的代码,那么封装起来就好了,是的,这是一个办法,所以这就有了一些工具类,如DbUtils等来将我们数据操作相关的代码进行了封装

Apache DbUtils

===========================================================================

DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,其目的是能够简化JDBC应用程序的开发过程中大量繁琐的数据操作(类似的还有Spring JDBC工具)。

我们先来看一个简单的例子:

首先引入依赖:

commons-dbutils

commons-dbutils

1.7

然后通过DbUtils将上面的JDBC操作进行改写:

package com.lonelyWolf.mybatis;

import com.alibaba.fastjson.JSONObject;

import com.lonelyWolf.mybatis.model.LwUser;

import org.apache.commons.dbutils.*;

import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.List;

public class TestDbUtil {

public static void main(String[] args) throws SQLException {

Connection connection = null;

try {

//1、注册JDBC驱动

Class.forName(“com.mysql.jdbc.Driver”);

//2、打开连接,获得Connection对象

connection = DriverManager.getConnection(“jdbc:mysql://10.xxx.xxx.xxx.xxx:3306/lonely_wolf”, “root”, “123456”);

}catch (Exception e){

e.printStackTrace();

}

QueryRunner queryRunner = new QueryRunner();

String sql = “select user_id,user_name from lw_user”;

//开启驼峰

BeanProcessor bean = new GenerousBeanProcessor();

RowProcessor processor = new BasicRowProcessor(bean);

//执行查询

List lwUsers = queryRunner.query(connection,sql,new BeanListHandler<>(LwUser.class,processor));

System.out.println(null == lwUsers ? “”:JSONObject.toJSONString(lwUsers));

DbUtils.closeQuietly(connection);

}

}

可以看到,获取连接之后我们不需要再去获取Statement和ResultSet等对象了,直接调用API就可以拿到转换成Java对象之后的数据。

使用DbUtils如果执行带参数的查询呢,也是需要进行如下改写:

Object[] params = new Object[1];

params[0] = “1”;

List lwUsers = queryRunner.query(connection,sql,params,new BeanListHandler<>(LwUser.class,processor));

相比较于原生的JDBC操作,使用DbUtils已经简单了很多,DbUtils解决了一些问题,但是也有一些问题没有解决。

DbUtils解决了:

  • 1、方法封装

  • 2、支持数据源

  • 3、映射结果集

但是DbUtils仍然有如下2个主要问题没有解决:

  • 1、SQL语句硬编码

  • 2、参数只能按顺序传入(占位符)

  • 3、没有提供缓存等功能(每次操作都需要操作数据库连接,非常消耗性能)

所以为了改进工具类的不足,基于ORM模型的框架就应运而生了。

ORM模型

==================================================================

ORM,Object Relational Mapping:对象关系映射。

ORM模型简单来说就是数据库表和Java对象(Plain Ordinary Java Object,简称POJO)的映射关系模型,如下图所示:

在这里插入图片描述

有了ORM框架,开发的时候再也不用去关心底层的数据库操作,只需要专心的写业务代码就行了,大大提升了开发效率。

常见的ORM框架

=====================================================================

有了ORM模型,那么就会有人将其落地实现,所以也就有了各种类型的框架。

Hibernate


Hibernate在Java开发中应该可以称之为著名的ORM框架之一了,很多人都用过SSH(Struts2+Hibernate+Spring)框架组合开发,现在用的人可能比较少了,但是在以前Hibernate是开发首选的ORM框架。

Hibernate之所以能流行是因为在Hibernate之前Sun公司曾经推出过一个Java服务端组件模型EJB(Enterprise Java Beans),但是EJB配置比较复杂,而且适用范围小。所以Hibernate诞生后就替代了EJB模型。

Hibernate是通过一个hbm.xml配置文件来实现了数据库和POJO映射,不论是一对一,一对多还是都对多,都可以通过配置文件实现。

在这里插入图片描述

Hibernate虽然解决了传统JDBC编程锁存在的一些问题,但是同时也存在以下两个较严重的问题:

  • 1、对多表关联和比较复杂的数据表结构查询支持相对较差。

  • 2、SQL语句是自动生成的,我们很难修改其生成的SQL语句,也就是无法对SQL进行很好地优化,这对当今互联网公司的数据量级别是无法接受的。

  • 3、Hibernate是全表映射,在某些场景中,操作大表会浪费带宽

MyBatis


为了解决Hibernate框架所存在的问题,MyBatis出现了。

MyBatis的前身是Apache的一个开源项目iBatis,并且在2010年正式脱离了Apache,并命名为Mybatis。

Mybatis是一款半自动化的ORM框架,因为要实现数据库和和Java对象的映射需要我们自己去手动实现(Hibernate中并不需要),使用MyBatis,我们需要提供以下三类文件:

  • SQL语句

  • 映射规则

  • POJO

SQL语句需要手动编写,这就给了我们优化的机会,而在Mybatis中,编写SQL语句和传统JDBC不一样的是传统JDBC是直接写在业务代码里,而MyBatis是相对独立的。

MyBatis的映射模型如下图所示:

在这里插入图片描述

MyBatis简单示例

接下来我们来看一个MyBatis的简单例子:

1、引入MyBatis依赖:

org.mybatis

mybatis

3.5.5

src/main/java

**\/*.xml

配置mybatis-config.xml进行全局配置:

<?xml version="1.0" encoding="UTF-8" ?>

读者福利

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

更多笔记分享

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

PE configuration PUBLIC “-//mybatis.org//DTD Config 3.0//EN” “http://mybatis.org/dtd/mybatis-3-config.dtd”>

读者福利

[外链图片转存中…(img-mJf2fF3I-1715479886532)]

更多笔记分享

[外链图片转存中…(img-LLzbPYeK-1715479886532)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值