Mybatis從淺入深(IDEA版通俗易懂)

抱怨是一件最沒意義的事情。如果實在難以忍受周圍的環境,那就暗自努力練好本領,然後跳出那個圈子。你好,我是夢陽辰,快來和我一起學習吧!


文章目錄


引入

1.三層架構

界面層:和用戶打交道的,接收用戶的請求參數,顯示處理結果的。(jsp , htnml , servlet)

業務邏輯層:接收了界面層傳遞的數據,計算邏輯,調用數據庫,獲取數據

數據訪問層:就是訪問數據庫,執行對數據的查詢,修改,刪除等等的。
三層對應的包
界面層:controller包( servlet)

業務邏輯層:service包(xxxservice類)

數據訪問層:dao包(xxxDao類)

三層中類的交互
用戶使用界面層–>業務邏輯層—>數據訪問層(持久層)–>數據庫(mysql)

三層對應的處理框架
界面層—servlet—springmvc(框架)

業務邏輯層—service類–spring(框架)

數據訪問層—dao類–mybatis (框架)

模版:
1、規定了好一些條款,內容-2.加入自己的東西
框架是一個模塊

1.框架中定義好了一些功能。這些功能是可用的

2.可以加入項目中自己的功能,這些功能可以利用框架中寫好的功能。
框架是一個軟件,半成品的軟件,定義好了一些基礎功能,需要加入你的功能就是完整的。基礎功能是可重複使用的,可升級的

框架特點:
1.框架一般不是全能的,不能做所有事情。

2.框架是針對某一個領域有效。特長在某一個方面,比如mybatis做數據庫操作強,但是他不能做其它的。

3.框架是一個軟件。

01.概述

使用JDBC的缺陷

1.代碼比較多,開發效率低

2.需要關注 Connection ,Statement,ResultSet對象創建和銷燬

3.對 ResultSet查詢的結果,需要自己封裝爲List

4.重複的代碼比較多些

5.業務代碼和數據庫的操作混在一起
框架是一個軟件,半成品的軟件,定義好了一些基礎功能,需要加入你的功能就是完整的。基礎功能是可重複使用的,可升級的
框架特點:

1.框架一般不是全能的,不能做所有事情

2.框架是針對某一個領域有效。特長在某一個方面,比如mybatis做數據庫操作強,但是他不能做其它的。

3.框架是一個軟件

什麼是 MyBatis?
MyBatis是一款優秀的持久層框架

它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作

mybatis框架
一個框架,早期叫做ibatis,代碼在github.

mybatis是MyBatis sQL Mapper Framework for Java (sql映射框架)

1)sql mapper :sql映射
可以把數據庫表中的一行數據映射爲一個java對象。
一行數據可以看做是一個java對象。操作這個對象,就相當於操作表中的數據

2)Data Access 0bjects (DAOs) 數據訪問,對數據庫執行增刪改查。

mybatis提供了哪些功能:
1.提供了創建connection能力tate不用你執行sqile"t人的約力

2.提供了執行sql語句的能力,不用你執行sql

3.提供了循環sql,把sql的結果轉爲java對象,list集合的能力

4 .提供了關閉資源的能力,不用你關閉conneqtion,statement,Resultset

開發人員做的是:提供sql語句

MyBatis 可以通過簡單的 XML 或註解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。

MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名爲MyBatis 。

2013年11月遷移到Github。

總結:
mybatis是一個sql映射框架,提供的數據庫的操作能力。增強的JDBC.
使用mybatis讓開發人員集中精神寫sql就可以了,不必關心connection ,statement,ResultSet的創建,銷燬,sql的執行.

如何獲取Mybatis?
maven倉庫
https://mvnrepository.com/artifact/org.mybatis/mybatis/3.5.6

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version></dependency>

Github:https://github.com/mybatis/mybatis-3
在這裏插入圖片描述

中文文檔:https://mybatis.org/mybatis-3/zh/index.html

持久化

數據持久化
持久化就是將程序的數據在持久狀態和瞬時狀態轉化的過程。

內存:斷電即失。
數據庫(jdbc),io文件持久化。

生活:冷藏。

爲什麼需要持久化?
有一些對象,不能讓他丟失。
內存很貴。

