MyBatis--快速入門

韓家小志發表於2020-12-13

1、匯入pojo類

在這裡插入圖片描述

2、匯入依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>hanjiaxiaozhi_parent</artifactId>
        <groupId>cn.hanjiaxiaozhi</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>MyBatis_test</artifactId>
    <!--指定java專案的打包方式-->
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>

    </dependencies>

</project> 

3、新增日誌配置檔案

在這裡插入圖片描述

log4j.rootLogger=DEBUG,A1
log4j.logger.com.taotao = DEBUG
log4j.logger.org.mybatis = DEBUG

log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n

4、新增jdbc.properties

在這裡插入圖片描述

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/day11_db?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
jdbc.username=root
jdbc.password=root

5、編寫mybatis全域性配置檔案(cv)

在這裡插入圖片描述

<?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="jdbc.properties"/>

    <!--執行環境可以配置多個, default指定預設使用哪個-->
    <environments default="development">
        <!--配置環境, id是這個環境的唯一標識-->
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--3 指定所有的mapper檔案-->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

6、編寫對映檔案 XxxMpper.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語句 和 對映關係
    namespace : 當前這個配置檔案的唯一標識, 自定義, 但是不能和其他配置檔案namespace重複
-->
<mapper namespace="userMapper">
    <!--
        定義一條sql語句, 其實就是一個 statement
            select 代表是查詢語句, 與其類似的還有 insert, update, delete等
            id : 這條sql語句的唯一標識,自定義,但是不能和其他sql語句重複
            parameterType:  sql語句需要的引數型別, 需要寫 類的全路徑
            resultType: sql語句返回的結果型別
    -->

    <select id="queryById"  parameterType="java.lang.Long" resultType="cn.hanjiaxiaozhi.pojo.User">
        <!--這裡寫具體的sql語句, #{}是佔位符, 編譯時會被替換成?, 然後注入真實引數-->
        select * from tb_user where id=#{id}
    </select>
</mapper>

7、編寫測試程式碼

在這裡插入圖片描述

package cn.hanjiaxiaozhi.b_mybatis_start;

import cn.hanjiaxiaozhi.pojo.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 java.io.InputStream;

public class HelloMyBatis {
    public static void main(String[] args) throws Exception {
        // 指定全域性檔案的路徑
        String resource = "mybatis-config.xml";
        // 獲取輸入流,關聯全域性配置檔案
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 構建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 獲取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 執行statement, 需要指定兩個引數:
        // 1 確定哪個sql語句: mapper檔案的namespace + sql語句的id
        // 2 sql語句需要的引數
        User user = sqlSession.selectOne("userMapper.queryById", 1L);
        System.out.println(user);
    }
}

在這裡插入圖片描述

7、測試結果

2019-10-08 20:18:43,805 [main] [userMapper.queryById]-[DEBUG] ==>  Preparing: select * from tb_user where id=? 
2019-10-08 20:18:43,820 [main] [userMapper.queryById]-[DEBUG] ==> Parameters: 1(Long)
2019-10-08 20:18:43,836 [main] [userMapper.queryById]-[DEBUG] <==      Total: 1
User [id=1, userName=null, password=123456, name=張三, age=30, sex=1, birthday=Wed Aug 08 00:00:00 CST 1984, created=Fri Sep 19 16:56:04 CST 2014, updated=Sun Sep 21 11:24:59 CST 2014]

8、入門程式執行流程圖

在這裡插入圖片描述

流程總結:

  • 編寫配置檔案(全域性配置檔案mybatis-config.xml和所有的mapper.xml對映檔案)
    • a) 簡單來說:就是準備JDBC連線引數以及要用到的Sql語句
  • 載入配置,建立SqlSessionFactory
    • a) 這裡獲取連線引數,獲取Sql,對Sql進行預編譯,形成statement
  • 通過SqlSessionFactory建立SqlSession
    • a) 這裡就是呼叫了連線引數,連線資料庫,形成會話
  • 通過SqlSession執行statement,實現CRUD
    • a) 給前面編譯好的statement設定Sql引數,然後執行
  • 通過SqlSession提交事務
  • 通過SqlSession關閉會話

9、問題: userName為null的問題

在這裡插入圖片描述

  • 分析: User物件的屬性userName 和 tb_user表 的欄位 user_name不一致
    在這裡插入圖片描述
  • 解決方案1:這種方案可以解決,但是比較麻煩,不方便後期維護.
    在這裡插入圖片描述
  • 結果
    在這裡插入圖片描述