1、<select>元素
<select> 元素用于映射 SQL 的 select 陳述句,其示例代碼如下:
<!-- 根據id查詢用戶 -->
<select id="findById" parameterType="Integer" resultType="com.day1.entity.User">
select * from t_user where id = #{id}
</select>
上述示例代碼中,id 的值是唯一識別符號,它接收一個 Integer 型別的引數,回傳User 型別的物件,結果集自動映射到 User 屬性,
<select> 元素除了有上述示例代碼中的幾個屬性以外,還有一些常用的屬性,如下表:
| 屬性名稱 | 描 述 |
|---|---|
| id | 它和 Mapper 的命名空間組合起來使用,是唯一識別符號,供 MyBatis 呼叫 |
| parameterType | 表示傳入 SQL 陳述句的引數型別的全限定名或別名,它是一個可選屬性,MyBatis 能推斷出具體傳入陳述句的引數 |
| resultType | SQL 陳述句執行后回傳的型別(全限定名或者別名),如果是集合型別,回傳的是集合元素的型別,回傳時可以使用 resultType 或 resultMap 之一 |
| resultMap | 它是映射集的參考,與 <resultMap> 元素一起使用,回傳時可以使用 resultType 或 resultMap 之一 |
| flushCache | 用于設定在呼叫 SQL 陳述句后是否要求 MyBatis 清空之前查詢的本地快取和二級快取,默認值為 false,如果設定為 true,則任何時候只要 SQL 陳述句被呼叫都將清空本地快取和二級快取 |
| useCache | 啟動二級快取的開關,默認值為 true,表示將査詢結果存入二級快取中 |
| timeout | 用于設定超時引數,單位是秒(s),超時將拋出例外 |
| fetchSize | 獲取記錄的總條數設定 |
| statementType | 告訴 MyBatis 使用哪個 JDBC 的 Statement 作業,取值為 STATEMENT(Statement)、 PREPARED(PreparedStatement)、CALLABLE(CallableStatement) |
| resultSetType | 這是針對 JDBC 的 ResultSet 介面而言,其值可設定為 FORWARD_ONLY(只允許向前訪問)、SCROLL_SENSITIVE(雙向滾動,但不及時更新)、SCROLLJNSENSITIVE(雙向滾動,及時更新) |
然而在實際開發中,有可能需要傳遞多個引數,那么如何實作呢?我們可以通過兩種方式來完成:使用Map介面和使用JavaBean,
方式一:使用Map介面傳遞多個引數,
(1)創建資料庫表,并插入資料
CREATE TABLE `t_student` (
`username` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(20) DEFAULT NULL
);
insert into t_student values("tom", 23 ,"陜西");
insert into t_student values("王剛", 43,"安徽");
insert into t_student values("張偉", 43 ,"北京");
insert into t_student values("劉倩", 19,"北京");
insert into t_student values("陸風", 21,"上海");
insert into t_student values("齊菲", 56,"河北");
insert into t_student values("王可", 56,"河南");
(2)創建Student類
public class Student {
private String username;
private Integer age;
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"username='" + username + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
(3)創建IStudentDao
public interface IStudentDao {
List<Student> findStudent(Map<String, Object> map);
}
(4)創建studentMapper.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:指定了唯一的命名空間-->
<mapper namespace="com.day1.dao.IStudentDao">
<!-- 查找年齡大于30且名字開頭為張的學生 -->
<select id="findStudent" resultType="com.day1.entity.Student">
select * from t_student where age > #{age} and username like #{nstart};
</select>
</mapper>
(5)在SqlMapperConfig.xml中指定映射的組態檔
<mapper resource="com/day1/studentMapper.xml"></mapper>
(6)測驗,
@Test
public void testFindStudent() throws IOException {
//1、讀取組態檔
InputStream in = Resources.getResourceAsStream("SqlMapperConfig.xml");
//2、創建SqlSessionFactory工廠
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3、使用工廠生產SqlSession物件
SqlSession sqlSession = factory.openSession();
//4、使用SqlSession創建dao介面的代理物件
IStudentDao studentDao = sqlSession.getMapper(IStudentDao.class);
//5、使用代理物件執行方案
Map<String, Object> map = new HashMap<>();
map.put("age", 30);
map.put("nstart","張%");
List<Student> students = studentDao.findStudent(map);
for(Student stu : students){
System.out.println(stu);
}
//6、釋放資源
sqlSession.close();
in.close();
}
方式二:使用JavaBean傳遞多個引數
(1)IStudentDao添加方法findStudentNewWay();
List<Student> findStudentNewWay(Student student);
(2)在studentMapper.xml中添加查詢陳述句,
<select id="findStudentNewWay" resultType="com.day1.entity.Student" parameterType="com.day1.entity.Student">
select * from t_student where age > #{age} and username like #{username};
</select>
(3)進行測驗,
@Test
public void testFindStudent2() throws IOException {
//1、讀取組態檔
InputStream in = Resources.getResourceAsStream("SqlMapperConfig.xml");
//2、創建SqlSessionFactory工廠
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3、使用工廠生產SqlSession物件
SqlSession sqlSession = factory.openSession();
//4、使用SqlSession創建dao介面的代理物件
IStudentDao studentDao = sqlSession.getMapper(IStudentDao.class);
//5、使用代理物件執行方案
Student student = new Student();
student.setAge(30);
student.setUsername("張%");
List<Student> students = studentDao.findStudentNewWay(student);
for(Student stu : students){
System.out.println(stu);
}
//6、釋放資源
sqlSession.close();
in.close();
}
建議:如果引數較少,建議選擇 Map;如果引數較多,建議選擇 Java Bean,
2、<insert>元素
<insert> 元素用于映射插入陳述句,MyBatis 執行完一條插入陳述句后將回傳一個整數表示其影響的行數,它的屬性與 <select> 元素的屬性大部分相同,有以下幾個特有屬性:
- keyProperty:該屬性的作用是將插入或更新操作時的回傳值賦給 PO 類的某個屬性,通常會設定為主鍵對應的屬性,如果是聯合主鍵,可以將多個值用逗號隔開,
- keyColumn:該屬性用于設定第幾列是主鍵,當主鍵列不是表中的第 1 列時需要設定,如果是聯合主鍵,可以將多個值用逗號隔開,
- useGeneratedKeys:該屬性將使 MyBatis 使用 JDBC 的 getGeneratedKeys()方法獲取由資料庫內部產生的主鍵,例如 MySQL、SQL Server 等自動遞增的欄位,其默認值為 false,
如果在實際開發中需要用主鍵關聯其他業務,有兩種方式可以完成,第一種方式是通過資料庫表的自增主鍵完成;第二種方式可以使用 MyBatis 的 <selectKey> 元素來自定義生成主鍵,具體配置示例代碼如下:
<!-- 添加用戶 -->
<insert id="addUser" parameterType="com.day1.entity.User">
<!--
keyProperty:將查詢到主鍵值設定到 parameterType 指定的物件的那個屬性
keyColumn:資料庫中的列名
order:SELECT LAST_INSERT_ID() 執行順序,相對于 insert 陳述句來說它的執行順序
resultType:指定 SELECTLAST_INSERT_ID() 的結果型別
-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into t_user(username, password) values(#{username}, #{password});
</insert>
在執行上述示例代碼時,<selectKey> 元素首先被執行,該元素通過自定義的陳述句設定資料表的主鍵,然后執行插入陳述句,
<selectKey> 元素的 keyProperty 屬性指定了新生主鍵值回傳給 PO 類的哪個屬性,
- order 屬性可以設定為 BEFORE 或 AFTER,
- BEFORE 表示先執行 <selectKey> 元素然后執行插入陳述句,
- AFTER 表示先執行插入陳述句再執行 <selectKey> 元素,
3、<update>與<delete>元素
<update> 和 <delete> 元素比較簡單,它們的屬性和 <insert> 元素、<select> 元素的屬性差不多,執行后也回傳一個整數,表示影響了資料庫的記錄行數,配置示例代碼如下:
<!-- 洗掉用戶 -->
<delete id="deleteById" parameterType="int">
delete from t_user where id = #{id}
</delete>
<!-- 更新用戶資訊 -->
<update id="updateUser" parameterType="com.day1.entity.User">
update t_user set username =#{username}, password= #{password} where id = #{id}
</update>
4、sql元素
sql元素標簽用來定義可重復使用的SQL代碼片段,使用時只需要用include元素標簽參考即可,最終達到SQL陳述句重用的目的;同時它可以被靜態地(在加載引數) 引數化,不同的屬性值通過包含的實體變化,使用如下:
<!-- 建立sql片段-->
<sql id="query_student">
<if test="username != null and username !=''">
and username like '%${username}%'
</if>
</sql>
<!-- 使用include參考sql片段-->
<select id="findStudentList" parameterType="com.day1.entity.Student" resultType="com.day1.entity.Student">
select * from t_student
<where>
<include refid="query_student"/>
</where>
</select>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/260310.html
標籤:其他
上一篇:MySQL事務
下一篇:SPARQL應用實體
