天天看點

MyBatis學習筆記Mybatis學習筆記(maven、Idea版)

Mybatis學習筆記(maven、Idea版)

環境搭建注意事項

①建立UserDao 接口 和 UserDao.xml 時的名字一樣是為了和之前的知識保持一緻,是以在SSM整合以後都用UserMapper接口和UserMapper.xml

②在idea建立目錄時,他和包是不一樣的。目錄需要一級一級的建立。映射檔案放在resource目錄下

③mybatis的映射配置檔案位置必須和接口的包結構一樣

④映射檔案的mapper标簽的namespace屬性的取值必須是接口的全限定類名

⑤映射配置檔案的操作配置id的屬性必須和接口的方法名一緻。

映射檔案放在mapper包目錄下沒有放到resource下,IDEA需要在pom.xm中使用一下配置才能加載mapper映射檔案

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

案例一

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>
        <package name="com.cgx.pojo" />
    </typeAliases>


    <!-- 和spring整合後 environments配置将廢除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事務管理 -->
            <transactionManager type="JDBC" />
            <!-- 資料庫連接配接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                          value="jdbc:mysql://localhost:3306/test2?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    
    <!--配置mapper映射檔案的位置和spring整合後配置将交給spring -->
    <mappers>
        <mapper resource="com\cgx\dao\UserMapper.xml"></mapper>
    </mappers>
</configuration>



           

UserMapper.java

package com.cgx.dao;

import com.cgx.pojo.User;

import java.util.List;

public interface UserMapper {

    List<User> findAll();
    User findById(int id);
}

           

UserMapper.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">
<!-- namespace:命名空間,用于隔離sql -->
<mapper namespace="com.cgx.dao.UserMapper">
     
    <!--resultType用于指定傳回結果集映射 -->
     <select id="findAll" resultType="com.cgx.pojo.User">
         select * from user
     </select>
    
    <!--parameterType用于指定傳入參數的類型 -->
    <select id="findById" parameterType="int" resultType="user">
        select * from user where  id=#{id}
    </select>

</mapper>

           

測試

import com.cgx.pojo.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.Before;
import org.junit.Test;

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

/**
 * @ClassName Test01
 * @Author CGX
 * @Date 2020/8/6 20:35
 * @Version 1.0
 **/
public class Test01 {

    private SqlSessionFactory sqlSessionFactory = null;

    @Before
    public void init() throws Exception {
        // 1. 建立SqlSessionFactoryBuilder對象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 加載SqlMapConfig.xml配置檔案
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

        // 3. 建立SqlSessionFactory對象
        this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }

    @Test
    public void test01() {
        // 4. 建立SqlSession對象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 5. 執行SqlSession對象執行查詢,擷取結果List<User>
        // 第一個參數是User.xml的statement的id,【第二個參數是執行sql需要的參數】;
        List<User> users = sqlSession.selectList("findAll");
        User user = sqlSession.selectOne("findById", 1);
        //6.列印
        System.out.println(users);
        System.out.println(user);
        // 7. 釋放資源
        sqlSession.close();
    }
}

           

配置mapper映射器的三種方式

①< mapper resource=" " />(初學使用)

使用相對路徑的資源

如:

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

②< mapper class=" " />(了解)

使用mapper接口類路徑

如:

< mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
           
注意:此種方法要求mapper接口和mapper的映射檔案名稱相同,且放在同一目錄下

③< package name=""/>(實際開發用)

注冊指定包下的所有接口

如:

注意:此種方法要求mapper接口和mapper的映射檔案名稱相同,且放在同一目錄下

動态SQL

if标簽

where标簽

SQL片段

foreach标簽

<where>
		<!-- foreach标簽,進行周遊 -->
		<!-- collection:周遊的集合,這裡是QueryVo的ids屬性 -->
		<!-- item:周遊的項目,可以随便寫,,但是和後面的#{}裡面要一緻 -->
		<!-- open:在前面添加的sql片段 -->
		<!-- close:在結尾處添加的sql片段 -->
		<!-- separator:指定周遊的元素之間使用的分隔符 -->
		<foreach collection="ids" item="item" open="id IN (" close=")" separator=",">
			#{item}
		</foreach>
	</where>
           

一對一查詢

<!-- association :配置一對一屬性 -->
	<!-- property:order裡面的User屬性名 -->
	<!-- javaType:屬性類型 -->
	<association property="user" javaType="user">
        <id property="id" column="user_id" />
        <result property="username" column="username" />
    </association>
           

一對多查詢

<!-- 
     collection  配置一對多的關系
     javaType:  目前類中屬性的類型
     ofType:每個orders的屬性
-->
<collection property="orders" javaType="list" ofType="order">
<!-- 配置主鍵,是關聯Order的唯一辨別 -->
		<id property="id" column="oid" />
		<result property="number" column="number" />
</collection>
           
當關聯查詢的兩個表有相同的屬性時 那個使用别名 那麼他的column也應該使用别名

Mybatis緩存

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-JkQpTGu6-1596872789428)(D:\雜物\Typora筆記文檔\image\Mybatis緩存.png)]

vaType=“list” ofType=“order”>

<id property="id" column="oid" />
	<result property="number" column="number" />
           

```

當關聯查詢的兩個表有相同的屬性時 那個使用别名 那麼他的column也應該使用别名

Mybatis緩存

[外鍊圖檔轉存中…(img-JkQpTGu6-1596872789428)]

繼續閱讀