1. 程式人生 > >Mybatis學習筆記(傳智播客)(完結)

Mybatis學習筆記(傳智播客)(完結)

說明:本文由大量的原始碼,及截圖,建議讀者,操作一遍。ide:IDEA。文末有筆記及視訊分享

Mybatis

1、對原生態jdbc程式(單獨使用jdbc開發)問題總結

先來看一部分程式碼

Public static void main(String[] args) {
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;

            try
{ //載入資料庫驅動 Class.forName("com.mysql.jdbc.Driver"); //通過驅動管理類獲取資料庫連結 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "mysql"); //定義sql語句 ?表示佔位符 String sql = "select * from user where username = ?"
; //獲取預處理statement preparedStatement = connection.prepareStatement(sql); //設定引數,第一個引數為sql語句中引數的序號(從1開始),第二個引數為設定的引數值 preparedStatement.setString(1, "王五"); //向資料庫發出sql執行查詢,查詢出結果集 resultSet = preparedStatement.executeQuery(); //遍歷查詢結果集
while(resultSet.next()){ System.out.println(resultSet.getString("id")+" "+resultSet.getString("username")); } } catch (Exception e) { e.printStackTrace(); }finally{ //釋放資源 if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(preparedStatement!=null){ try { preparedStatement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

上面程式碼有如下幾個問題:

  • 資料庫連線,使用時建立,不使用就關閉,對資料庫進行頻繁連線開啟和關閉,造成資料庫資源的浪費
    • 解決:使用資料庫連線池管理資料庫連線
  • 將sql 語句硬編碼到Java程式碼中,如果sql語句修改,需要對java程式碼重新編譯,不利於系統維護
    • 解決:將sql語句設定在xml配置檔案中,即使sql變化,也無需重新編譯
  • 向preparedStatement中設定引數,對佔位符位置和設定引數值,硬編碼到Java檔案中,不利於系統維護
    • 解決:將sql語句及佔位符,引數全部配置在xml檔案中
  • 從resutSet中遍歷結果集資料時,存在硬編碼,將獲取表的欄位進行硬編碼,不利於系統維護。
    • 解決:將查詢的結果集,自動對映成java物件

2、Mybatis框架原理(掌握)

  • 什麼是Mybatis?
    • mybatis是一個持久層的框架,是apache下的頂級專案。
    • mybatis託管到goolecode下,後來託管到github下:mybatis Github地址
    • mybatis讓程式將主要精力放在sql上,通過mybatis提供的對映方式,自由靈活生成(半自動化,大部分需要程式設計師編寫sql)滿足需要sql語句。
    • mybatis可以將向 preparedStatement中的輸入引數自動進行輸入對映,將查詢結果集靈活對映成java物件。(輸出對映)
  • Mybatis原理圖
    這裡寫圖片描述

3、Mybatis入門程式

  • Mybatis和SpringMVC實現訂單商品案例
  • 需求
    • 根據使用者的id查詢使用者資訊
    • 根據使用者的名稱模糊查詢使用者資訊
    • 新增使用者
    • 刪除使用者
    • 更新使用者
  • Mybatis的執行環境(jar包)

    • 從這裡點選下載

      筆者下載的是:
      這裡寫圖片描述
      下載mybatis-3.4.6.zip解壓即可
      這裡寫圖片描述

      • lib下:依賴包
      • mybatis-3.4.6.jar:核心 包
      • mybatis-3.4.6.pdf,操作指南

    目錄結構:
    這裡寫圖片描述
    jar包結構
    這裡寫圖片描述
    過程中需要資料庫的連線,junit的除錯,注意要將jar包build path!

log4j.properties

# Global logging configuration
# 開發環境下,日誌級別要設定成DEBUG或者ERROR
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

SqlMapConfig.xml

<?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/mybatis?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="" />
            </dataSource>
        </environment>
    </environments>
    <!--載入對映檔案-->
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
    </mappers>
</configuration>

User.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">
<!--
    名稱空間,作用為,對sql進行分類化管理,理解sql隔離,
    注意:使用mapper代理方法開發,namespace有特殊作用
-->
<mapper namespace="test">
    <!--在對映檔案中配置sql-->
    <!--
        findUserById
        通過select執行資料庫查詢
        id:標識對映檔案的sql
        將sql語句封裝到mappedStatement物件中,所以將id稱為Statement的id
        #{}:表示一個佔位符
        parameterType:指定輸入引數的型別
        #{id}:其中的id表示接收輸入的引數,引數的名稱就是id,如果輸入引數型別為簡單型別,那麼#{}中的引數可以任意,可以是value或其他
        resultType:指定sql輸出結果的所對映的Java物件型別,select指定的resultType表示將單條記錄對映成的Java物件
    -->
    <select id="findUserById" parameterType="int" resultType="com.nuc.mybatis.po.User">
        select * from user where id=#{VALUE }
    </select>




    <!--
        findUserByName
        ${}:表示拼接字串,將接收到的sql不加任何修飾拼接在sql語句裡
        使用${}拼接sql,可能會引起sql注入,一般不建議使用
        ${value}:接收引數的內容,如果傳入的的是簡單型別,${}中只能使用value
    -->
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.nuc.mybatis.po.User">
        select * from user WHERE username LIKE '%${value}%'
    </select>




    <!--
        新增使用者
        parameterType:指定引數型別為pojo型別
        #{}中指定pojo的屬性名,接收到的pojo物件的屬性值,mybatis通過OGNL獲取物件的值
        SELECT LAST_INSERT_ID():得到剛剛insert進去的記錄的主鍵值,只適用於主鍵自增
        非主鍵自的則需要使用uuid()來實現,表的id型別也得設定為tring(詳見下面的註釋)
        keyProperty:將查詢到的主鍵值設定到SparameterType指定的物件的哪個屬性
        order:SELECT LAST_INSERT_ID()執行順序,相當於insert語句來說它的實現順序

    -->
    <insert id="insertUser" parameterType="com.nuc.mybatis.po.User">
        <!--uuid()-->
        <!--
            <selectKey keyProperty="id" order="AFTER" resultType="java.lang.String">
              SELECT uuid()
            </selectKey>
            insert into user (id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address})
        -->
      <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
          SELECT LAST_INSERT_ID()
      </selectKey>
      insert into user (username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
    </insert>


    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>

    <update id="updateUser" parameterType="com.nuc.mybatis.po.User">
        UPDATE user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </update>
</mapper>

User.java

package com.nuc.mybatis.po;

import java.util.Date;

public class User {
    //使用者po
    //屬性名和資料庫欄位名對應
    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;
    }
}

MybatisFirst.java

package com.nuc.mybatis.first;

import com.nuc.mybatis.po.User;
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.Test;

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

public class MybatisFirst {
    //根據id查詢使用者資訊,得到一條記錄
    @Test
    public void findUserByIdTest() throws IOException {
        //mybatis配置檔案
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //建立會話工廠
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通過工廠得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通過SqlSession操作資料庫
        //第一個引數:對映檔案中的statement的id,等於namespace+"."+statement的id
        //第二個引數:指定和對映檔案中所匹配的所有parameterType的型別
        //sqlSession.selectOne()的結果是對映檔案中所匹配的resultType型別的物件
        User user = sqlSession.selectOne("test.findUserById",1);
        System.out.println(user);
        //釋放資源
        sqlSession.close();
    }
    //根據使用者名稱稱查詢使用者列表
    @Test
    public void findUserByName() throws IOException {
        //mybatis配置檔案
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //建立會話工廠
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通過工廠得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> list= sqlSession.selectList("test.findUserByName","小明");
        System.out.println(list);
        sqlSession.close();
    }
/*
    小結:
    selectOne和selectList:

    selectOne表示查詢出一條記錄進行對映。如果使用selectOne可以實現使用selectList也可以實現(list中只有一個物件)。
    selectList表示查詢出一個列表(多條記錄)進行對映。如果使用selectList查詢多條記錄,不能使用selectOne。
    如果使用selectOne報錯:
    org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4

 */
    @Test
    public void insertUserTest() throws IOException {
        //mybatis配置檔案
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //建立會話工廠
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通過工廠得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User();
        user.setUsername("宋江濤");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("山西");
        //list中的user和對映檔案User.xml中的resultType的型別一直
        sqlSession.insert("test.insertUser",user);
        //提交事務
        sqlSession.commit();
        //獲取主鍵
        System.out.println(user.getId());
        sqlSession.close();
    }
    //刪除使用者
    @Test
    public void deleteUserTest() throws IOException {
        //mybatis配置檔案
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //建立會話工廠
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通過工廠得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //list中的user和對映檔案User.xml中的resultType的型別一直
        sqlSession.delete("test.deleteUser",30);
        //提交事務
        sqlSession.commit();
        sqlSession.close();
    }

    //更新使用者
    @Test
    public void updateUserTest() throws IOException {
        //mybatis配置檔案
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //建立會話工廠
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通過工廠得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User();
        user.setId(27);
        user.setUsername("宋江濤new2");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("山西太原new");
        //list中的user和對映檔案User.xml中的resultType的型別一直
        sqlSession.update("test.updateUser",user);
        //提交事務
        sqlSession.commit();
        sqlSession.close();
    }
}

資料庫的設計圖
這裡寫圖片描述
這裡寫圖片描述
部分測試結果
這裡寫圖片描述
jdbc的測試程式,前面已經沾過。
重點內容在程式碼的註釋中均已說明

mybatis和hibernate本質區別和應用場景

  • hibernate:是一個標準ORM框架(物件關係對映)。入門門檻較高的,不需要程式寫sql,sql語句自動生成了。
    對sql語句進行優化、修改比較困難的。

    • 應用場景:
      • 適用與需求變化不多的中小型專案,比如:後臺管理系統,erp、orm、oa。。
  • mybatis:專注是sql本身,需要程式設計師自己編寫sql語句,sql修改、優化比較方便。mybatis是一個不完全 的ORM框架,雖然程式設計師自己寫sql,mybatis 也可以實現對映(輸入對映、輸出對映)。

    • 應用場景:
      • 適用與需求變化較多的專案,比如:網際網路專案。

企業進行技術選型,以低成本 高回報作為技術選型的原則,根據專案組的技術力量進行選擇。

4、Mybatis開發dao的方法

  • 原始dao開發方法(程式需要編寫dao介面和dao實現類)(掌握)

    • 在原有專案的基礎上,src目錄下建立com.nuc.mybatis.dao
    • 在這個包裡有兩個檔案,一個是UserDao.java,另一個是UserDaoImpl.java這個類繼承介面UserDao.java
    • 在建立一個和src同級的資料夾(記的把它標記為sources)具體方法見詳情
    • 在test下建立com.nuc.mybatis.test,建立類UserDaoImplTest.java

      具體目錄結構:
      這裡寫圖片描述
      結構中的相關mapper請先忽略

UserDao.java

package com.nuc.mybatis.dao;

import com.nuc.mybatis.po.User;

public interface UserDao {
    //dao原始開發
    //根據id查詢使用者資訊
    public User findUserById(int id) throws Exception;
    //新增使用者
    public void insertUser(User user) throws Exception;
    //刪除使用者
    public void deleteUser(int id) throws Exception;
}

UserDaoImpl.java

package com.nuc.mybatis.dao;

import com.nuc.mybatis.po.User;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSession;

public class UserDaoImpl implements UserDao {
    //原生態的dao
    //需要向dao實現類裡注入SqlSessionFactory
    //通過構造方法
    private SqlSessionFactory sqlSessionFactory;

    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
        this.sqlSessionFactory=sqlSessionFactory;
    }
    @Override
    public User findUserById(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = sqlSession.selectOne("test.findUserById",id);
        sqlSession.close();
        return user;
    }

    @Override
    public void insertUser(User user) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert("test.insertUser",user);
        sqlSession.commit();
        sqlSession.close();

    }

    @Override
    public void deleteUser(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert("test.deleteUser",id);
        sqlSession.commit();
        sqlSession.close();
    }
}

