1. 程式人生 > >(一)Mybatis基本配置,Statement方式,動態代理增刪改查

(一)Mybatis基本配置,Statement方式,動態代理增刪改查

首先明白Mybatis是幹什麼的,之前使用jdbc操作資料庫時候要寫很多語句,獲取游標,連線,獲取具體物件進行相應操作,程式碼過於繁瑣,所以現在有了Mybatis,它將這個操作整合在了一起,你不需要關心具體的和資料庫的之間互動,你現在只需要關心你的業務邏輯,書寫好你的sql語句,並進行相應的配置就可以了,這樣大大提高了開發效率,簡化了不必要的程式碼。ps:說實話我覺得jdbc操作真的繁瑣,要注意的太多了,這種方式操作資料庫方便多了,畢竟我們重要的是業務邏輯程式碼。

這篇部落格記錄了基本的配置,statement方式,動態代理方式的增刪改查

Mybatis基本配置

1.首先我們先從官網將壓縮包下載下來,然後將目錄下的  .jar檔案引入專案檔案之中,在Intellij之下,引入jar檔案,具體怎麼引入問度娘,注意這裡暫時只需要引入一個.jar 檔案,lib目錄下的jar檔案相當於是擴充套件功能,你需要的時候再引入。然後用同樣的方式將jdbc引入一下,因為Mybatis是依賴於jdbc的,是jdbc的一種封裝可以理解為。

2.好的接下來我們建立 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">  <!--預設的配置環境,發行版本,debug版本-->
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">   <!--建立連線池,效率高,一次開啟,多次使用-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>   
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT"/>
                <property name="username" value="xxx"/>
                <property name="password" value="xxxx"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- 載入對映檔案,有多個,直接寫相對於src檔案的路徑-->
        <mapper resource="entity/PersonMapping.xml"/>
    </mappers>
</configuration>

看它這個xml檔案,還是比較容易理解的,注意兩點,

1.我這裡使用的是mysql 8.0.2版本,配置和mysql低版本不太一樣,url後面的引數是以  &amp; 來分隔的。雖然也不知道為撒這樣,反正人家這麼規定的。

2.最下面<mappers>載入對映檔案的時候,一個<mapper resource-"xxx"/>載入一個,resource屬性就是具體的對映檔案相對於src檔案的路徑。

接下來我們建立Person類,和資料庫的一張表形成對映:如下

package entity;
public class Person {
   private int id; private String name; private String loves; public Person(){ }
   public Person(String name, String loves) { this.name = name; this.loves = loves; }
  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 getLoves() { return loves; } public void setLoves(String loves) { this.loves = loves; } public String toString(){ return "姓名:"+this.name+"\n愛好:"+this.loves; } }

表person如下:

 create table person(
     `id` int(11) not null auto_increment primary key,
     `name` varchar(30) not null,
     loves varchar(40) not null
     )engine=innodb;

 

然後看對映檔案 PersonMapping.xml的配置,這個對映檔案和Person類時對應的,配置的是關於表person和類Person的相關操作

