mybatis詳細解一:mybatisを使う理由

21466 ワード

一: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  )          。
二:mybatisを使ってjdbcを置換する理由
1.データベースuserテーブルを作成する
CREATE TABLE `user`  (
  `id` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '    ',
  `birthday` timestamp NULL DEFAULT NULL COMMENT '  ',
  `sex` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '  ',
  `address` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '  ',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
2.jdbcのコードを見てから、jdbcを使わない理由を確認します。
package com.mybatis.pojo;

import java.util.Date;
import java.util.List;
public class User {
    private String id; //  id
    private String username;//    
    private Timestamp birthday;//    
    private String sex;//    
    private String address;//    

    public User() {
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Timestamp getBirthday() {
        return birthday;
    }

    public void setBirthday(Timestamp birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
package com.mybatis;

import com.mybatis.pojo.User;

import java.sql.*;

/**
 * Created by user on 2019/1/24.
 */
public class JdbcUtils {
    //MySQL     
    public static String driverClass = "com.mysql.jdbc.Driver";
    //      
    public static String userName = "root";
    //     
    public static String passWord = "123";
    //    URL
    public static String url = "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8";
    //       
    public static Connection conn = null;
    //         ,         PreparedStatement         
    public static PreparedStatement ps = null;
    //       
    public static ResultSet rs = null;

    public static User getUserById(String id){
        User user = new User();
        try {
            //       
            Class.forName(driverClass);
            //       
            conn = DriverManager.getConnection(url, userName, passWord);
            //   sql   ,?     
            String sql = "select * from `user` where `id`=?";
            //        statement
            ps = conn.prepareStatement(sql);
            //  sql      ,    sql       ?( 1  ),          
            ps.setString(1, id);
            //       sql     ,      
            rs = ps.executeQuery();
            while (rs.next()) {

               user.setId(rs.getString("id"));
               user.setUsername(rs.getString("username"));
               user.setAddress(rs.getString("address"));
               user.setBirthday(rs.getTimestamp("birthday"));
               user.setSex(rs.getString("sex"));
            }
        } 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  user;
    }

    public static void main(String[] args) {
        System.out.println(JdbcUtils.getUserById("1"));
    }
}
三:分析
(    mybatis    ,         ,        mybatis                  ,               )
上記の例を通して、次のように分析できます。
①、問題一://データベースドライバクラスをロードする。データベース接続conn=DriverManager.get Connectionを取得します。この2つのコードは私達に頻繁に接続を取得してクローズさせ、データベースの資源の浪費をもたらし、データベースの性能に影響を与えます。
②、問題二:sql文をハードにプログラムに符号化し、sql文が修正されたら、Javaコードを再コンパイルする必要があり、システムのメンテナンスに不利であり、プログラムの拡張開放に対する修正閉鎖の条件を満たさない。
    :  sql       xml    ,   sql      ,        Java       ,    
③問題3:PreparedSttementにパラメータを設定し、プレースホルダの設定値はいずれもJavaコードにハードエンコードされており、システムの維持に不利です。
    :  sql                xml    
④問題四:結果集をresultsetから巡回した場合、表のフィールドにハードコードが存在し、システムの維持に不利です。
    :             Java   
⑤問題5:重複コードが特に多く、頻繁なtry-catch
    :        try-catch     
⑥、問題六:キャッシュが悪いので、データ量が大きい場合、この方式の性能は特に低いです。
⑦問題7:sqlの移植性が悪いので、データベースを変えたらsql文を書き換えるかもしれません。
    :  JDBC               ,        sql   ,