【31】
1. <typeAliases>標簽
mybatis返回值有單引號?1.1 功能
用于給 java 類型定義別名, 方便在配置文件中使用.
1.2 使用方式
a) 給 User 類型定義別名為 u
<!-- typeAliases給類型起別名 -->
<typeAliases>
<!-- 給User類起別名為u -->
<typeAlias type="com.bjsxt.pojo.User" alias="u" />
</typeAliases>
java resultset?b)<typeAlias>中, 可以省略 alias 屬性, 表示類別名為類名, 大小寫不敏感
<typeAliases>
<!-- 給User類起別名, 別名為user -->
<typeAlias type="com.bjsxt.pojo.User" />
</typeAliases>
c)可以通過<package>給整個包下的所有類定義別名為類名
<typeAliases>
<!-- 給包下的所有類定義別名為類名 -->
<package name="com.bjsxt.pojo" />
</typeAliases>
1.3 MyBatis 的內建別名
jdbc resultset用法。1. 帶參數的查詢
如果執行的是條件查詢, 需要在調用方法時傳參數進來, 此時, 可以在 select 標簽中通過 parameterType 屬性指定參數的類型. 而在 SQL 語句中, 可以通過#{}的方式獲取參數.
1.1 一個參數的查詢
例如, 根據 id 查詢用戶信息. 當只有一個參數時, #{}中可以任意填寫.
<!-- parameterType, 參數類型, 用于參數的傳遞 -->
<select id="selById" resultType="user" parameterType="int">
<!--
#{}用于獲取參數
index, 索引, 從0開始
param+數字, param1, param2
-->
select * from t_user where id=#{param1}
</select>
mybatis foreach、測試代碼:
@Test
public void selById() {
SqlSession session = null;
try {
session = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-cfg.xml"))
.openSession();
User user =
session.selectOne("com.bjsxt.mapper.UserMapper.selById", 2);
System.out.println(user);
} catch (IOException e) {
e.printStackTrace();
} finally {
session.close();
}
}
1.2 多個參數的查詢
多個參數傳遞時, 由于 sqlSession 中提供的查詢方法只允許傳入一個參數, 因此可以對多個參數進行封裝. 可以使用對象或 Map 集合.
1.2.1 封裝為對象
<select id="sel" resultType="user" parameterType="user">
<!-- 如果參數是對象, 可以通過#{屬性名}來獲取 -->
select * from t_user where username=#{username} and
password=#{password}
</select>
datatable select、測試代碼:
@Test
public void sel() {
SqlSession session = null;
try {
session = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-cfg.xml"))
.openSession();
User u = new User();
u.setUsername("zhangsan");
u.setPassword("123");
User user =
session.selectOne("com.bjsxt.mapper.UserMapper.sel", u);
System.out.println(user);
} catch (IOException e) {
e.printStackTrace();
} finally {
session.close();
}
}
1.2.2 封裝為 Map
<select id="sel" resultType="user" parameterType="map">
<!-- 如果參數是map, 可以通過#{key}來獲取 -->
select * from t_user where username=#{uname} and password=#{upwd}
</select>
測試代碼:
@Test
public void sel() {
SqlSession session = null;
try {
session = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-cfg.xml"))
.openSession();
Map<String, String> map = new HashMap<>();
map.put("uname", "lisi");
map.put("upwd", "123");
User user =
session.selectOne("com.bjsxt.mapper.UserMapper.sel", map);
System.out.println(user);
} catch (IOException e) {
e.printStackTrace();
} finally {
session.close();
}
}
1. 事務(Transaction)
Mybatis框架。2. 簡單提取工具類
package com.bjsxt.util;
public class MyBatisUtil {
private static SqlSessionFactory factory = null;
static {
try {
InputStream is =
Resources.getResourceAsStream("mybatis-cfg.xml");
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
SqlSession session = null;
if (factory != null) {
// true表示開啟自動提交
// session = factory.openSession(true);
session = factory.openSession();
}
return session;
}
}
3. 新增(insert)
mapper 文件中, 通過<insert>定義新增語句. 注意, 由于DML 操作的返回值都是 int 類型, 所以, 不需要定義resultType 屬性.
<!-- 新增 -->
<insert id="insUser" parameterType="user">
insert into t_user values (default, #{username}, #{password})
</insert>
測試代碼:
@Test
public void testIns() {
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setUsername("小明");
user.setPassword("123");
int num = session.insert("com.bjsxt.mapper.UserMapper.insUser",
user);
if(num > 0) {
// 提交事務
session.commit();
System.out.println("SUCCESS!");
} else {
// 回滾事務
session.rollback();
System.out.println("FAILED!");
}
// 關閉資源
session.close();
}
Mybatis。1. 修改(update)和刪除(delete)
1.1 修改
<!-- 修改 -->
<update id="updUser" parameterType="user">
update t_user set username=#{username}, password=#{password} where
id=#{id}
</update>
測試代碼:
@Test
public void testUpd() {
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setId(9);
user.setUsername("大名");
user.setPassword("abc");
int num = session.update("com.bjsxt.mapper.UserMapper.updUser",
user);
if (num > 0) {
System.out.println("SUCCESS");
session.commit();
} else {
System.out.println("FAILED");
session.rollback();
}
session.close();
}
1.2 刪除
<!-- 刪除 -->
<delete id="delUser" parameterType="int">
delete from t_user where id=#{0}
</delete>
測試代碼:
@Test
public void testDel() {
SqlSession session = MyBatisUtil.getSession();
int num = session.delete("com.bjsxt.mapper.UserMapper
.delUser",9);
if (num > 0) {
System.out.println("SUCCESS");
session.commit();
} else {
System.out.println("FAILED");
session.rollback();
}
session.close();
}
1. 接口綁定方案
MyBatis 中, 提供了一套接口綁定方案. 程序員可以提供一個 接 口 , 然 后 提 供 對 應 接 口 的 一 個 mapper.xml 文 件 .MyBatis 會自動將接口和 xml 文件進行綁定. 實際上就是MyBatis 會根據接口和對應的 xml 文件創建接口的實現類.換言之, 就是可以得到接口類型的對象, 方便方法的調用.
1.1 實現方式
1.1.1 定義接口
package com.bjsxt.mapper;
import java.util.List;
import com.bjsxt.pojo.User;
public interface UserMapper {
List<User> selAll();
}
1.1.2 編寫對應接口的映射文件
注意:
<mapper namespace="com.bjsxt.mapper.UserMapper">
<select id="selAll" resultType="User">
select * from t_user
</select>
</mapper>
1.1.3 在核心配置文件中掃描接口
a) 掃描單個接口, 可以使用 mapper 標簽的 class 屬性
<mappers>
<mapper class="com.bjsxt.mapper.UserMapper" />
</mappers>
b) 當掃描多個接口時,為簡化配置,可以使用 package 標簽,表示掃描對應包下的所有接口.
<mappers>
<package name="com.bjsxt.mapper" />
</mappers>
1.1.4 應用
在使用時, 可以通過 SqlSession 對象的 getMapper 方法,得到接口的代理對象, 從而可以調用定義好的方法.
@Test
public void testBind() {
SqlSession session = MyBatisUtil.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> list = mapper.selAll();
for (User user : list) {
System.out.println(user);
}
session.close();
}
1. 通過接口綁定解決多參數的傳遞
1.1 方式一
a) 接口中定義方法
User selByUP(String username, String password);
b) 映射文件中提供對應的標簽. 此時, SQL語句中獲取方式有兩種, 通過#{index}或#{param+數字}的方式.
<select id="selByUP" resultType="user">
select * from t_user where username=#{0} and password=#{1}
</select>
1.2 方式二
a) 接口中定義方法, 參數中使用@Param 注解設定參數名用于在 SQL 語句中使用.
User selByUP(@Param("username") String username, @Param("password")
String password);
b) 映射文件中提供對應的標簽. 此時, SQL語句中獲取方式有兩種, 通過#{參數名稱}或#{param+數字}的方式.
<select id="selByUP" resultType="user">
select * from t_user where username=#{username} and
password=#{password}
</select>
1. 動態 SQL
根據條件的不同, SQL 語句也會隨之動態的改變. MyBatis 中,提供了一組標簽用于實現動態 SQL.
1.1 <if>
用于進行條件判斷, test 屬性用于指定判斷條件. 為了拼接條件, 在 SQL 語句后強行添加 1=1 的恒成立條件.
<select id="sel" resultType="user">
select * from t_user where 1=1
<if test="username != null and username != ''">
and username=#{username}
</if>
<if test="password != null and password != ''">
and password=#{password}
</if>
</select>
1.2 <where>
用于管理 where 子句. 有如下功能:
a)如果沒有條件, 不會生成 where 關鍵字
b)如果有條件, 會自動添加 where 關鍵字
c)如果第一個條件中有 and, 則去除
<select id="sel" resultType="user">
select * from t_user
<where>
<if test="username != null and username != ''">
and username=#{username}
</if>
<if test="password != null and password != ''">
and password=#{password}
</if>
</where>
</select>
1. 動態 SQL
1.1 <choose><when><otherwise>這是一套標簽, 功能類似于 switch...case...
<select id="sel" resultType="user">
select * from t_user
<where>
<choose>
<when test="username != null and username != ''">
and username = #{username}
</when>
<when test="password != null and password != ''">
and password = #{password}
</when>
<otherwise>
and 1=1
</otherwise>
</choose>
</where>
</select>
1.2 <set>
用于維護 update 語句中的 set 子句. 功能如下:
int updUser(User user);
<update id="updUser" parameterType="user">
update t_user
<set>
id=#{id}, <!-- 防止所有條件不成立時的語法錯誤 -->
<if test="username != null and username != ''">
username=#{username},
</if>
<if test="password != null and password != ''">
password=#{password},
</if>
</set>
where id=#{id}
</update>
1. 動態 SQL
1.1 <trim>
用于在前后添加或刪除一些內容
<update id="updUser" parameterType="user">
update t_user
<!--
prefix: 前綴, 表示向前面添加內容
prefixOverrides: 從前面刪除內容
suffix: 后綴, 表示向后面添加內容
suffixOverrides: 從后面刪除內容
-->
<trim prefix="set" prefixOverrides="user" suffix="hahaha"
suffixOverrides=",">
username=#{username},
</trim>
where id=#{id}
</update>
1.2 <bind>
用于對數據進行再加工, 用于模糊查詢
<select id="sel" resultType="user">
select * from t_user
<where>
<if test="username!=null and username!=''">
<bind name="username" value="'%' + username + '%'"/>
and username like #{username}
</if>
</where>
</select>
1. 動態 SQL
1.1 <foreach>
用于在 SQL 語句中遍歷集合參數, 在 in 查詢中使用
<select id="selIn" parameterType="list" resultType="user">
select * from t_user where id in
<foreach collection="list" open="(" separator="," close=")"
item="item">
#{item}
</foreach>
</select>
List<User> selIn(@Param("list") List<Integer> list);
1.2 <sql><include>
<sql>用于提取 SQL 語句, <include>用于引用 SQL 語句
<sql id="mySql">
id, username, password
</sql>
<select id="selIn" parameterType="list" resultType="user">
select
<include refid="mySql"/>
from t_user where id in
<foreach collection="list" open="(" separator="," close=")"
item="item">
#{item}
</foreach>
</select>
1. MyBatis 的緩存機制
1.1 一級緩存
a)默認開啟. 線程級別的緩存, SqlSession 的緩存
b)在一個 SqlSession 生命周期中有效. SqlSession 關閉,緩存清空.
1.2 二級緩存
a)進程級別的緩存, SqlSessionFactory 的緩存
b)在一個 SqlSessionFactory 生命周期中有效.可以在多個SqlSession 生命中期中共享.
c)默認關閉, 需要使用的時候, 要為某個命名空間開啟二級緩存(在 mapper.xml 中配置<cache>).
<!-- 開啟二級緩存, 要求實體類進行序列化 或者添加readonly(true)-->
<cache />
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态