1. 程式人生 > >Mybatis框架簡介與簡單應用

Mybatis框架簡介與簡單應用

 

框架簡介

Mybatis原名是ibatis,是apache的開源專案,是一個持久層的框架,與資料庫進行互動,將資料持久化到關係型資料庫中,目前託管在 github中;

原理簡介

java中通過JDBC對資料庫進行操作,JDBC是一套資料庫的訪問介面,mybatis持久層框架對JDBC進行了封裝; 與Hibernate不同的是,mybatis需要程式設計師自己編寫sql,進而相對於ORM(物件關係對映)框架而言更加的靈活,更加易於優化 主要完成以下兩個功能
  • 輸入對映:將java物件對映到statement中,即sql語句的輸入引數;
  • 輸出對映:將sql語句的執行結果對映成java物件;

產生的原因

如果直接使用jdbc進行程式設計的話,主要面臨以下問題:
  • 程式中存在硬編碼(資料庫驅動假愛,建立資料連線,Sql語句),不利於系統維護
    • Mybatis解決的方法是將這些全部寫在’.xml’配置檔案中
  • 資料庫連線使用時會頻繁的開關資料連線,造成資源浪費
    • 解決方法是使用連線池
  • 向preparedStatement設定引數時 將引數下標 號(從1開始)硬編碼在程式碼,並且將向佔位符號設定的引數也硬編碼了。
    • 設想解決方案:可以自動通過程式將java型別物件對映到preparedStatement中。
  • 從Resultset中取出結果集進行遍歷,將列名硬編碼
    • 設想解決方案:可以自動通過程式將sql查詢結果集對映到時java物件中,自動完成將sql查詢的列值構造成一個java物件。

環境搭建

  • 下載地址:下載mybatis
  • 檔案介紹
    • mybatis-3.2.7.jar:mybatis的核心包
    • lib:mybatis的依賴包
    • mybatis-3.2.7:mybatis使用手冊

  • 用eclipse建立一個java工程
  • 在mysql中建立一個數據庫並新建表格,插入測試資料
    • 建立資料表
      
      CREATE
      TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL COMMENT '使用者名稱稱', `birthday` date DEFAULT NULL COMMENT '生日', `sex` char(1) DEFAULT NULL COMMENT '性別', `address` varchar(256) DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
    • 插入測試資料
      
      insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) 
      values (1,'王五',NULL,'2',NULL),(10,'張三','2014-07-10','1','北京市'),(16,'張小明',NULL,'1','河南鄭州'),(22,'陳小明',NULL,'1','河南鄭州'),(24,'張三丰',NULL,'1','河南鄭州'),(25,'陳小明',NULL,'1','河南鄭州'),(26,'王五',NULL,NULL,NULL);
      
      

  • 在java工程中建立一個對應的實體類
    • java程式碼如下

package cn.itcast.mybatis.po;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
    private int id;
    private String username;// 使用者姓名
    private String sex;// 性別
    private Date birthday;// 生日
    private String address;// 地址
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", sex=" + sex
                + ", birthday=" + birthday + ", address=" + address + "]";
    }
}
  • 匯入對應的jar包
  • 書寫配置檔案

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <!-- 和spring整合後 environments配置將廢除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事務管理 -->
            <transactionManager type="JDBC" />
            <!-- 資料庫連線池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:3306/mybatisdemouser?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="" />
            </dataSource>
        </environment>
    </environments>

    <!-- 載入mapper.xml -->
    <!-- <mappers></mappers> -->

</configuration>

  • 匯入日誌檔案:log4j.properties

案例演示

需求分析

建立一套介面實現以下功能:

  • 根據使用者id查詢一個使用者資訊
  • 根據使用者名稱稱模糊查詢使用者資訊列表
  • 新增使用者
  • 更新使用者
  • 刪除使用者

構建介面類UserDao.java

package cn.wangyequn.dao;

import java.util.List;

