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接口和mapper的映射檔案名稱相同,且放在同一目錄下< mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
③< 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)]