MyBatis的简单了解(一)上

简介: MyBatis的简单了解(一)

一. JDBC 形式的缺点


MyBatis 是数据持久层的操作,是对数据库的处理, 在介绍它之前,先来了解一下,原来的jdbc 的处理,有哪些缺点,然后看看MyBatis 是如何进行改变的。


先来简单写一个User 类,只有id,name,age,sex,description 五个简单的字段,是简单的pojo 类。 对其进行简单的查询操作:


一.二 JDBC类


package com.yjl.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 @author:yuejl
 @date: 2019年6月15日 上午11:53:34
 @Description 类的相关描述
*/
public class DBUtils {
  public static Connection getConnection(){
    Connection connection=null;
    try {
      Class.forName("com.mysql.jdbc.Driver");
      connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8", 
          "root","abc123");
    } catch (Exception e) {
      // TODO 自动生成的 catch 块
      e.printStackTrace();
    }
    return connection;
  }
  public static void close(ResultSet resultSet,Statement statement,Connection connection){
    if(resultSet!=null){
      try {
        resultSet.close();
      } catch (SQLException e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
      }
    }
    if(statement!=null){
      try {
        statement.close();
      } catch (SQLException e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
      }
    }
    if(connection!=null){
      try {
        connection.close();
      } catch (SQLException e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
      }
    }
  }
}


一.三 根据id 编号进行查询的方法


@Test
  public void oldTest() throws SQLException{
    Connection connection=DBUtils.getConnection();
    String sql="select * from user where id=?";
    PreparedStatement statement=connection.prepareStatement(sql);
    statement.setInt(1, 1);
    ResultSet resultSet=statement.executeQuery();
    User user=null;
    while(resultSet.next()){
      user=new User();
      user.setId(resultSet.getInt("id"));
      user.setName(resultSet.getString("name"));
      user.setAge(resultSet.getInt("age"));
      user.setSex(resultSet.getString("sex"));
      user.setDescription(resultSet.getString("description"));
    }
    DBUtils.close(resultSet,statement,connection);
    System.out.println(user);
  }


运行之后,会显示:


20190528191939237.png


仔细观察,会发现这种写法,有很多的不足之处。


一.四 原始JDBC 开发的不足


  1. 数据库的连接。 数据库在使用时被创建,不使用就释放, 对数据库进行频繁的连接开启和关闭,造成数据库资源浪费,影响数据库的性能。
  2. 数据库信息被硬编码。


connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8", 
          "root","abc123");


数据库的连接信息被硬编码到连接数据库类中,如果更换数据库,则需要改变相应的信息,重新编码。即使可以写在 jdbc.properties 等配置文件里面,那么还需要写一个单独的读取 jdbc.properties 文件信息的类。


  1. sql 语句被硬编码


String sql="select * from user where id=?";


如果sql 被修改, 实际开发中,是常常被修改的, 那么就必须重新编译,不利用系统维护。


4.向PreparedStatement 设置值时,对参数的位置 和值,硬编码到程序里面。 不利于系统维护。 如 设置 ? 时,id 放在了第一位, 如果有name, name放在了第二位, 那么在传参的时候,必须把id 放在第一个,name 放在第二个。


statement.setInt(1, 1);


  1. 遍历结果集数据时, 将获取表的字段值,进行了硬编码。不利用系统维护。


      user=new User();
      user.setId(resultSet.getInt("id"));
      user.setName(resultSet.getString("name"));
      user.setAge(resultSet.getInt("age"));
      user.setSex(resultSet.getString("sex"));
      user.setDescription(resultSet.getString("description"));


如,如果修改了数据库的字段,description, 现在要改成desc, 那么就都得改变,列名硬编码到程序中。 当然,可以通过 getInt(1),getString(2) 这样的索引顺序来取得,那么列名就不硬编码了,但是 索引顺序就硬编码了。 改变sql 前后值的顺序,就有可能出错。


6.某些功能无法实现。


如 根据传过来的值,来动态的显示列。 即 前台传入列的名称,来动态的显示 列。 前台传入name 和sex, 就查询name 和sex 列, 前台传入name,sex,age 就动态查询name,sex,age 列。


二. MyBatis

二.一 MyBatis 的出现

在MyBatis 之前,是叫 ibatis, 是Apache 组织的开发的。 现在交由github 管理了。 还有一种 持久化ORM ,叫Hibernate. 前面讲过。 可以看:

Hibernate开发环境的简单搭建及常见错误(一)

将Hibernate 与 MyBatis 进行比较性 开发。


MyBatis 的下载网址是:

https://github.com/mybatis/mybatis-3


20190615133444355.png


下载之后:


20190615133524181.png


其中, mybatis-3.4.5.jar 是开发的jar 包, mybatis-3.4.5.pdf 是帮助文档, lib 是常用的关联jar 包。


20190615133649890.png


二.二 MyBatis 的作用

mybatis是一个持久层的框架,是apache下的顶级项目。


mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。


mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)


相关文章
|
存储 文件存储
如何使用Nest.js 上传文件及自定义文件名保存
在 Nest.js 中进行文件上传并自定义文件名保存的过程相对简单
756 0
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
机器学习/深度学习 XML 搜索推荐
图像自动化保存工具:Python脚本开发指南
图像自动化保存工具:Python脚本开发指南
|
缓存 监控 Java
优化Spring Boot应用的数据库访问性能
优化Spring Boot应用的数据库访问性能
|
存储 网络安全 开发工具
Git 协同开发详解:从基础命令到多人协作
Git 协同开发详解:从基础命令到多人协作
302 0
|
存储 PHP 数据安全/隐私保护
攻防世界 Web_php_unserialize
攻防世界 Web_php_unserialize
304 0
|
机器学习/深度学习 人工智能 运维
智能化运维的崛起:自动化与人工智能在IT管理中的融合
本文深入探讨了智能化运维在现代企业中的重要性,并分析了自动化技术和人工智能(AI)如何共同推动IT运维管理的革新。文章首先概述了传统运维面临的挑战,然后详细介绍了智能化运维的核心概念和实施步骤,最后通过具体案例展示了智能化运维在实际工作中的应用效果和潜在价值。
338 0
|
存储
char *str,char &str,char *& str和char str的区别
char *str,char &str,char *& str和char str的区别
414 0
|
敏捷开发 Java 测试技术
「架构」模型驱动架构设计方法及其运用
本文探讨了MDA在软件开发中的应用,从需求分析到测试,使用UML建模功能需求,通过PIM设计架构,自动生成代码以减少错误。MDA提升了可维护性、可扩展性和可移植性,通过工具如Enterprise Architect和Eclipse MDT支持自动化转换。虽然有挑战,如模型创建和平台转换,但结合敏捷方法和适当工具能有效解决,从而提高开发效率和软件质量。
1254 0
「架构」模型驱动架构设计方法及其运用
|
前端开发
elementui的el-dialog组件与el-tabs同时用导致浏览器卡死的原因解决
elementui的el-dialog组件与el-tabs同时用导致浏览器卡死的原因解决
291 0