1. 程式人生 > >Mybatis常用總結一

Mybatis常用總結一

開發十年,就只剩下這套架構體系了! >>>   

這一節的學習強烈建議實際操作

主鍵自增和自定義主鍵

實現描述:我們在寫程式時,時常會遇到這樣的問題:插入一條資料,但因有主鍵的存在,而有時候會報“違反唯一性約束”的錯誤,我們可以使用如下方式解決

<insert id="insertRole" parameterType="role" useGeneratedKeys="true" keyProperty="id">
   insert into t_role(role_name,note) values (#{roleName},#{note})
</insert>

我們使用keyProperty屬性指定id為主鍵欄位,同時使用useGeneratedKeys屬性告訴MyBatis這個主鍵是否使用資料庫的內建規則生成。

mybatis引數傳遞

mybatis引數傳遞過程中,如果多個引數正好是我們業務邏輯的資料模型,我們可以直接傳入pojo,#{屬性名}取出屬性值。

如果多個引數不是業務模型中的資料,沒有對應的pojo,不經常使用,我們可以採用map進行引數傳遞,#{key}取出map中的值。

如果多個引數不是業務模型中的資料,沒有對應的pojo,經常使用,新建立一個數據實體類來進行接收引數,#{key}取出map中的值。

字串傳遞引數

@Param 指定在mapper檔案中需要使用的名稱,多個引數傳遞的時候請指定,否則mapper檔案可能接收不到資料值

public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);

<select id="selectUser" resultMap="UserResultMap">
    select * from user
    where user_name = #{userName} and dept_id = #{deptId}
</select>

map傳遞引數

public User selectUser(Map<String, Object> params);

<select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">
    select * from user
    where user_name = #{userName} and dept_id = #{deptId}
</select>

#{}裡面的名稱對應的是Map裡面的key名稱。

Java Bean傳參法

public User selectUser(User user);

<select id="selectUser" parameterType="com.test.User" resultMap="UserResultMap">
    select * from user
    where user_name = #{userName} and dept_id = #{deptId}
</select>

#{} ,${}區別

使用${}方式傳入的引數,mybatis不會對它進行特殊處理,而使用#{}傳進來的引數,mybatis預設會將其當成字串。可能在賦值給如id=#{id}和id=${id}看不出多大區別,但是作為表名或欄位引數時可以明顯看出,可以看看下面的例子:

selec * from #{table} => select * from "test";

select * from ${table} => select * from test;

很明顯,前者多了字串的引號,會失敗,後者正常查詢會成功; 所以對於傳入分組(order)欄位或者排序欄位(order),應使用${},避免出現order by "id" 等情況。

#和$在預編譯處理中是不一樣的。#類似jdbc中的PreparedStatement,對於傳入的引數,在預處理階段會使用?代替,比如:

select * from student where id = ?;

待真正查詢的時候即在資料庫管理系統中(DBMS)才會代入引數。 而${}則是簡單的替換,如下:

select * from student where id = 2;

總結

1、能使用#{}的地方應儘量使用#{}

2、像PreparedStatement ,#{}可以有效防止sql注入,${}則可能導致sql注入成功。所謂sql注入,就是指把使用者輸入的資料拼接到sql語句後面作為sql語句的一部分執行,例如:

select * from user where name=${username} and password=#{passsword}

select * from user where name=' admin ' and password='123456' or 'abc'= 'abc';

使用者輸入使用者名稱 username=admin,password為password='123456' or 'abc'= 'abc';這樣sql注入成功。

防止sql注入的幾種方式

  • jdbc使用 PreparedStatement代替Statement, PreparedStatement 不僅提高了程式碼的可讀性和可維護性.而且也提高了安全性,有效防止sql注入;

  • 程式程式碼中使用正則表示式過濾特殊字元。

  • 前端程式碼過濾特殊字元

MyBatis結果集對映(ResultMap)

Mybatis的查詢可以將查詢出的結果集轉換成Java物件。ResultMap有以下幾種用途:

  • 如果資料表的列名和Java物件的屬性名不一致,在ResultMap中可以進行關聯
  • 定義一對一的關聯
  • 定義一對多的關聯

sql如下