<?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="entity.PersonMapping">        <!--該mapping檔案的唯一對映-->
    <select id="selectPersonById" resultType="entity.Person" parameterType="string">
        select * from person where `name` = #{name}
    </select>
    <insert id="insertOnePerson" parameterType="entity.Person">
        insert into person values(#{name},#{loves})
    </insert>
    <delete id="deleteOnePerson" parameterType="int" >
        delete from person where id=#{id}
    </delete>
</mapper>

可以看到首先namespace是該檔案一個唯一標識,就是該檔案的路徑(相對於src),接下來有各種標籤,<select>  <delete>  <insert> ..這其實就對應了資料庫的增刪改查,具體對哪一張表,什麼操作,看你書寫的sql語句,因為我們看到標籤體的內容就是sql語句,舉個例子:

    <insert id="insertOnePerson" parameterType="entity.Person" resultType="">
        insert into person values(#{name},#{loves})
    </insert>

這個標籤是向資料庫插入資料,id代表的是該sql語句的唯一標識,parameterType  指的是傳入的引數型別,這裡是entity.Person,Person使我們構造的一個類,resultType是返回值的型別,

標籤體是我們書寫的sql語句,這裡是動態傳值的方式,輸出格式是:#{變數名},對於變數名我們注意:如果傳入的是一個string,int等型別的資料,那這個變數名可以是任何字元,但是如果傳入的是一個物件的話,那麼變數名就必須和該物件的屬性一一對應起來,比如  name  就指 person物件的name屬性,loves指person的loves屬性。另外注意Mybatis傳參只能傳一個值,但是有時候要傳多個引數,可以使用陣列的方式傳值。

同樣的,增刪改查操作都是在相應的標籤下書寫sql語句來完成的。

statement的增刪改查

到這裡我們的基本配置demo就算是完成了,接下來寫一個具體的操作例子,首先分為三步:

1.載入配置資訊,2.獲取SqlSession物件進行操作  3.執行指定的sql語句

    public static void main(String[] args) throws IOException {
        //載入配置資訊
        Reader reader = Resources.getResourceAsReader("config.xml");
        //connection
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession sqlSession = sessionFactory.openSession();
        //執行指定的sql語句
        String statement = "entity.PersonMapping.selectPersonById";  //查詢資料
        List<Person> persons = new ArrayList<Person>(sqlSession.selectList(statement,"溫鴻飛"));
        for (Person person:persons) {
            System.out.println(person.toString());
        }
        statement = "entity.PersonMapping.deleteOnePerson";   //刪除資料
        sqlSession.delete(statement,1);
        System.out.println("------");
        statement = "entity.PersonMapping.selectPersonById";   //查詢資料
        persons = new ArrayList<Person>(sqlSession.selectList(statement,"溫鴻飛"));
        for (Person person:persons) {
            System.out.println(person.toString());
        }
        sqlSession.commit();
        sqlSession.close();
    }

配置資訊載入是通過Reader reader = Resources.getResourceAsReader("config.xml"); 完成,config就是我們剛才建立的配置檔案,告訴編譯器都有哪些mapper,

獲取SqlSession物件,這個不說了,官網就是這麼寫的,規定

然後到了具體的操作了,看到我們先書寫了一個 statement,這個statement對應了剛才的PersonMapping.xml檔案當中的一個標籤,格式是:namespace.id,比如

entity.PersonMapping.deleteOnePerson指的就是deleteOnePerson的標籤,之後用SqlSession來操作,呼叫增刪改查裡面的一個方式,傳入statement和相應的引數就可以了,比如刪除
SqlSession.delete(statement,param); 之後有返回值的接受一下, 沒有就算了。sqlSession.commit()提交一下事務,當然這裡還有回滾等暫時不說了
上面的程式碼執行結果如下,可以看到正確的查詢到了資料並刪除了id為1 的資料
"C:\Program Files\Java\jdk-11.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=63824:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\learn\java\mybatis\out\production\mybatis;C:\迅雷下載\mybatis-3.5.2\mybatis-3.5.2\mybatis-3.5.2.jar;C:\迅雷下載\mysql-connector-java-8.0.16.jar entity.test
姓名:溫鴻飛
愛好:哈啊哈哈
姓名:溫鴻飛
愛好:21212121
姓名:溫鴻飛
愛好:2121266
------
姓名:溫鴻飛
愛好:21212121
姓名:溫鴻飛
愛好:2121266

到這裡我們的第一個statement小demo就算成功完成了,但使用statement的話,每次都要書寫statement,很繁瑣,所以我們有了動態的進行增刪改查的方式,其實就是將statemtn語句進行約定,名字什麼都是有固定規則的,簡化程式碼,省略掉statement,簡單來講,讓約定優於配置,根據約定定位sql語句

具體的話,看下面:

定義一個介面,通過這個介面來替代statement,該介面有如下規則;

1.介面名和對映.xml檔案的檔名相同

2.介面之中的抽象方法的方法名,返回值,引數和對映.xml之中配置的均相同,

3.注意一下如果要返回一個數組的話,使用  List<className> 作為返回型別

定義好了之後通過SqlSession.getMapper(介面名字.class);來獲取到操作資料庫的物件,之後呼叫該介面的方法就可以了,具體程式碼如下:

PersonMapping介面

package mappers;
import entity.Person;

import java.util.List;

//操作person類的介面
public interface PersonMapping {    //介面名也一樣
    public abstract Person selectPersonById(int id);  //方法名,返回值,引數均和配置一樣
    void deletePersonById(int id);
    void insertOnePerson(Person person);
    public abstract List<Person> selectPersonByName(String name);
}

main函式之中:

public class test {
    public static void main(String[] args) throws IOException {
        //載入配置資訊
       。。。獲取到SqlSession物件,和前面一樣//獲取到mapper物件
        PersonMapping personMapping = sqlSession.getMapper(PersonMapping.class);
        //呼叫介面方法操作資料庫
        Person person = personMapping.selectPersonById(2);
        System.out.println(person);
        List<Person> persons = personMapping.selectPersonByName("溫鴻飛");
        for (Person temp:persons) {
            System.out.println(temp);
        }
        sqlSession.commit();
        sqlSession.close();
    }
}

感覺這和symfony裡面的Respository一樣呀,不過你這個還要自己配置,Symfonyh都自己配置好了,你直接例項化物件就行了,symfony很強呀

&n