一、Mybatis与JDBC的区别

1、什么是MyBatis?

  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

  iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

  MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。

回到顶部

2、为什么会有 MyBatis?

  通过上面的介绍,我们知道 MyBatis 是来和数据库打交道。那么在这之前,我们是使用 JDBC 来对数据库进行增删改查等一系列操作的,而我们之所以会放弃使用 JDBC,转而使用 MyBatis 框架,这是为什么呢?或者说使用 MyBatis 对比 JDBC 有什么好处?

  下面我们通过一段 JDBC 对 Person 表的操作来具体看看。

   person 表为:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public class Person {

    private Long pid;

    private String pname;

    public Long getPid() {

        return pid;

    }

    public void setPid(Long pid) {

        this.pid = pid;

    }

    public String getPname() {

        return pname;

    }

    public void setPname(String pname) {

        this.pname = pname;

    }

}

  JDBC 查询操作:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

package com.ys.dao;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

import javax.swing.DebugGraphics;

import com.ys.bean.Person;

public class CRUDDao {

    //MySQL数据库驱动

    public static String driverClass = "com.mysql.jdbc.Driver";

    //MySQL用户名

    public static String userName = "root";

    //MySQL密码

    public static String passWord = "root";

    //MySQL URL

    public static String url = "jdbc:mysql://localhost:3306/test";

    //定义数据库连接

    public static Connection conn = null;

    //定义声明数据库语句,使用 预编译声明 PreparedStatement提高数据库执行性能

    public static PreparedStatement ps = null;

    //定义返回结果集

    public static ResultSet rs = null;

    /**

     * 查询 person 表信息

     * @return:返回 person 的 list 集合

     */