持久層

Dao層,Serice層,Controller層…
完成持久化工作的代碼塊。

層界限十分明顯。

爲什麼需要Mybatis?

幫助程序員將數據存入到數據庫中。

方便

傳統的JDBC代碼太複雜了,簡化。框架。自動化。

不用Mybatis也可以,更容易上手。技術沒有高低之分。

特點:

簡單易學:本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar文件+配置幾個sql映射文件易於學習,易於使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現。

靈活:mybatis不會對應用程序或者數據庫的現有設計強加任何影響。 sql寫在xml裏,便於統一管理和優化。通過sql語句可以滿足操作數據庫的所有需求。

解除sql與程序代碼的耦合:通過提供DAO層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。

提供映射標籤,支持對象與數據庫的orm字段關係映射

提供對象關係映射標籤,支持對象關係組建維護

提供xml標籤,支持編寫動態sql。

02.Mybatis快速入門

實現步驟:
1.新建表

SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for `student`-- ----------------------------DROP TABLE IF EXISTS `student`;CREATE TABLE `student` (
  `id` int(10) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `tid` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fktid` (`tid`),
  CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of student-- ----------------------------INSERT INTO `student` VALUES ('1', '夢陽辰', '1');INSERT INTO `student` VALUES ('2', '小紅', '1');INSERT INTO `student` VALUES ('3', '小張', '1');INSERT INTO `student` VALUES ('4', '小李', '1');INSERT INTO `student` VALUES ('5', '小王', '1');-- ------------------------------ Table structure for `teacher`-- ----------------------------DROP TABLE IF EXISTS `teacher`;CREATE TABLE `teacher` (
  `id` int(10) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of teacher-- ----------------------------INSERT INTO `teacher` VALUES ('1', '黃老師');-- ------------------------------ Table structure for `user`-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL COMMENT '用戶名',
  `pwd` varchar(30) DEFAULT NULL COMMENT '密碼',
  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES ('1', '夢陽辰', '123456');INSERT INTO `user` VALUES ('2', 'MengYangChen', '1234567');INSERT INTO `user` VALUES ('3', 'meng', '123456');

2.加入maven的mybatis座標, mysql驅動的座標

3.創建實體類,student–保存表中的一行數據的

4.創建持久層的dao接口,定義操作數據庫的方法

5.創建一個mybatis使用的配置文件
叫做sql映射文件:寫sql語句的。一般一個表一個sql映射文件。這個文件是xml文件。

6.創建mybatis的主配置文件:
一個項目就一個主配置文件。
主配置文件提供了數據庫的連接信息和sql映射文件的位置信息

7.創建使用mybatis類,
通過mybatis訪問數據庫
思路:
搭建環境–>導入Mybatis–>編寫代碼–>測試


1.搭建環境:
創建操作的數據庫
數據庫mybtis

IDEA新建maven項目

導入maven依賴

2.新建配置文件mybatis-config.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>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers></configuration>

在這裏插入圖片描述
在這裏插入圖片描述

新建Mybatis工具類

1.使用Mybatis獲取sqlSessionFactory對象
從 XML 中構建 SqlSessionFactory

MyBatis 包含一個名叫 Resources 的工具類,它包含一些實用方法,使得從類路徑或其它位置加載資源文件更加容易。

從 XML 文件中構建 SqlSessionFactory 的實例非常簡單,建議使用類路徑下的資源文件進行配置。

MyBatis 包含一個名叫 Resources 的工具類,它包含一些實用方法,使得從類路徑或其它位置加載資源文件更加容易。

String resource = "mybatis-config.xml";

nputStream inputStream = Resources.getResourceAsStream(resource);

SqlSessionFactory sqlSessionFactory = new 
SqlSessionFactoryBuilder().build(inputStream);

2.從 SqlSessionFactory 中獲取 SqlSession
既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的實例。SqlSession 提供了在數據庫執行 SQL 命令所需的所有方法。你可以通過 SqlSession 實例來直接執行已映射的 SQL 語句。

//sqlSessionFactory  -->sqlSessionpublic class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            //使用Mybatis獲取sqlSessionFactory對象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 從 SqlSessionFactory 中獲取 SqlSession
     * @return SqlSession對象
     */
    public  static SqlSession getSqlSession(){
        /*SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;*/

        return sqlSessionFactory.openSession();
    }}

編寫代碼

1.實體類

//實體類(javaBean)public class User {
    private int id;
    private String name;
    private String pwd;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }}

2.Dao/Mapper接口

public interface UserDao {
    List<User> selectUser();}

3.接口實現類
由原來的UserDaolmp轉變爲一個Mapper配置文件。

以前的方式就是寫一個類實現接口,再重寫接口方法,在方法中獲取數據庫連接,執行sql語句。

在Mybatis中免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。

一個語句既可以通過 XML 定義,也可以通過註解定義。我們先看看 XML 定義語句的方式,事實上 MyBatis 提供的所有特性都可以利用基於 XML 的映射語言來實現,這使得 MyBatis 在過去的數年間得以流行。如果你用過舊版本的 MyBatis,你應該對這個概念比較熟悉。 但相比於之前的版本,新版本改進了許多 XML 的配置,後面我們會提到這些改進。這裏給出一個基於 XML 映射語句的示例,它應該可以滿足上個示例中 SqlSession 的調用。

<?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"><!--綁定一個對應的Dao/Mapper接口--><!--以前是寫一個類實現Dao接口,現在綁定即可--><mapper namespace="com.mengyangchen.dao.UserDao">

    <!--查詢語句-->
    <!--id相對於以前的書寫,表示重寫的方法名(以前在方法中執行連接數據庫等操作,現在不需要了,只需要執行sql-->
    <!--resultType返回結果-->
    <select id="selectUser" resultType="com.mengyangchen.pojo.User">
    select * from mybatis.user    </select></mapper>

在這裏插入圖片描述
在這裏插入圖片描述

爲了這個簡單的例子,我們似乎寫了不少配置,但其實並不多。在一個 XML 映射文件中,可以定義無數個映射語句,這樣一來,XML 頭部和文檔類型聲明部分就顯得微不足道了。文檔的其它部分很直白,容易理解。

測試

核心文件mybatis-config.xml需要註冊mappers

 <!--每一個Mapper.XML都需要在Mybatis核心文件中註冊-->
    <mappers>
        <mapper resource="com/MengYangChen/mapper/UserMapper.xml"/>
    </mappers>

測試中可能遇到的問題:
1.配置文件沒有註冊

2.綁定接口錯誤。

3.方法名不對。

4.返回類型不對。

5.Maven導出資源問題。

<!--在build中配置resources,來防止我們資源導出失敗的問題--><build>
 <resources>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources></build>

寫到這裏終於把搞了我好久的問題解決了,錯誤:Error:(3.28)java:程序報org.apache.ibatis.io不存在…。

網上很多解決方案是使用idea自帶的maven,說是idea2020.1版本的問題。

我的解決方案:
解決方法:試過mvn idea:moudle命令的方法,但還是沒有用。最後沒辦法
只能將在github網址下的mybatis3.5.6的jar包導入到新建的文件夾lib中。
在這裏插入圖片描述
但還是報錯:
在這裏插入圖片描述
解決辦法,將mybatis-config.xml文件的配置信息true該爲false
在這裏插入圖片描述
完美得到結果:
在這裏插入圖片描述








03.Mybatis實現增刪改查

爲了規範將接口名UserDao統一改爲UserMapper。

注意增刪改需要提交事務
代碼:

/**
 * 接口操作user表
 */
public interface UserMapper {
    //查詢student表的所有數據
    List<User> selectUser();

    //根據id查詢用戶
    User selectUserById(int id);

    //insert一個用戶
    int insertUser(User user);

    //更新一個用戶
    int updateUser(User user);

    //刪除一個用戶
    int deleteUser(int id);
}
<?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.mengyangchen.dao.UserMapper">
    <select id="selectUser" resultType="com.mengyangchen.pojo.User">
    select * from mybatis.user
  </select>

    <!--根據id查詢用戶-->
    <select id="selectUserById" parameterType="int" resultType="com.mengyangchen.pojo.User">
        select * from mybatis.user where id=#{id}
    </select>

    <!--插入數據-->
    <insert id="insertUser" parameterType="com.mengyangchen.pojo.User">
        insert into mybatis.user (id,name,pwd) values(#{id},#{name},#{pwd});
    </insert>

    <!--更新數據-->
    <update id="updateUser" parameterType="com.mengyangchen.pojo.User">
        update mybatis.user set name =#{name},pwd=#{pwd}  where id=#{id} ;
    </update>

    <!--刪除一個用戶-->
    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id=#{id}
    </delete>
</mapper>

測試代碼:

public class UserMapperTest {
    @Test
    public void test(){
        //1.獲取SqlSession對象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //方式一:getMapper
        //2.執行sql,獲取sql,面向接口編程,獲取UserMapper接口(以前是實現接口的實現類,現在是配置文件)
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.selectUser();


        /*String sqlId = "com.mengyangchen.dao.UserDao"+"."+"selectUser";
        List<User> userList = sqlSession.selectList(sqlId);*/
        for(User user:userList){
            System.out.println(user);
        }

        //3.關閉SqlSession
        sqlSession.close();
    }


    @Test
    public void selectUserById(){
        //獲取執行sql的對象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口
        User user = mapper.selectUserById(1);
        System.out.println(user);
        sqlSession.close();
    }

    @Test
    public void insertUser(){
        //獲取執行sql的對象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口
        int num = mapper.insertUser(new User(3,"MengYangChen","123456"));
        //提交事務
        if(num>0){
            System.out.println("插入成功!");
        }
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void updateUser(){
        //獲取執行sql的對象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口
        int num = mapper.updateUser(new User(3,"陳末","123456"));
        //提交事務
        if(num>0){
            System.out.println("更新成功!");
        }
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void deleteUser(){
        //獲取執行sql的對象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口
        int num = mapper.deleteUser(3);
        //提交事務
        if(num>0){
            System.out.println("刪除成功!");
        }
        sqlSession.commit();
        sqlSession.close();
    }
}

使用Map

假設實體類,屬性過多,我們可以考慮用Map.當然用實體類屬性的set和get方法也是一樣的。map可以放多個對象中的屬性。

使用map,後面的值可以不和實體類屬性相同,只需要和map的鍵相同即可。
例如:

int updateUser2(Map<String,Object>map);
<update id="updateUser2" parameterType="map">update mybatis.user set pwd =#{passWord} where id =#{userId}</update>
public void updateUser2(){
        //獲取執行sql的對象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口
        Map<String,Object>map = new HashMap<String,Object>();
        map.put("userId",2);
        map.put("passWord","1234567");
        int num = mapper.updateUser2(map);
        //提交事務
        if(num>0){
            System.out.println("更新成功!");
        }
        sqlSession.commit();
        sqlSession.close();
    }

Map傳遞參數,直接在sql中取出key即可。
對象傳遞參數,直接在sql中去對象的屬性即可。

模糊查詢

在sql拼接中使用通配符可以防止sql注入。

  //模糊查詢
    List<User> selectUserLike(String value);
 <!--模糊查詢-->
    <select id="selectUserLike" resultType="com.mengyangchen.pojo.User">
        select * from mybatis.user where name like "%"#{value}"%";
    </select>
/**
     * 模糊查詢*/
    @Test
    public void selectUserLike(){
        //獲取執行sql的對象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口
        List<User> list  = new LinkedList<>();
        list = mapper.selectUserLike("夢");
        for (User list1:list) {
            System.out.println(list1);
        }
        sqlSession.close();
    }

也可以:

 <!--模糊查詢-->
    <select id="selectUserLike" resultType="com.mengyangchen.pojo.User">
        select * from mybatis.user where name like #{value};
    </select>
/**
     * 模糊查詢*/
    @Test
    public void selectUserLike(){
        //獲取執行sql的對象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口
        List<User> list  = new LinkedList<>();
        list = mapper.selectUserLike("%夢%");
        for (User list1:list) {
            System.out.println(list1);
        }
        sqlSession.close();
    }

第二種方式可能存在sql注入。

04.XML配置解析

MyBatis 的配置文件包含了會深深影響 MyBatis 行爲的設置和屬性信息。
配置文檔的頂層結構如下:

configuration(配置)
properties(屬性)
settings(設置)
typeAliases(類型別名)
typeHandlers(類型處理器)
objectFactory(對象工廠)
plugins(插件)
environments(環境配置)
environment(環境變量)
transactionManager(事務管理器)
dataSource(數據源)
databaseIdProvider(數據庫廠商標識)
mappers(映射器)











properties(屬性)

編寫一個配置文件

db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?userSSL=false&useUnicode=true&characterEncoding=UTF-8username=root
password=123456
核心配置文件中引入:
位置需在第一位
<?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><!--引入外部配置文件-->
    <properties resource="db.properties">
        <property name="username" value="root"/><!--一配置文件中爲準-->
        <property name="password" value="123456"/>
    </properties>


    <environments default="development">
        <environment id="development">
            <!--事務管理-->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/><!--&amp是xml的轉義字符(即爲&)-->
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>

    </environments>

    <!--每一個Mapper.XML都需要在Mybatis核心文件中註冊-->
    <mappers>
        <mapper resource="com/mengyangchen/dao/UserMapper.xml"/>
    </mappers></configuration>

可以直接引入外部文件,並且可以在其中增加一些屬性配置,如果兩個文件中都對有同一屬性的配置,優先使用外部配置文件中的配置。

設置(settings)

是 MyBatis 中極爲重要的調整設置,它們會改變 MyBatis 的運行時行爲。 下表描述了設置中各項設置的含義、默認值等。
https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases

類型別名(typeAliases)

類型別名可爲 Java 類型設置一個縮寫名字。 它僅用於 XML 配置,意在降低冗餘的全限定類名書寫。例如:

<typeAliases>
  <typeAlias alias="Author" type="domain.blog.Author"/>
  <typeAlias alias="Blog" type="domain.blog.Blog"/>
  <typeAlias alias="Comment" type="domain.blog.Comment"/>
  <typeAlias alias="Post" type="domain.blog.Post"/>
  <typeAlias alias="Section" type="domain.blog.Section"/>
  <typeAlias alias="Tag" type="domain.blog.Tag"/></typeAliases>

當這樣配置時,Blog 可以用在任何使用 domain.blog.Blog 的地方。
也可以指定一個包名,MyBatis 會在包名下面搜索需要的 Java Bean,比如:

<typeAliases>
  <package name="domain.blog"/></typeAliases>

每一個在包 domain.blog 中的 Java Bean,在沒有註解的情況下,會使用 Bean 的首字母小寫的非限定類名來作爲它的別名。 比如 domain.blog.Author 的別名爲 author;若有註解,則別名爲其註解值。見下面的例子:

@Alias("author")public class Author {
    ...}

映射器(mappers)

我們需要告訴 MyBatis 到哪裏去找到這些語句。 在自動查找資源方面,Java 並沒有提供一個很好的解決方案,所以最好的辦法是直接告訴 MyBatis 到哪裏去找映射文件。 你可以使用相對於類路徑的資源引用,或完全限定資源定位符(包括 file:/// 形式的 URL),或類名和包名等。例如:

<!-- 使用相對於類路徑的資源引用 --><mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/></mappers>
需要接口和它的Mapper配置文件同名,並在同一包下。<!-- 使用映射器接口實現類的完全限定類名 --><mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/></mappers>
需要接口和它的Mapper配置文件同名,並在同一包下。<!-- 將包內的映射器接口實現全部註冊爲映射器 --><mappers>
  <package name="org.mybatis.builder"/></mappers>

05.生命週期和作用域

理解我們之前討論過的不同作用域和生命週期類別是至關重要的,因爲錯誤的使用會導致非常嚴重的併發問題。
在這裏插入圖片描述

SqlSessionFactoryBuilder
這個類可以被實例化、使用和丟棄,一旦創建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 實例的最佳作用域是方法作用域(也就是局部方法變量)。 你可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例,但最好還是不要一直保留着它,以保證所有的 XML 解析資源可以被釋放給更重要的事情。

SqlSessionFactory
可以想象爲數據庫連接池

SqlSessionFactory 一旦被創建就應該在應用的運行期間一直存在,沒有任何理由丟棄它或重新創建另一個實例。 使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重複創建多次,多次重建 SqlSessionFactory 被視爲一種代碼“壞習慣”。因此 SqlSessionFactory 的最佳作用域是應用作用域。 有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。

SqlSession
每個線程都應該有它自己的 SqlSession 實例。SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。 絕對不能將 SqlSession 實例的引用放在一個類的靜態域,甚至一個類的實例變量也不行。 也絕不能將 SqlSession 實例的引用放在任何類型的託管作用域中,比如 Servlet 框架中的 HttpSession。 如果你現在正在使用一種 Web 框架,考慮將 SqlSession 放在一個和 HTTP 請求相似的作用域中。 換句話說,每次收到 HTTP 請求,就可以打開一個 SqlSession,返回一個響應後,就關閉它。 這個關閉操作很重要,爲了確保每次都能執行關閉操作,你應該把這個關閉操作放到 finally 塊中。 下面的示例就是一個確保 SqlSession 關閉的標準模式:

try (SqlSession session = sqlSessionFactory.openSession()) {
  // 你的應用邏輯代碼}

在這裏插入圖片描述

06.解決屬性名和字段名不一致的問題

解決方法:
起別名,將sql語句的字段名取一個別名跟屬性名相同。

方法二:

resultMap結果集映射
<!--結果集映射--><!--column數據庫中的字段,property實體類中的屬性--><resultMap id="userMap" type="User">
	<result column="pwd" property="password"/></resultMap><select id="selectUserById" resultMap="userMap">
	select * from mybatis.user where id=#{id}</select>

ResultMap 的設計思想是,對簡單的語句做到零配置,對於複雜一點的語句,只需要描述語句之間的關係就行了。

07.日誌

日誌工廠
如果一個數據庫操作,出現了異常,我們需要排錯。日誌就是最好的助手。
曾經:sout,debug
現在:日誌工廠
在這裏插入圖片描述
SLF4J |
LOG4J | (掌握)
LOG4J2 |
JDK_LOGGING | COMMONS_LOGGING |
STDOUT_LOGGING |(掌握)
NO_LOGGING
在Mybatis中具體使用哪一種日誌實現,在設置中設定。
STDOUT_LOGGING標準日誌輸出,默認無配置.











 <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

加了日誌工廠後:
在這裏插入圖片描述

LOG4J

什麼是Log4j?

Log4j是Apache的一個開源項目,通過使用Log4j,我們可以控制日誌信息輸送的目的地是控制檯、文件、GUI組件,甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;

我們也可以控制每一條日誌的輸出格式;

通過定義每一條日誌信息的級別,我們能夠更加細緻地控制日誌的生成過程。

最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。【百度百科】

快速入門
1.先導入log4j的包。

<!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version></dependency>

2.新建log4j.properties文件

#將等級爲DEBUG的日誌信息輸出到console和file這兩個目的地,console和file的定義在下面的代碼
log4j.rootLogger=DEBUG,console,file

#控制檯輸出的相關設置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

#文件輸出的相關設置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n

#日誌輸出級別
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

配置logrj爲日誌的實現

<settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>

在這裏插入圖片描述

簡單使用:
1.在需要使用log4j的類中,導入org.apachee.log4j.Logger包。

2.創建日誌對象:參數爲當前類的class
static Logger logger = Logger.getLogger(UserDaoTest.class);

在這裏插入圖片描述
3.日誌級別
info
debug
error



08.分頁

limit分頁

1語法: SELECT  from user limit startIndex,pagesize;2.SELECT * from user limit 3;#[o,n]

使用Mybatis實現分頁,核心爲sql

<!--/分頁--><select id="getuserByLimit" parameterType="map" resu7tMap="userMap">select  from mybatis.user limit #{startindex} ,#{pagesize}</select>

RowBounds實現分頁(瞭解即可,不推薦使用)

MyBatis分頁插件PageHelper

https://pagehelper.github.io/

這是MyBatis的初步瞭解與使用,你也許還需要了解註解開發,緩存等。
這些內容將在下一篇文章中介紹。
我是MyBatis的第一篇。


在這裏插入圖片描述


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章