CREATE TABLE t_user (
  id INT(10) NOT NULL AUTO_INCREMENT,
  loginId VARCHAR(20) DEFAULT NULL,
  userName VARCHAR(100) DEFAULT NULL,
  roleId INT(10),
  note VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=INNODB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
 
INSERT INTO t_user(loginId,userName,roleId,note) VALUES ('queen', '奎恩', 1, '專門負責提鞋的。。。');
INSERT INTO t_user(loginId,userName,roleId,note) VALUES ('king', '金獅子', 2, '磁性果實能力');
INSERT INTO t_user(loginId,userName,roleId,note) VALUES ('Lucy', '路西', 3, '打敗多弗朗明哥。。。');
=========================================================
CREATE TABLE t_role (
  id INT(10) NOT NULL AUTO_INCREMENT,
  roleName VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=INNODB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
 
INSERT INTO t_role(roleName) VALUES ('自定義角色');
INSERT INTO t_role(roleName) VALUES ('前海賊');
INSERT INTO t_role(roleName) VALUES ('未來海賊王');

實體物件

package com.springmvc.pojo;

/**
 * @program: TestSSM
 * @description:
 * @author: lee
 * @create: 2019-03-25
 **/
/**
 * @since 2017-08-08
 * @author queen
 * 定義一個Java類Role
 *
 */
public class Role {
    private int id;
    private String roleName;

    public int getId() {
        return id;
    }

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

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public Role(){

    }

    public Role(int id, String roleName) {
        this.id = id;
        this.roleName = roleName;
    }

    @Override
    public String toString() {
        return "Role [id=" + id + ", roleName=" + roleName + "]";
    }

}


package com.springmvc.pojo;

/**
 * @program: TestSSM
 * @description:
 * @author: lee
 * @create: 2019-03-25
 **/
/**
 * @since 2017-08-08
 * @author queen
 * 定義一個Java類
 *
 */
public class User {
    // ID,唯一性
    private int id;
    // 登入ID
    private String loginId;
    // 使用者名稱
    private String userName;
    // 角色
    private Role role;
    // 備註
    private String note;

    public User(){

    }

    public User(int id, String loginId, String userName, Role role, String note) {
        this.id = id;
        this.loginId = loginId;
        this.userName = userName;
        this.role = role;
        this.note = note;
    }

    public int getId() {
        return id;
    }

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

    public String getLoginId() {
        return loginId;
    }

    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", loginId=" + loginId + ", userName="
                + userName + ", role=" + role + ", note=" + note + "]";
    }

}

最基本的對映方式

<?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">
<mapper namespace="com.springmvc.dao.AdminMapper">

   <select id="getUserById" resultMap="userResultMap">
        select m.id id, m.loginId loginId, m.userName userName, m.roleId roleId,m.note note, n.id role_id, n.roleName roleName
        from t_user m left join t_role n on m.roleId=n.id
        where m.id=#{id}
    </select>
    <resultMap type="com.springmvc.pojo.User" id="userResultMap">
        <id property="id" column="id"/>
        <result property="loginId" column="loginId" />
        <result property="userName" column="userName"/>
        <result property="note" column="note"/>
        <result property="role.id" column="role_id"/>
        <result property="role.roleName" column="roleName"/>
    </resultMap>

</mapper>

巢狀對映

<?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">
<mapper namespace="com.springmvc.dao.AdminMapper">


<select id="getUserById" resultMap="userResultMap">
    select m.id id, m.loginId loginId, m.userName userName, m.roleId roleId,m.note note, n.id role_id, n.roleName roleName
    from t_user m left join t_role n on m.roleId=n.id
    where m.id=#{id}
</select>
<resultMap type="com.springmvc.pojo.User" id="userResultMap">
    <id property="id" column="id"/>
    <result property="loginId" column="loginId"/>
    <result property="userName" column="userName"/>
    <result property="note" column="note"/>
    <!--assocication可以指定聯合的JavaBean物件
        property="role"指定哪個屬性是聯合的物件
        javaType:指定這個屬性物件的型別
    -->
    <association property="role" javaType="com.springmvc.pojo.Role">
        <id column="id" property="id"/>
        <result column="roleName" property="roleName"/>
    </association>
</resultMap>
</mapper>

第三種方式

<?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">
<mapper namespace="com.springmvc.dao.AdminMapper">


    <select id="getUserById" resultMap="userResultMap">
      select m.id id, m.loginId loginId, m.userName userName, m.roleId roleId,m.note note, n.id role_id, n.roleName roleName
      from t_user m left join t_role n on m.roleId=n.id
      where m.id=#{id}
    </select>

    <resultMap id="roleResultMap" type="com.springmvc.pojo.Role">
        <id column="id" property="id"/>
        <result column="roleName" property="roleName"/>
    </resultMap>
    <resultMap type="com.springmvc.pojo.User" id="userResultMap">
        <id property="id" column="id"/>
        <result property="loginId" column="loginId"/>
        <result property="userName" column="userName"/>
        <result property="note" column="note"/>
        <!--assocication可以指定聯合的JavaBean物件
            property="role"指定哪個屬性是聯合的物件
            javaType:指定這個屬性物件的型別
        -->
        <association property="role" javaType="com.springmvc.pojo.Role" resultMap="roleResultMap">
        </association>
    </resultMap>
</mapper>

collection用法和association用方法類似

因為修改了表字段和Java實體屬性,資料庫裡面執行如下sql語句

-- ----------------------------
--  Table structure for `t_role`
-- ----------------------------
DROP TABLE IF EXISTS `t_role`;
CREATE TABLE `t_role` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `roleName` varchar(20) DEFAULT NULL,
  `role_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `t_role`
-- ----------------------------
BEGIN;
INSERT INTO `t_role` VALUES ('1', '自定義角色', '1'), ('2', '前海賊', '1'), ('3', '未來海賊王', '2');
COMMIT;

Role實體類如下

package com.springmvc.pojo;

/**
 * @program: TestSSM
 * @description:
 * @author: lee
 * @create: 2019-03-25
 **/
/**
 * @since 2017-08-08
 * @author queen
 * 定義一個Java類Role
 *
 */
public class Role {
    private int id;
    private String roleName;
    private String roleId;

    public String getRoleId() {
        return roleId;
    }

    public void setRoleId(String roleId) {
        this.roleId = roleId;
    }

    public int getId() {
        return id;
    }

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

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public Role(){

    }

    public Role(int id, String roleName) {
        this.id = id;
        this.roleName = roleName;
    }

    @Override
    public String toString() {
        return "Role [id=" + id + ", roleName=" + roleName + "]";
    }

}

mapper 檔案如下

<?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">
<mapper namespace="com.springmvc.dao.AdminMapper">


    <select id="getUserById" resultMap="userResultMap">
      select m.id as sid, m.loginId loginId, m.userName userName, m.roleId roleId,m.note note,
      n.id as rid, n.roleName roleName,n.role_id
      from t_user m left join t_role n on m.roleId=n.role_id
      where m.id = #{id}
    </select>

    <resultMap id="roleResultMap" type="com.springmvc.pojo.Role">
        <id column="rid" property="id"/>
        <result column="roleName" property="roleName"/>
        <result column="role_id" property="roleId"/>
    </resultMap>
    <resultMap type="com.springmvc.pojo.User" id="userResultMap">
        <id property="id" column="sid"/>
        <result property="loginId" column="loginId"/>
        <result property="userName" column="userName"/>
        <result property="note" column="note"/>
        <!--assocication可以指定聯合的JavaBean物件
            property="role"指定哪個屬性是聯合的物件
            javaType:指定這個屬性物件的型別
        -->
        <collection property="role" ofType="com.springmvc.pojo.Role" javaType="list" resultMap="roleResultMap">
        </collection>
    </resultMap>
</mapper>

資料庫查詢結果

相關推薦

Mybatis常用總結

開發十年,就只剩下這套架構體系了! >>>   

二:MyBatis學習總結(二)——使用MyBatis對錶執行CRUD操作 MyBatis學習總結()——MyBatis快速入門

上一篇博文MyBatis學習總結(一)——MyBatis快速入門中我們講了如何使用Mybatis查詢users表中的資料,算是對MyBatis有一個初步的入門了,今天講解一下如何使用MyBatis對users表執行CRUD操作。本文中使用到的測試環境是上一篇博文中的測試環境。 一、使用MyBatis對錶執行

Mybatis學習總結MyBatis配置檔案中的配置及其優化

Mybatis介紹        MyBatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或註解用於配置和原始對映,將

MyBatis學習總結()——MyBatis快速入門

一、Mybatis介紹      MyBatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或註解用於配置和原始對映,將介面和

Mybatis學習總結Mybatis的helloworld

近日跟隨某網站某PDF開始學習MyBatis框架。 一 MyBatis介紹 MyBatis 是支援 普通 SQL 查詢 , 儲存過程 和 高階對映 的優秀持久層框架。MyBatis 消除了幾乎所有的

Mybatis學習總結

1.MyBatis簡介 MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis,實質上Mybatis對ibatis進行一些改進。    

MyBatis學習總結()——MyBatis快速入門(轉發)

一、Mybatis介紹      MyBatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJO(Plain Old Ja

MyBatis學習總結()——MyBatis快速…

一、Mybatis介紹      MyBatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果

MyBatis總結()

配置數據庫連接 esp builder tcl out acl urn -m param 一、Mybatis介紹 MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及對結果集的檢索封裝。

jQuery中的常用內容總結()

說明 一個 select 兩個 身體健康 作用域 class block class選擇器 jQuery中的常用內容總結(一) 前言   不好意思(????),由於回家看病以及處理一些其它事情耽擱了,不然這篇博客本該上上周或者上周寫的;同時閑談幾句:在這裏建議各位開發的

Go常用功能總結階段

sep format 字節數組 ngx str1 [] 構造函數 當前時間 mat 1. go語言從鍵盤獲取輸入內容   <1. 最簡單的辦法是使用 fmt 包提供的 Scan 和 Sscan 開頭的函數。請看以下程序: package main import "

MyBatis總結:快速入門

version rac 文件 ctype group esp args select ransac 簡介 MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。My

MyBatis學習總結)——ORM概要與MyBatis快速起步

管理 stat prim aot 驅動 單元測試 build sta 環境 目錄 一、ORM 1.1、ORM簡介 1.2、ORM的概念 1.3、ORM的優缺點 二、MyBatis 2.1、MyBatis的特點 2.2、MyBatis工作流程

MyBatis的學習總結

一、MyBatis的介紹: MyBatis本是apache的一個開源專案iBatis,2010年這個專案由apache software foundation遷移到google code,並改名為MyBatis。 MyBtis是一個優秀的持久層框架,它對jdbc的

常用框架():spring+springMvc+mybatis+maven

專案說明: (1) 本例採用 maven web 工程做例子講解 (2) 利用mybaits 提供的程式碼生成工具自動生成程式碼(dao介面,sql mapper對映檔案,pojo資料庫對映類) (3) 資料庫用 MySQL 專案構建: 一,新建maven

Android開發常用的開源專案總結[]

最近Android開發的過程中,遇到一些常見的需求,開源專案可以滿足需求,使用開源專案可以迅速的把APP框架搭起來,提升開發效率,再次總結一下,方便後續的開發流程。   001 檔案下載  FileDownloader      7.

linux常用命令總結

rm -rf * //刪除所有 rm dubbo-admin-tomcat //刪除檔案 ps -ef | grep java //檢視正在跑的程序 kill -9 10898 tai

Java基礎知識總結 () Object 常用方法

java.lang Object:是所有繼承類的的根類子類的構造方法預設訪問的是父類的無參構造方法 java.lang Object 類的方法 public final native Class<?> getClass() //返回此 Object 執行時的類 pu

常用排序演算法總結()

  目錄 氣泡排序   雞尾酒排序   選擇排序 歸併排序 堆排序 快速排序   我們通常所說的排序演算法往往指的是內部排序演算法,即資料記錄在記憶體中進行排序。 排序演算法大體可分為兩種:     一種是比較排序,時間複雜度O(nlogn) ~ O(n^2),主

常用演算法題目總結(陣列篇)

如何用遞迴實現陣列求和? 程式碼如下: #include "stdafx.h" #include<iostream> #include<string> using namespace std; template<class