import cn.wangyequn.domain.User;

public interface UserDao {
    //根據id查詢
    public User findUserById(Integer id);
    //根據使用者名稱模糊查詢
    public List<User> findUserByUsername(String username);
    //插入使用者
    public void insertUser(User user);
    //修改使用者
    public void updateUser(User user);
    //根據id刪除使用者
    public void deleteUserById(Integer id);
}

寫對映檔案UserMap.xml

<?xml version=“1.0” encoding=“UTF-8” ?> 

<!DOCTYPE mapper 

PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN” 

“http://mybatis.org/dtd/mybatis-3-mapper.dtd“>

<!–
** namespace應該和對映介面名一致
** 標籤應該與所要進行的操作一致
–>

<mapper namespace=“cn.wangyequn.dao.UserDao”>
<!–
** id應該和方法名一致
** parameterType應該和引數的型別一致
** resultType應該和返回值型別一致
–>

<!– 根據id查詢 –>
<select id=“findUserById” parameterType=“java.lang.Integer” resultType=“cn.wangyequn.domain.User”>
SELECT * FROM USER WHERE id = #{id}
</select>
<!– 根據使用者名稱模糊查詢 –>
<select id=“findUserByUsername” parameterType=“java.lang.String” resultType=“cn.wangyequn.domain.User”>
SELECT * FROM USER WHERE username LIKE ‘%${value}%’
</select>

<!– 新增使用者
需要輸入引數是多個值,如果傳入簡單型別是無法滿足要求。
輸入引數型別可以定義為pojo(cn.itcast.mybatis.po.User包括多個屬性)

#{}如何獲取物件的值? #{}是通過OGNL讀取物件的值,OGNL的表示式方式:屬性.屬性.屬性。。。。直到把物件中的屬性值讀取過來 過止 mysql資料庫通過select LAST_INSERT_ID();獲取自增主鍵的值,在insert語句執行之後去執行LAST_INSERT_ID()獲取新記錄的主鍵 –> <insert id=“insertUser” parameterType=“cn.wangyequn.domain.User”> <!– keyProperty:將主鍵值設定到輸入引數的哪個屬性,設定到user的id屬性中 order:selectkey中的sql語句在insert語句執行的前或後,這裡要設定成”AFTER” resultType:select LAST_INSERT_ID()查詢出的值 –> <selectKey keyProperty=“id” order=“AFTER” resultType=“java.lang.Integer”> select LAST_INSERT_ID() </selectKey> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}); </insert> <!– 使用mysql的uuid生成主鍵 –> <!– <insert id=”insertUser” parameterType=”cn.itcast.mybatis.po.User”> keyProperty:將主鍵值設定到輸入引數的哪個屬性,設定到user的id屬性中 order:select uuid()在insert執行之前去執行得到uuid作為主鍵,將主鍵值設定到user的屬性中 resultType:select uuid()查詢出的值 <selectKey keyProperty=”id” order=”BEFORE” resultType=”java.lang.String”> select uuid() </selectKey> insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address}); </insert> –> <!– 修改使用者–> <update id=“updateUser” parameterType=“cn.wangyequn.domain.User”> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> <!– 刪除使用者 –> <delete id=“deleteUserById” parameterType=“java.lang.Integer”> delete from user where id = #{id} </delete> </mapper>

編寫測試類MybatisTest.java

package cn.wangyequn.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import cn.wangyequn.dao.UserDao;
import cn.wangyequn.domain.User;

public class MybatisTest {

