1. 程式人生 > 其它 >MyBatis從零開始(一)

MyBatis從零開始(一)

技術標籤:框架mybatisjavamysqlmaven資料庫

1、環境

  • JDK 1.8

  • Mysql 5.7

  • Maven 3.6.1

  • IDEA


2、回顧

  • JDBC

  • Mysql

  • JAVA 基礎

  • Maven

  • Junit


3、框架

最好看官網

MyBatis3


4、簡介

在這裡插入圖片描述

4.1、什麼是MyBatis

  • MyBatis 是一款優秀的持久層框架
  • 它支援定製化 SQL、儲存過程以及高階對映
  • MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集
  • MyBatis 可以使用簡單的 XML 或註解來配置和對映原生型別、介面和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 物件)為資料庫中的記錄

4.2、獲取MyBatis

  • Maven倉庫:mvnrepository.com
  • Github:搜尋MyBatis和中文版

4.3、什麼是持久化

資料持久化

  • 持久化就是將程式的資料在持久狀態和瞬時狀態轉化的過程
  • 記憶體:斷電即失
  • 資料庫(JDBC),io檔案持久化

為什麼需要持久化?

  • 有一些物件,不能丟,要持久化
  • 記憶體價格高

4.4、持久層

Dao層、Service層、Controller層…

  • 完成持久化工作的程式碼塊
  • 層界限十分明顯

4.5、為什麼需要MyBatis

  • 幫助程式設計師將資料存進資料庫中
  • 方便
  • 傳統的JDBC程式碼太複雜。簡化、框架、自動化
  • 更容易上手

5、第一個MyBatis


思路:搭建環境–>匯入MyBatis–>編寫程式碼–>測試

5.1、搭建環境

搭建資料庫

在這裡插入圖片描述

建立專案

1、新建普通Maven

2、刪除src

3、匯入Maven依賴

 <!--資料庫連線-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.17</version>
    </dependency>
    <!--日誌-->
    <dependency
>
<groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!--MyBatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency>

加上原有的JUnit


5.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"></transactionManager>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/name?useSSL=false&amp;serverTimezone=UTC&amp;characterEncoding=UTF-8&amp;useUnicode=true"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
    </configuration>
    
  • 編寫MyBatis工具類

package com.hls.util;

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.IOException;
import java.io.InputStream;

/**
 * @author Shu
 * @date 2019-11-19
 * */

//sqlSessionFactory --->sqlSession
public class MybatisUtil {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        //獲取sqlsessionfactory物件
        try {
            String resource = "MyBatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }




    public static SqlSession getSqlSession(){
        /*省略了SqlSession物件的建立*/
        /*SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
        
        SqlSession 完全包含了面向資料庫執行 SQL 命令所需要的方法
        
        */
        return sqlSessionFactory.openSession();

    }

}


5.3、編寫程式碼

  • 實體類

    package com.hls.pojo;
    
    public class User {
    
        //實體類
        private Integer id;
        private String name;
        private String ago;
        private String add;
        private String birthday;
    
        public User(){
        }
    
        public User(Integer id, String name, String ago, String add, String birthday) {
            this.id = id;
            this.name = name;
            this.ago = ago;
            this.add = add;
            this.birthday = birthday;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAgo() {
            return ago;
        }
    
        public void setAgo(String ago) {
            this.ago = ago;
        }
    
        public String getAdd() {
            return add;
        }
    
        public void setAdd(String add) {
            this.add = add;
        }
    
        public String getBirthday() {
            return birthday;
        }
    
        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }
    
    
    }
    
    
  • Dao介面

    package com.hls.dao;
    
    import com.hls.pojo.User;
    
    import java.util.List;
    
    public interface UserDao {
    
        List<User> getUserList();
    
    }
    
    
  • 介面實現類

    <?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介面-->
    <mapper namespace="com.hls.dao.UserDao">
        <select id="getUserList" resultType="com.hls.pojo.User">
            select * from name.info
        </select>
    </mapper>
    

5.4、測試

注意點:

org.apache.ibatis.binding.BindingException: Type interface com.hls.dao.UserDao is not known to the MapperRegistry.

每一個Mapper.xml檔案都需要在MyBatis核心配置檔案中註冊**


  • maven 由於他的約定大於配置,在寫配置檔案的時候,可能無法被匯出

  • pom檔案 pom.xml

    <build>
        <resources>
          <resource>	
            <directory>src/main/resource</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
          </resource>
          <resource>
            <directory>src/main/java</directory>
            <includes>
              <include>**/*.properties</include>
              <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
          </resource>
        </resources>
    </build>
    

    資源過濾

    預設放在resource下,但是不一定全部的配置檔案都在resource下,所以配置在java中也掃描過濾,找到配置檔案。


  • junit測試

    package com.hls.test;
    
    import com.hls.dao.UserDao;
    import com.hls.pojo.User;
    import com.hls.util.MybatisUtil;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import java.util.List;
    
    public class UserTest {
    
        @Test
        public void test(){
            //第一步,獲得SqlSession物件
            SqlSession sqlSession = MybatisUtil.getSqlSession();
            //執行SQl   方式一:getMapper
            UserDao mapper = sqlSession.getMapper(UserDao.class);
            List<User> userList = mapper.getUserList();
            for (User user :
                    userList) {
                System.out.println(user);
            }
    
            //關閉SqlSession物件
            sqlSession.close();
        }
    }
    
    
  • 可能遇到的問題

    • 配置檔案沒有註冊
    • 繫結介面錯誤
    • 方法名不對
    • 返回型別不對
    • maven資源匯出問題