    public static List<Person> readPerson(){

        List<Person> list = new ArrayList<>();

        try {

            //加载数据库驱动

            Class.forName(driverClass);

            //获取数据库连接

            conn = DriverManager.getConnection(url, userName, passWord);

            //定义 sql 语句,?表示占位符

            String sql = "select * from person where pname=?";

            //获取预编译处理的statement

            ps = conn.prepareStatement(sql);

            //设置sql语句中的参数,第一个为sql语句中的参数的?(从1开始),第二个为设置的参数值

            ps.setString(1"qzy");

            //向数据库发出 sql 语句查询,并返回结果集

            rs = ps.executeQuery();

            while (rs.next()) {

                Person p = new Person();

                p.setPid(rs.getLong(1));

                p.setPname(rs.getString(2));

                list.add(p);

            }

        catch (Exception e) {

            e.printStackTrace();

        }finally{

            //关闭数据库连接

            if(rs!=null){

                try {

                    rs.close();

                catch (SQLException e) {

                    e.printStackTrace();

                }

            }

            if(ps!=null){

                try {

                    ps.close();

                catch (SQLException e) {

                    e.printStackTrace();

                }

            }

            if(conn!=null){

                try {

                    conn.close();

                catch (SQLException e) {

                    e.printStackTrace();

                }

            }

        }

        

        return list;

    }

    public static void main(String[] args) {

        System.out.println(CRUDDao.readPerson());

    }

}

回到顶部

3、分析

  通过上面的例子我们可以分析如下几点:

  ①、问题一:数据库连接,使用时就创建,使用完毕就关闭,这样会对数据库进行频繁的获取连接和关闭连接,造成数据库资源浪费,影响数据库性能。

    设想解决:使用数据库连接池管理数据库连接

  ②、问题二:将 sql 语句硬编码到程序中,如果sql语句修改了,那么需要重新编译 Java 代码,不利于系统维护

    设想解决:将 sql 语句配置到 xml 文件中,即使 sql 语句变化了,我们也不需要对 Java 代码进行修改,重新编译

  ③、问题三:在 PreparedStatement 中设置参数,对占位符设置值都是硬编码在Java代码中,不利于系统维护

    设想解决:将 sql 语句以及占位符和参数都配置到 xml 文件中

  ④、问题四:从 resultset 中遍历结果集时,对表的字段存在硬编码,不利于系统维护

    设想解决:将查询的结果集自动映射为 Java 对象

  ⑤、问题五:重复性代码特别多,频繁的 try-catch

    设想解决:将其整合到一个 try-catch 代码块中

  ⑥、问题六:缓存做的很差,如果存在数据量很大的情况下,这种方式性能特别低

    设想解决:集成缓存框架去操作数据库

  ⑦、问题七:sql 的移植性不好,如果换个数据库,那么sql 语句可能要重写

    设想解决:在 JDBC 和 数据库之间插入第三方框架,用第三方去生成 sql 语句,屏蔽数据库的差异

  既然直接使用 JDBC 操作数据库有那么多的缺点,那么我们如何去解决呢?请看下面 mybatis 框架的入门实例介绍。

原文地址:https://www.cnblogs.com/zhoanghua/p/9292171.html

时间: 2024-11-06 14:04:19

一、Mybatis与JDBC的区别的相关文章

mybatis中#{}和${}的区别及order by的sql注入问题

mybatis的#{}和${}的区别以及order by注入问题 原文  http://www.cnblogs.com/chyu/p/4389701.html 前言略,直奔主题.. #{}相当于jdbc中的preparedstatement ${}是输出变量的值 简单的说就是#{}传过来的参数带单引号'',而${}传过来的参数不带单引号. 你可能说不明所以,不要紧我们看2段代码: String sql = "select * from admin_domain_location order by

mybatis中#{}和${}的区别 (二)

mybatis中#{}和${}的区别 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程 2.使用 Statement 对象.在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理.PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处. 3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, prepared

mybatis与hibernate的区别持久层对比【面试题】

Mybatis技术特点: 好处: 通过直接编写SQL语句,可以直接对SQL进行性能的优化: 学习门槛低,学习成本低.只要有SQL基础,就可以学习mybatis,而且很容易上手: 由于直接编写SQL语句,所以灵活多变,代码维护性更好. 缺点: 不能支持数据库无关性,即数据库发生变更,要写多套代码进行支持,移植性不好. Mysql:limit Oracle:rownum 需要编写结果映射. Hibernate技术特点: 好处: 标准的orm框架,程序员不需要编写SQL语句. 具有良好的数据库无关性,

mybatis中&quot;#&quot;和&quot;$&quot;的区别

mybatis中"#"和"$"的区别 动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析.mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}. 在下面的语句中,如果 username 的值为 zhangsan,则两种方式无任何区别: select * from user where name = #{name}; select * from

MyBatis和Hibernate的区别

MyIbatis和Hibernate的区别 1.MyBatis 真正实现了java代码和sql的分离 2.Hibernate 是全自动的,MyBatis是半自动的 Hibernate实现了部分自动生成SQL 3.SQL优化上 MyBatis 强于 Hibernate 1---MyBatis优化维护方便 SQL全存在于XML中 不需要修改源代码2---开发效率上 Hibernate略强于mybatiss 3---从性能上说 因为Mybatis全都是自己手写的SQL 因此性能相对较高 反之 Hibe

Mybatis与Ibatis的区别

Mybatis与Ibatis的区别: 1.Mybatis实现了接口绑定,使用更加方便 在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生成接口的具体实现,使用起来变得更加省事和方便. 这可以说是Mybatis最重要的改进. 注意: 虽然Mybatis支持在接口中直接使用annotation的配置方式来简化配置, 不过强烈建议仍然使用xml配置的方式.毕竟annotation的配置方式功能有限且代码

mybatis的#和$的区别

如果你搜一下"mybatis的#和$的区别",肯定有很多解释,在这我就说一下我在项目中的运用.我现在有这样的需求,我需要在MySQL中的一个字段保存值形如:"1,2,3"以逗号分隔的字符串.如果你用$符号就会报错.刚开始我以为是我sql写的有问题,但是在MySQL中测试SQL并没有报错.最后想到了是不是$符号影响的. 最后的解决方案是:用#符号. ========================== #符号可以将你传过来的值当做整个字段的值就行解析. mybatis

MyBatis中#{ }和${ }的区别(笔面试题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px "PingFang SC" } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px "PingFang SC"; min-height: 26.0px } span.s1 { font: 19.0px Helvetica } MyBatis中#{ }和${ }的区别详解 1.#将传入的数据当成一个字符串,会对

Mybatis和JDBC区别

今天面试中问了这个问题,当时答的不好,现在整理一下. JDBC是Java提供的一个操作数据库的API: MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. MyBatis是对JDBC的封装.相对于JDBC,MyBat