    @Test
    public void test() throws IOException {
        // mybatis全域性配置檔案
        String resource = "SqlMapConfig.xml";

        // 根據mybatis的全域性配置檔案構造 一個流
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 建立SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 獲取UserDao的代理物件
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User findUserById = userDao.findUserById(10);
        System.out.println("根據id 10 獲取到資料" + findUserById);
        List<User> findUserByUsername = userDao.findUserByUsername("張");
        System.out.println("根據 關鍵字 張 查詢到資料集合" + findUserByUsername);
        userDao.deleteUserById(10);
        User insertUser = new User();
        insertUser.setUsername("王業群");
        insertUser.setSex("男");
        insertUser.setBirthday(new Date());
        insertUser.setAddress("浙江杭州");
        userDao.insertUser(insertUser);
        System.out.println("插入資料:" + insertUser);
        User updateUser = new User();
        updateUser.setId(insertUser.getId());
        updateUser.setUsername("丁翔");
        updateUser.setBirthday(new Date());
        updateUser.setSex("女");
        updateUser.setAddress("安徽");
        userDao.updateUser(updateUser);
        System.out.println("更新資料" + insertUser + "為:" + updateUser);
        sqlSession.commit();
        sqlSession.close();
    }

}

具體執行流程

相關推薦

Mybatis框架簡介簡單應用

  框架簡介 Mybatis原名是ibatis,是apache的開源專案,是一個持久層的框架,與資料庫進行互動,將資料持久化到關係型資料庫中,目前託管在 github中; 原理簡介 java中通過JDBC對資料庫進行操作,JDB

shell腳本基礎的簡單介紹簡單應用

shell 變量 基礎 Shell腳本是Linux中很重要的一種“程序”。什麽shell腳本?shell腳本是提前設計的可執行語句,用來完成特定任務的文件。Shell腳本可分為交互式和非交互式交互式:指腳本在運行時,需要一些人為的參與,比如,鍵盤輸入數據,確認選項等。因為有人為的參與,所以運行時更加智能化,但

MyBatis 框架簡介

包裝 mysq 入參 ble 開發 mybatis3 poj 會話 運行環境 MyBatis 1.MyBatis簡介: 1):MyBatis是開源的持久層框架。 2):利用JDBC抽象出持久層實現。 3):提供了簡單易用的API與數據庫進行交互。

VLAN 技術的產生簡單應用

網絡技術 vlan 在傳統的LAN(局域網)中,所有的設備都是屬於同一個廣播域,所以一旦一臺主機出現問題,就很有可能會影響同廣播域的其他主機,影響範圍十分廣泛。另外所有的用戶在同一個廣播域中,會引起網絡性能的下降,浪費可貴的帶寬; 為了縮小故障影響範圍,從而實現快速故障定位,

ELK入門簡單應用

ELK簡單應用1. ELK概述ELK,也就是Elasticsearch、Logstash、Kibana三者的結合,是一套開源的分布式日誌管理方案.更多詳情,請見https://github.com/jeanphorn/elk-stackElasticsearch:負責日誌存儲、檢索和分析LogStash:負責

Admin(一)——Linux簡介簡單命令

linux centOS linux簡單命令 一、RHEL 與CentOS的區別 RHEL是紅帽公司提供的商業版Linux系統,若要獲取DVD鏡像、安全更新等技術服務支持,一般需要付費訂閱;不過構成RHEL系統的各種軟件包都是基於GPL開源協議免費發布的。 CentOS

容器部署簡單應用

pan rri 簡單應用 .cn 鏡像倉庫 explore esp 組件 ges 開啟hyper-v Win10 安裝 Docker for Windows 配置加速器:註冊阿裏雲 https://cr.console.aliyun.com/#/accelerator 配

SpringBoot-Mybatis框架使用源碼解析

sql model tro inf 了解 aso tst fin static 前言: 現在微服務架構基本已經成為一種架構正確了,而SpringBoot技術也已經被應用在各個項目中。 SpringBoot不僅僅那些傳統的好處,更多是可以與其他組件進行結合,使用戶可以更方便

Spring Security權限框架理論簡單Case

c-based db4 又能 出了 lte pen andro -o string Spring Security權限管理框架介紹 Spring Security 提供了基於javaEE的企業應用軟件全面的安全服務。這裏特別強調支持使用Spring框架構件的項目,Sprin