UserDaoImplTest.java

package com.nuc.mybatis.test;

import com.nuc.mybatis.mapper.UserMapper;
import com.nuc.mybatis.po.User;
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 java.io.InputStream;
import java.util.List;

public class UserMapperTest {
    //原始dao的測試
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setUp() throws Exception{
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //建立會話工廠
        sqlSessionFactory = new
                SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void testFindUserById() throws Exception{
      SqlSession sqlSession = sqlSessionFactory.openSession();
       //建立UserMapper的物件,mybatis自動呼叫
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.findUserById(1);
        System.out.println(user);

    }
    @Test
    public void testFindUserByName() throws Exception{
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //建立UserMapper的物件,mybatis自動呼叫
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> list= userMapper.findUserByName("宋江濤");
        System.out.println(list);
    }
    //其他的測試,可以照貓畫虎
}

測試結果:
這裡寫圖片描述

  • Mybatis的mapper介面(相當於dao介面)代理開發方法(掌握)

    根據上面的結構圖建立相應檔案,原始碼如下:

UserMapper.java

package com.nuc.mybatis.mapper;

import com.nuc.mybatis.po.User;

import java.util.List;

public interface UserMapper {
    //mapper代理開發和dao開發對比
//    mapper介面,相當於dao介面,mybatis可以自動生成mapper介面實現類的代理物件
    //根據id查詢使用者資訊
    public User findUserById(int id) throws Exception;
    //根據使用者名稱查詢使用者列表
    public List<User>findUserByName(String name) throws Exception;
    //新增使用者
    public void insertUser(User user) throws Exception;
    //刪除使用者
    public void deleteUser(int id) throws Exception;
}

UserMapper.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">
<mapper namespace="com.nuc.mybatis.mapper.UserMapper">
    <select id="findUserById" parameterType="int" resultType="com.nuc.mybatis.po.User">
        select * from user where id=#{VALUE }
    </select>
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.nuc.mybatis.po.User">
        select * from user WHERE username LIKE '%${value}%'
    </select>

