1. 程式人生 > >第二章 Mybatis的基礎操作(增刪改查)

第二章 Mybatis的基礎操作(增刪改查)

2.1 查詢資料
2.2.1查詢單條資料

新建實體類:

@Data
public class Student {
    private Long id;
    private String name;
    private Integer age;
}

對映檔案:
Student.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.mybatis.dmomain.Student">
 
    <select id="selectone" resultType="com.mybatis.dmomain.Student">
     SELECT  id,name,age FROM  student WHERE  id=#{id}
    </select>
</mapper>

全域性配置檔案:

<?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"/>
    <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="Student.xml"></mapper>
    </mappers>
</configuration>

查詢方法:
//查詢單條資料

@Test
void selectOne() {
    InputStream inputStream = null;
    try {
        //1.獲取去全域性配置檔案
        inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        //2.載入全域性配置檔案
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //3.建立SqlSession物件,傳遞true表示自動提交事務
        SqlSession session = factory.openSession(true);
        //4.執行查詢方法
        //引數1:對映檔案中namespace標籤名稱+id名稱
        //引數2:需要傳遞的引數
        Student student = session.selectOne("com.mybatis.dmomain.Student.selectone", 1L);
        //5.關閉資源
        session.close();
        System.out.println(student);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2.2.2查詢多條資料

   @Test
    void selectAll() {
        InputStream inputStream = null;
        try {
            //1.獲取去全域性配置檔案
            inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            //2.載入全域性配置檔案
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
            //3.建立SqlSession物件,傳遞true表示自動提交事務
            SqlSession session = factory.openSession(true);
            //4.執行查詢方法
            //引數1:對映檔案中namespace標籤名稱+id名稱
            List<Student> students = session.selectList("com.mybatis.dmomain.Student.selectAll");
            //5.關閉資源
            session.close();
            for (Student s : students) {
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

對映檔案改動內容:

 <select id="selectAll" resultType="com.mybatis.dmomain.Student">
     SELECT  id,name,age FROM  student
 </select>

在這裡插入圖片描述
補充:
1.返回一個map:

@Test
void geMap() {
    SqlSession session = MyBatisUtil.getSession();
    StudentMapper mapper = session.getMapper(StudentMapper.class);
    Map map = mapper.getMap(2L);
    System.out.println(map);
    session.close();
}
  <select id="getMap" resultType="map">
        SELECT  * FROM student WHERE id=#{id}
    </select>

map 的key就是列名,value就是值。
2.將某個欄位作為key,整個物件作為value:

@Test
void getMap() {
    SqlSession session = MyBatisUtil.getSession();
    StudentMapper mapper = session.getMapper(StudentMapper.class);
    Map map = mapper.getMap();
    System.out.println(map);
    session.close();
}
//返回的id作為key,Student就是一個物件
@MapKey("id")
Map<Integer , Student> getMap();

此處用了一個註解。
在這裡插入圖片描述

2.2 更新資料

  @Test
    void update() {
        InputStream inputStream = null;
        try {
            //1.獲取去全域性配置檔案
            inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            //2.載入全域性配置檔案
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
            //3.建立SqlSession物件,傳遞true表示自動提交事務
            SqlSession session = factory.openSession(true);
            //4.執行查詢方法
            //引數1:對映檔案中namespace標籤名稱+id名稱
            //引數2:需要傳遞的引數
            Student student = new Student();
            student.setId(1L);
            student.setName("陸小鳳");
            student.setAge(22);
            session.update("com.mybatis.dmomain.Student.update", student);
            //5.關閉資源
            session.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

對映檔案:

 <update id="update">
      UPDATE  student SET  name=#{name},age=#{age} WHERE id=#{id}
    </update>

在這裡插入圖片描述
2.3刪除資料

 @Test
    void delete() {
        InputStream inputStream = null;
        try {
            //1.獲取去全域性配置檔案
            inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            //2.載入全域性配置檔案
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
            //3.建立SqlSession物件,傳遞true表示自動提交事務
            SqlSession session = factory.openSession(true);
            //4.執行查詢方法
            //引數1:對映檔案中namespace標籤名稱+id名稱
            //引數2:需要傳遞的引數
            session.delete("com.mybatis.dmomain.Student.delete", 1L);
            //5.關閉資源
            session.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

xml對映檔案:

 <update id="delete">
       DELETE  FROM  student WHERE id=#{id}
    </update>

2.4增加資料
2.4.1:增加一條資料

@Test
void insert() {
    InputStream inputStream = null;
    try {
        //1.獲取去全域性配置檔案
        inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        //2.載入全域性配置檔案
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //3.建立SqlSession物件,傳遞true表示自動提交事務
        SqlSession session = factory.openSession(true);
        //4.執行查詢方法
        //引數1:對映檔案中namespace標籤名稱+id名稱
        //引數2:需要傳遞的引數
        Student student = new Student();
        student.setName("西門吹雪");
        student.setAge(18);
        session.insert("com.mybatis.dmomain.Student.insert", student);
        //5.關閉資源
        session.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
XML對映檔案:
<insert id="insert">
       INSERT INTO  student (name,age) VALUES  (#{name},#{age})
    </insert>

在這裡插入圖片描述
2.4.2儲存資料返回主鍵值
在實際的開發中,會有這樣的需求,再儲存一條資料之後,需要返回儲存該條資料的主鍵,用於下面操作。舉個例子:
你去一個網站註冊資訊,一般有個快速註冊按鈕,註冊完畢之後會讓你繼續完善個人資訊,此時就需要前一個頁面註冊時候生成的主鍵,此處作為條件更新資料(新註冊相當於插入資料,完善資訊相當於更新資料)。

useGeneratedKeys:表示設定為自動生成主鍵
keyProperty:表示生成的主鍵對映到你的哪一個欄位屬性上
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
   INSERT INTO  student (name,age) VALUES  (#{name},#{age})
</insert>

在這裡插入圖片描述
在這裡插入圖片描述
本章小結
在本小節中,主要演示使用Mybatis進行基礎的增刪改查操作,其實沒有什麼難度,就是一一些基礎的SQL語句的書寫。
再者就是呼叫Mybatis中幾個方法。此處再來分析下:
查詢資料呼叫的是:
查詢單個數據:
selectOne(String url ,Objec object),返回一個查詢的實體物件,引數1是namespace+id名稱,引數2就是你傳遞的條件。
查詢多個數據:
selectList(String url),返回一個List集合,引數1就是namespace+id,
然後在對映檔案中進行編寫SQL語句即可

<select  id=" "  >
  SQL  語句
  </selerct>

其實也並不一定需要這麼寫,最後絕對執行的結果是裡面的SQL語句,但是這個就是規範好一點,這麼用就可以了。
更新資料:
update(String url,Object object),引數1依然是namespace+id,引數2則傳遞一個需要被更新的物件即可。
刪除資料:
delete(String url,Object object),引數1依然是namespace+id,引數2則傳遞一個需要被刪除的物件id即可。
增加一條資料:
insert(String url,Object object)引數1依然是namespace+id,引數2則傳遞一個需要增加資料的物件id即可。
最後還講解一個了在增加的時候可以獲取返回自動增長的主鍵:

 <insert id="insert" useGeneratedKeys="true" keyProperty="id">

這個以後也比較常用,就是配置兩個屬性,分別是開啟和對映到物件的哪個屬性上。
關於還有一個#{屬性名}和程式碼重複的問題,再下一個章節將會對這個進行講解。