Mybatis學習(一)基礎操作CRUD

前言:

什麼是框架?使用框架有什麼好處?
框架就是我們軟件開發中的一種解決方案,不同的框架對應解決不同的問題。框架封裝了很多細節,使開發者可以使用極簡的方式去實現功能,大大的提升了開發效率。

現在學習的Mybatis是三層架構(表現層,業務層,持久層)中持久層相關的。
對於持久層來說,有以下幾種解決方案:

  1. JDBC技術:Connection,Statement,ResultSet
  2. Spring的JDBCTemplate:Spring中對JDBC的簡單封裝
  3. Apache的DBUtils:和上述的很像,也是對JDBC的簡單封裝

以上都不是框架,JDBC是規範,而後兩個是工具類。

Mybatis框架:

一、概述

是一個優秀的基於java的持久層框架,它內部封裝了JDBC,使開發者只需要關注sql語句本身,而無需處理加載驅動、創建連接、創建Statement等繁瑣的過程。它使用了ORM思想,實現了結果集的封裝。可以使用xml和註解方式來配置各種Statement。

ORM:Object Relational Mapping 對象關係映射,就是把數據庫表和實體類及實體類的屬性對應起來,讓我們可以通過操作實體類就可以實現操作數據庫表。

二、入門

前面說到,我們可以使用xml和註解的方式來配置Statement,基於開發的角度去想,註解方式十分方便,但是我們是學習者,xml配置我們也是要了解學習的。

如何搭建?

  1. 創建maven工程並在pom.xml中導入座標(配置xml)
  2. 在src/main/java中創建實體類和dao接口
  3. 在resources中穿件MyBatis的主配置文件SqlMapConfig.xml
  4. 如果是基於xml配置,我們需要按照包名在resources下創建IUserDao.xml

我們需要在pom中導入的座標如下:

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>

然後依照包名創建dao接口和實體類:

package com.hty.domain;

import java.io.Serializable;

/**
 * @program: day20
 * @author: Semineces
 * @create: 2020-01-20 14:35
 */
public class User implements Serializable {

    private Integer id;
    private String username;
    private String sex;
    private String telephone;

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", telephone='" + telephone + '\'' +
                '}';
    }

}

package com.hty.dao;

import com.hty.domain.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @program: day20
 * @author: Semineces
 * @create: 2020-01-20 14:55
 */
public interface IUserDao {
    /**
     * 通過id獲取信息
     * @return
     */
    //@Select("select * from myuser where id = #{id}") 這行是基於註解的
    List<User> getUserById(int id);//通過id查人
}

在resources下創建SqlMapConfig.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>
    <typeAliases>
        <typeAlias type="com.hty.domain.User" alias="User"/>
    </typeAliases>
    <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/project?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="passowrd"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
    	<!--基於xml配置實現-->
        <mapper resource="com/hty/dao/User.xml"></mapper>
        <!--基於註解配置實現-->
        <!-- <mapper class="com.hty.dao.IUserDao"></mapper> -->
    </mappers>
</configuration>

然後我們需要在與IUserDao對應的路徑下創建User.xml(如果我們是基於註解配置,就不用創建了)
在這裏插入圖片描述
依照這個目錄來創建,具體內容爲:
其中,id爲接口中的方法名,parameterType爲接受的參數類型,resultType爲返回的結果類型。

<?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 namespace="com.hty.dao.IUserDao">
    <select id="getUserById" parameterType="int" resultType="com.hty.domain.User">
        select * from myuser where id = #{id}
    </select>
</mapper>

至此,初步搭建環境就完成了,現在我們在test/java下創建一個測試類來測一測。

import com.hty.dao.IUserDao;
import com.hty.domain.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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @program: day20
 * @author: Semineces
 * @create: 2020-01-20 14:52
 */
public class TestMybatis {

    private InputStream inputStream;
    private SqlSession sqlSession;
    private IUserDao iUserDao;

    @Before
    public void init() throws IOException {
    	//讀取xml的時候使用了類加載器,它只能讀取類路徑的配置文件
        inputStream = Resources.getResourceAsStream("config/SqlMapConfig.xml");
        //創建工廠:mybatis使用了構建者模式,其中SqlSessionFactoryBuilder是構建者
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //使用工廠生產SqlSession對象,就是使用了工廠模式,好處是解耦(降低了類之間的依賴關係)
        sqlSession = sqlSessionFactory.openSession();
        //創建dao接口實現類使用了代理模式
        iUserDao = sqlSession.getMapper(IUserDao.class);
    }

    @Test
    public void testGetUser() {
    	//使用代理對象執行方法
        List<User> users = iUserDao.getUserById(1);
        for (User user : users) {
            System.out.println(user);
        }
    }

    @After
    public void destroy() throws IOException {
    	//釋放資源
        sqlSession.close();
        inputStream.close();
    }
    
}

得到控制檯輸出我們所查到的內容:
在這裏插入圖片描述
至此,Mybatis的入門搭建,以及簡單的小實例成功了。

三、注意事項

1.Mybatis中映射配置文件位置必須與dao接口的包結構相同
2.基於User.xml配置中mapper標籤裏的namespace屬性的取值必須是dao接口的全限定類名
3.映射配置文件的操作配置(select),id屬性的取值必須使dao接口的方法名
當我們遵從了這三點後,在開發中就無須寫實現類了(因爲已經沒必要了)。

四、進行CRUD

大概步驟跟前面的差不多,基於xml配置就還是要在User.xml中寫sql語句。

	<insert id="insertUser" parameterType="User">
        insert into myuser(username,sex,telephone) values (#{username},#{sex},#{telephone})
    </insert>

    <update id="updateUser" parameterType="User">
        update myuser set username=#{username},sex=#{sex},telephone=#{telephone} where id=#{id}
    </update>

    <select id="getUser" resultType="com.hty.domain.User">
        select * from myuser
    </select>

    <delete id="deleteUser" parameterType="int">
        delete from myuser where id=#{id}
    </delete>

然後我們在接口中添加上述方法:

    void insertUser(User user);

    void updateUser(User user);

    void deleteUser(int id);

    List<User> getUser();

最後在我們的測試類中寫測試方法:

@Test
    public void testInsertUser() {
        User user = new User();
        user.setUsername("semineces");
        user.setSex("男");
        user.setTelephone("1111");
        iUserDao.insertUser(user);
        //除了查詢操作外,都要使用commit來提交事務
        sqlSession.commit();
    }

    @Test
    public void testGetUser() {
        List<User> users = iUserDao.getUser();
        for (User user : users) {
            System.out.println(user);
        }
    }

    @Test
    public void testUpdateUser() {
        User user = iUserDao.getUserById(1);
        user.setSex("女");
        iUserDao.updateUser(user);
        sqlSession.commit();
    }

    @Test
    public void testDeleteUser() {
        iUserDao.deleteUser(2);
        sqlSession.commit();
    }

至此,我們就已經實現完mybatis的入門CRUD操作了,如果是基於註解開發,則用select註解將sql語句寫在IUserDao接口的方法上方。

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