1. [MyBatis 筆記] 入門階段

MyBatis入門

  • List item

什麼是MyBatis

  • 持久層框架。
  • 避免JDBC代碼 :無設置動態參數 和 處理結果集的getXXX方法。
  • 配置:使用xml和註解 配置原生類型,接口 和 Java的POJO爲數據庫中的記錄。sql代碼寫在xml文件當中,完成分離。

獲取MyBatis

第一個MyBatis程序

搭建環境:

  1. 創建數據庫。
  2. 新建項目 :
    2.1 : 創建一個空的maven項目, 無需使用骨架。
    2.2 : 刪除src目錄。
  3. 導入依賴 : mybatis + mysql 驅動 + Junit。
    <!-- 依賴 -->
    <dependencies>

        <!-- mysql驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <!-- myBatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>

        <!-- Junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

創建模塊:

     特意說明,這裏使用模塊兒而不是整個項目是爲了方便學習。每個模塊兒的pom.xml都在父級項目當中進行了聲明,這樣不用頻繁進行jar包的導入

編寫配置文件

    在src/main/resouces目錄下面創建一個xml文件,建議使用`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"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&amp;userUnicode=ture&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

編寫MyBatis工具類

    目的是爲了將MyBatis配置文件加載,其他內容進行一次封裝。

public class MyBatisUtil {

    // 加載配置文件獲取工廠
    private static SqlSessionFactory sqlSessionFactory = null;
    static {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}

編寫實體類User:

    這裏的user屬性 和 數據庫mybits.user中的字段是一樣(先保持名字一致)。

public class User {
    private int id;
    private String name;
    private String pwd;
	// 省略構造 + getter/setter
}

編寫 Mapper接口 和 xml

  • Mapper接口
package dao;

import pojo.User;
import java.util.List;

public interface UserMapper {
    List<User> getAllUser();
}
  • Mapper.xml
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--
    namespace : 指定到綁定到Mapper接口。
-->
<mapper namespace="dao.UserDao">
    <!--
        id : 對應Mapper接口的方法名字.
        resultType : 返回的Pojo類型
     -->
    <select id="getAllUser" resultType="pojo.User">
        select * from mybatis.user;
    </select>
</mapper>

註冊mapper

<mappers>
    <mapper resource="dao/UserMapper.xml"></mapper>
</mappers>

測試

public class UserDaoTest {

    @Test
    public void test() {

        //1. 獲得SQLSession對象
        SqlSession session = MyBatisUtil.getSqlSession();

        //2.
        UserMapper mapper = session.getMapper(UserMapper.class);
        List<User> userList = mapper.getAllUser();
        System.out.println(userList);
    }
}

核心API注意事項:

SqlSessionFactoryBuilder

         一旦創建了SqlSessionFactory就不再需要了,因此其最佳使用位置是局部方法位置。不應該讓其一直存在,以保證所有的XML解析資源可以被釋放給重要的事情。

SqlSessionFactory

        被創建就應該一直存在,沒有必要拋棄它後重新創建。其最佳作用域是應用的作用區域。很多方法可以做到,比如單例模式,靜態單例模式,或者用靜態代碼塊兒進行初始化。

SqlSession

        SqlSession是線程不安全,放在局部作用區域使用,確保其在單線程中。應該讓每次收到一個請求,打開一個SqlSession,返回響應,然後關閉。

CRUD

select

<!-- 
	id : 對應的接口當中的方法名。
	resultType : SQL 語句執行的返回值。
	parameterType : 參數的類型。
-->

<! --
	需求:根據指定的id查詢用戶。
    UserMapper中存在抽象方法 : User getUserById(int id);
    -->
<select id="getUserById"   resultType="pojo..User"  paramterType="int" >
	select * from user where id = #{id}
</select>

isnert

<!-- 
 
    需求: 插入一個User
    在UserMapper中存在抽象方法:insertUser(User user);
	insert 沒有resultType
    參數對象的屬性可以直接在sql中使用,不用get方法
 -->
<isnert id="insertUser"    paramterType="pojo.User">
	insert into user (id, name, pwd) values (NULL,  #{name}, #{pwd});
</isnert>
    
  • 測試代碼
	@Test
    public void insertUser() {
        User user = new User(-1, "張三", "xxxxxx");
        SqlSession session = MyBatisUtil.getSqlSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        mapper.insertUser(user);

        // 提交事務
        session.commit();
        session.close();
	}

update

<!--
	UserMapper中存在抽象方法:int updateUser(User user);
-->
<update id="updateUser" paramterType="pojo.User">
	update user set name= #{name} where id=#{id};
</update>
  • 測試代碼
 @Test
public void updateUser() {
    SqlSession session = MyBatisUtil.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = new User(3, "王五", null);
    mapper.updateUser(user);

    // 提交事務
    session.commit();
    session.close();
}

delete

<!--
	UserMapper當中存在方法:int deleteUser(User user);
-->
<delete id="deleteUserById" paramterType="int">
	delete from user where id=#{id}
</delete>
  • 測試代碼
@Test
public void updateUser() {
    SqlSession session = MyBatisUtil.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = new User(3, "王五", null);
    mapper.updateUser(user);

    // 提交事務
    session.commit();
    session.close();
}

Map作爲參數

    使用POJO作爲參數的情況下不是很方便,可以使用Map類型作爲參數,這樣只用填寫關鍵字段就可以了。

  • UserMapper.java
int insertUserByMap(Map<String, Object> mp);
  • UserMapper.xml
<!-- 使用Map作爲參數插入 -->
<insert id="insertUserByMap" parameterType="map">
	insert into user (id, name, pwd) values (NULL, #{userName}, #{passWord})
</insert>
  • 測試
@Test
public void insertUserByMap() {
    SqlSession session = MyBatisUtil.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);

    Map<String, Object> data = new HashMap<String, Object>();
    data.put("userName", "李白");
    data.put("passWord", "123456");

    mapper.insertUserByMap(data);

    // 提交事務
    session.commit();
    session.close();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章