Mybatis框架簡介、搭建及核心元素講解

大家都知道當前比較流行的框架,如Spring、SpringMVC、Hibernate、Mybatis等框架,那今天咱們來講講當前比較流行的企業框架Mybatis。 首先先來介紹一下Mybatis這個框架:Mybatis是一個開源的資料持久化層框架,它內部封裝了通過JDBC訪問資料庫的操作,支

SSM 環境下的 AOP 配置簡單應用

一、需要匯入的 jar 包 <!-- Spring AOP 日誌管理需要匯入的包 --> <dependency> <groupId>org.aspectj</groupId> <

Deft框架簡介基本使用

deft簡介 Deft是一個超輕量級高效能O/R mapping資料訪問元件,簡單易用,幾分鐘即可上手。 原文地址:http://www.cnblogs.com/StrangeCity/p/5566471.html Deft包含如下且不限於此的優點:

windbg sx命令簡單應用

0x00 sx 命令用於控制當異常或者事件發生時偵錯程式的行為。 Sx命令對應 windbg.exe(gui)的”debug”選單項中的”Event Filters”子選單項。 基本語法如下: 用法如下: Sx:列出所有支援的event與exception。 Sxr:恢復事件與異常處理

JxBrowser概述簡單應用

Q:JxBrowser是什麼? JxBrowser是一個跨平臺的Java庫,允許將基於Google Chromium的Web瀏覽器元件整合到Java Swing / AWT / JavaFX應用程式中。使用JxBrowser,您可以將輕量級Swing / JavaFX元件嵌入到Java應用程式中,以顯

Mybatis框架中#{}${}的差別(如何防止sql注入)

預設情況下,使用#{}語法,MyBatis會產生PreparedStatement語句中,並且安全的設定PreparedStatement引數,這個過程中MyBatis會進行必要的安全檢查和轉義。 #相當於對資料 加上 雙引號,$相當於直接顯示資料 示例1: 執行SQL:select * f

主題模型(LDA)(一)--通俗理解簡單應用---一些程式碼

這篇文章主要給一些不太喜歡數學的朋友們的,其中基本沒有用什麼數學公式。  目錄 直觀理解主題模型 LDA的通俗定義 LDA分類原理 LDA的精髓 主題模型的簡單應用-希拉里郵件門 1.直觀理解主題模型 聽名字應該就知道他講的是什麼?假如有一篇文章text,通

MyBatis】(一)MyBatis基礎知識點(概念,Mybatis框架的優缺點,簡單Mybatis框架使用Demo,基本的增刪改查操作案例)

一、概念     簡單的說:一款封裝了資料庫JDBC操作的ORM框架技術.(Apache(ibatis) --> Google(Mybatis))     MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎

爬蟲-scrapy框架簡介和基礎應用

一.什麼是Scrapy?   Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用框架,非常出名,非常強悍。所謂的框架就是一個已經被集成了各種功能(高效能非同步下載,佇列,分散式,解析,持久化等)的具有很強通用性的專案模板。對於框架的學習,重點是要學習其框架的特性、各個功能的用法即可。 二.安裝

主題模型(LDA)(一)--通俗理解簡單應用

這篇文章主要給一些不太喜歡數學的朋友們的,其中基本沒有用什麼數學公式。 目錄 直觀理解主題模型 LDA的通俗定義 LDA分類原理 LDA的精髓 主題模型的簡單應用-希拉里郵件門 1.直觀理解主題模型 聽名字應該就知道他講的是什麼?假如有一

(六--一)scrapy框架簡介和基礎應用

一 什麼是scrapy框架 官方解釋 Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用框架。 可以應用在包括資料探勘,資訊處理或儲存歷史資料等一系列的程式中。 其最初是為了 頁面抓取 (更確切來說, 網路抓取 )所設計的, 也可以應用在獲取API所返回的資料(例如 Amazon