MyBaits入门-简介

目录

1、什么是MyBatis?

2、为什么会有 MyBatis?

3、分析

1、什么是MyBatis?

历史
前身是iBatis,原来是Apache的一个开源项目,在2010年6月份这个项目迁移到了Google Code,随着该项目的不断升级,iBatis3.x也正式推出,并同时改名为MyBatis。随后MyBatis项目迁移到了Github。

官网地址
https://mybatis.org/mybatis-3/

为什么要学习MyBatis框架
ORM【对象关系映射】
O:Object
R:Relationship
M:Mapping

作用:就是将Java的面向对象的数据【实体】转换成MySQL的面向关系的数据【表】
原生态jdbc程序的问题及总结
数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。解决办法:使用数据库连接池管理数据库连接。将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。期望:就如同我们jdbc的url、user和password等信息单独的配置在一个配置文件中一样,期望可以将sql语句配置在配置文件中,即使sql变化,不需要对java代码进行重新编译。向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。期望:将sql语句及占位符号和参数全部配置在配置文件中。从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,如果表的字段修改了则代码也需要修改,不利于系统维护。期望:将查询的结果集,自动映射成java对象。3.3、如何解决
使用MyBatis。mybatis让开发者将主要精力放在sql上,通过mybatis提供的映射方式可以很灵活的写出满足需要sql语句,换句话说,mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。4、小总结
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的实体映射成数据库中的记录。
  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 表为:

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 查询操作:

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 readPerson(){
        List list = newArrayList<>();
        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 = newPerson();
                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 框架的入门实例介绍。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值