    <insert id="insertUser" parameterType="com.nuc.mybatis.po.User">

      <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
          SELECT LAST_INSERT_ID()
      </selectKey>
      insert into user (username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
    </insert>


    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>

    <update id="updateUser" parameterType="com.nuc.mybatis.po.User">
        UPDATE user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </update>
</mapper>

在測試之前需要在SqlMapConfig.xml中載入mapper.xml這個對映檔案
這裡寫圖片描述
UserMapperTest.java

package com.nuc.mybatis.test;

import com.nuc.mybatis.mapper.UserMapper;
import com.nuc.mybatis.po.User;
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 java.io.InputStream;
import java.util.List;

public class UserMapperTest {
    //原始mapper的測試
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setUp() throws Exception{
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //建立會話工廠
        sqlSessionFactory = new
                SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void testFindUserById() throws Exception{
      SqlSession sqlSession = sqlSessionFactory.openSession();
       //建立UserMapper的物件,mybatis自動呼叫
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.findUserById(1);
        System.out.println(user);

    }
    @Test
    public void testFindUserByName() throws Exception{
    //返回列表測試
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //建立UserMapper的物件,mybatis自動呼叫
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> list= userMapper.findUserByName("宋江濤");
        System.out.println(list);
    }
}

部分測試結果:
這裡寫圖片描述
總結:

  • 原始dao開發問題
    • dao介面實現類方法中存在大量模板方法,設想能否將這些程式碼提取出來,大大減輕程式設計師的工作量。
    • 呼叫sqlsession方法時將statement的id硬編碼了
  • mapper開發

    • 只需要編寫兩個檔案,mapper.java,mapper.xml。即可,不需要類來繼承它。
    • mapper開發只需要遵守幾個規範即可

      • 在mapper.xml中namespace等於mapper介面地址
        這裡寫圖片描述
      • mapper.java介面中的方法名和mapper.xml中statement的id一致
        這裡寫圖片描述
        這裡寫圖片描述
      • mapper.java介面中的方法輸入引數型別和mapper.xml中statement的parameterType指定的型別一致。
        這裡寫圖片描述
        這裡寫圖片描述
      • mapper.java介面中的方法返回值型別和mapper.xml中statement的resultType指定的型別一致。
        這裡寫圖片描述
        這裡寫圖片描述
    • 其實,以上開發規範主要是對下邊的程式碼進行統一生成:

      User user = sqlSession.selectOne("test.findUserById", id);
      sqlSession.insert("test.insertUser", user);
      。。。。
    • mapper介面方法引數只能有一個是否影響系統 開發?mapper介面方法引數只能有一個,系統是否不利於擴充套件維護?

      • 系統 框架中,dao層的程式碼是被業務層公用的。
      • 即使mapper介面只有一個引數,可以使用包裝型別的pojo滿足不同的業務方法的需求。

      注意:持久層方法的引數可以包裝型別、map。。。,service方法中建議不要使用包裝型別(不利於業務層的可擴充套件)。

5、Mybatis配置檔案SqlMapConfig.xml

  • properties(屬性)

    • 將資料庫連線的引數單獨配置在,db.properties中,只需要在SqlMapConfig.xml中載入db.properties的屬性值。在SqlMapConfig.xml中就不需要對資料庫連線引數硬編碼。
    • 好處:方便對引數進行統一管理,其它xml可以引用該db.properties
    • 特性: MyBatis 將按照下面的順序來載入屬性:

      • 在 properties 元素體內定義的屬性首先被讀取。
      • 然後會讀取properties 元素中resource或 url 載入的屬性,它會覆蓋已讀取的同名屬性。
      • 最後讀取parameterType傳遞的屬性,它會覆蓋已讀取的同名屬性。

      建議:

      • 不要在properties元素體內新增任何屬性值,只將屬性值定義在properties檔案中。
      • 在properties檔案中定義屬性名要有一定的特殊性,如XXXXX.XXXXX.XXXX
        這裡寫圖片描述
        這裡寫圖片描述
  • settings(全域性配置引數)
    • mybatis框架在執行時可以調整一些執行引數。比如:開啟二級快取、開啟延遲載入。。全域性引數將會影響mybatis的執行行為。具體如下:
      這裡寫圖片描述
      這裡寫圖片描述
      這裡寫圖片描述
  • typeAliases(類型別名)(重點)
    • 單個定義
      這裡寫圖片描述
    • 批量定義(常用)
      這裡寫圖片描述
      這樣在其他地方就可以使用,例如:
      這裡寫圖片描述
    • mybatis預設支援的別名
      這裡寫圖片描述
  • typeHandlers(型別處理器)
    • mybatis中通過typeHandlers完成jdbc型別和java型別的轉換。通常情況下,mybatis提供的型別處理器滿足日常需要,不需要自定義.
    • mybatis支援的型別處理器
      這裡寫圖片描述
      這裡寫圖片描述
  • objectFactory(物件工廠)
    • 這個自行檢視下載mybatis時附帶的pdf檔案,用的不多
  • plugins(外掛)
  • environments(環境集合屬性物件)
    • environment(環境子屬性物件)
      • transactionManager(事務管理)
      • dataSource(資料來源)
  • mappers(對映器)
    • 通過resource
      這裡寫圖片描述
    • 通過class
      這裡寫圖片描述
    • 通過package(推薦使用)
      這裡寫圖片描述

6、Mybatis核心

  • Mybatis輸入對映(掌握)

    • 通過parameterType指定輸入引數的型別,型別可以是簡單型別、hashmap、pojo的包裝型別
      • 傳遞pojo的包裝物件
        • 需求:完成使用者資訊的綜合查詢,需要傳入查詢條件很複雜(可能包括使用者資訊、其它資訊,比如商品、訂單的)
        • 針對上邊需求,建議使用自定義的包裝型別的pojo。
          在包裝型別的pojo中將複雜的查詢條件包裝進去。

    目錄結構
    這裡寫圖片描述
    UserCustom.java

package com.nuc.mybatis.po;

public class UserCustom extends User {
    //可擴充套件使用者資訊
}

UserQueryVo.java

package com.nuc.mybatis.po;

public class UserQueryVo {
    //這裡包裝所需的查詢條件

    //使用者查詢條件
    private UserCustom userCustom;

    public UserCustom getUserCustom() {
        return userCustom;
    }

    public void setUserCustom(UserCustom userCustom) {
        this.userCustom = userCustom;
    }

    //可包裝其他的查詢條件,訂單,商品。。。
}

UserMapper.xml中配置新的查詢
這裡寫圖片描述
UserMapperTest.java中新增測試

相關推薦

Mybatis學習筆記完結

說明:本文由大量的原始碼,及截圖,建議讀者,操作一遍。ide:IDEA。文末有筆記及視訊分享 Mybatis 1、對原生態jdbc程式(單獨使用jdbc開發)問題總結 先來看一部分程式碼 Public static void ma

web前端入門學習筆記——html基礎

Html基礎1    常用快捷鍵Ctrl+c複製Ctrl+v貼上Ctrl+x剪下Ctrl+a全選Ctrl+s儲存Ctrl+z撤銷一步Windows+d返回桌面Windows+e我的電腦Windows+r開啟執行Alt+tab切換軟體Ctrl+tab軟體文件之間的切換F2重新命

SpringMVC學習筆記完結

說明:所有程式碼調式的環境:開發環境idea,jdk7,tomcat8.5.27,資料庫MySQL5.1,spring3.2 SpringMVC 1、什麼是SpringMVC? springmvc是spring框架的一個模組,springmv

Java學習筆記--異常處理的總結

背景: 我們的java程式也是會存在某些不正常 的情況的,這些不正常的 情況我們就統稱異常。(還有一種是IO流的異常 要包裝成執行時異常) 異常體系: ———-| Throwable 所以異常或者錯誤類的超類 ————–|Erro

JDBC學習記錄視訊

1、概念JDBC:java Data Base Connectivity ,即java資料庫連結JDBC是一套API,也就是sun公司定義的類或者介面。而驅動是資料庫公司定義的類庫,實現了sun公司規定的介面。2、JDBC開發步驟a、註冊驅動:告知JVM使用的是哪一個資料庫的

Hadoop2.7.3-HA 叢集搭建

前期準備 1 修改Linux主機名 2 修改IP 3 修改主機名和IP的對映關係 /etc/hosts 4 關閉防火牆 5 ssh免登陸 6 安裝JDK,配置環境變數等 叢集規劃 主機名

javascript視訊教程楊中科學習筆記

這套視訊僅僅講述了JS的除錯,引用,array,和for迴圈的知識。非常的基礎,很多其他內容沒有涉及到。拿出一天來學習足以。 以下是這套視訊的下載地址,共十八級: http://www.itcast.cn/news/bd4612c7/a940/4585/9153/487b

c/c++公開課學習筆記--郵箱賬戶的破解與郵箱安全防控

用戶登陸 const mod ase content Coding 一行 學習筆記 ++ 一、SMTP協議 SMTP(SimpleMail Transfer Protocol)即簡單郵件傳輸協議。SMTP協議屬於TCP/IP協議簇,通過SMTP協議

掃地僧C/C++學習筆記氣泡排序

  #include "stdlib.h" #include "string.h" #include "stdio.h" void main() { int i = 0; int a[] = { 22, 56, 4, 57, 8, 10 }; print

-劉意-java深入淺出精華版學習筆記Day01

計算機基礎知識:開啟控制行的方法:win+R,cmd回車Tips:1.切換碟符的時候大小寫無所謂。2.安裝軟體的時候在非系統盤裡建立一個新的目錄,把所有的程式檔案放到這個目錄起來,這樣既不佔系統盤空間,也不會把非系統盤搞得亂七八糟。3.刪除帶內容的資料夾:rd後加/s關鍵字,

劉意_2015年Java基礎視訊-深入淺出精華版 筆記2015年10月25日23:28:50

day01 win 7系統開啟DOS有趣方法:按住shift+右鍵,單擊“在此處開啟命令視窗”(注意:在此處可以是任何的資料夾,不一定是桌面) 用DOS刪除的檔案不可以在回收站恢復?!! 常用DOS命令 d: 回車 碟符切換 dir(direct

webService第二-三天課堂筆記

這幾天心情一直不好,原來的畢業設計進度也因此嚴重的落伍了,但我還是準備一步步的完成!!! webservice這三天可是把我講的有點暈,不過還是在徐老師的幫助下,迴歸正途。。 徐老師傳智播客新來的老師,夠牛!!! 以前我在地下室的時候,徐老師來我旁邊坐,我還以為是同志,好是

-劉意-java深入淺出精華版學習筆記Day07

成員變數和區域性變數的區別:成員變數:類中方法外               堆記憶體中                隨著物件的建立存在                隨著物件的消失而消失                有預設初始化值區域性變數:方法定義中或者方法宣告上  

黑馬 Python學習筆記之第一個 Python 程式

第一個 Python 程式 目標 第一個 HelloPython 程式 Python 2.x 與 3​​.x 版本簡介 執行 Python 程式的三種方式 直譯器 —— python / python3 互動式 —— ipytho

-Java學習筆記day11

Object:類 Object 是類層次結構的根類。每個類都使用 Object 作為超類。  * 每個類都直接或者間接的繼承自Object類。  *   * Object類的方法:  *         public int hashCode():返回該物件的雜湊碼值。  *             注意:

-劉意-java深入淺出精華版學習筆記Day08

工具中使用靜態:在同一個類中,main方法只能訪問靜態方法。【錯誤:無法從靜態上下文中引用非靜態,這樣的錯誤一定是因為在main方法中呼叫了非靜態方法。】對非靜態方法來說,只能通過物件(也就是其他類的物件)來呼叫非靜態方法。靜態方法當然也可以,而且靜態方法可以直接呼叫類名來訪

-劉意-java深入淺出精華版學習筆記Day02

Java基本語法關鍵字:被java賦予特殊含義的單詞要點:關鍵字必須全部小寫;goto和const作為保留字存在,目前並不實用注意:main雖然被JVM識別,但是它並不是關鍵字。String、System也被JVM識別,但是它有大寫字母,所以也不是關鍵字。關鍵字列表:識別符號

-劉意-java深入淺出精華版學習筆記Day09

這幾天的課真是越來越難了。。。。final:我們知道,在繼承中,有方法的重寫這一項。如果我不想讓子類重寫父類的方法,應該怎麼做?針對這種情況,Java提供了關鍵字final。final可以修飾類、方法、變數。在父類中,如果final修飾了一個方法,在子類中試圖對該方法進行重寫

c/c++公開課學習筆記--C語言與木馬惡意程式碼分析和360安全防護揭祕

【課程簡介】 C/C++語言是除了彙編之外,最接近底層的計算機語言,目前windows,linux,iOS,Android等主流作業系統都是用C/C++編寫的,所以很多病毒、木馬也都是用C/C++實現的。課程的目的就是通過C語言揭祕木馬和各種遠端控制軟體的實現原理以及如

鄭州校區】數據庫MYSQL筆記詳解

含義 訪問 面試題 增長 variable 切換 dos命令 技術 運行 第1章 數據庫1.1 數據庫概述l 什麽是數據庫數據庫就是存儲數據的倉庫,其本質是一個文件系統,數據按照特定的格式將數據存儲起來,用戶可以對數據庫中的數據進行增加,修改,刪除及查詢操作。l 什麽是數據