mybatis返回值有單引號,mybatis select 返回值long null_Mybatis框架(二)

 2023-10-08 阅读 29 评论 0

摘要:【31】1. <typeAliases>標簽mybatis返回值有單引號?1.1 功能用于給 java 類型定義別名, 方便在配置文件中使用.1.2 使用方式a) 給 User 類型定義別名為 u<!-- typeAliases給類型起別名 --> <typeAliases> <!-- 給User類起別名為u --> <typeAlias

d49c6ac99d321a1c483027d6c9020e4e.png

【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 的內建別名

805012ebd8a85615bf746d69560b18cb.png

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)

  1. 事務是數據庫操作的最小單元, 有 ACID 的特性. 應該保證一個事務的的 SQL 語句要么同時成功, 要么都不成功.
  2. MyBatis 中配置了事務管理器, type 屬性設置為 JDBC.表示 MyBatis 采用和原生 JDBC 相同的事務管理機制.
  3. 在 MyBatis 執行的開始時,將自動提交功能關閉了.所以,在執行 DML 操作時, 需要手動提交事務.

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 編寫對應接口的映射文件

注意:

  1. xml 文件名要和接口名一致
  2. namespace 屬性必須為接口的全限定路徑
  3. id 屬性必須和接口對應的方法名一致
<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 子句. 功能如下:

  1. 滿足條件時, 會自動添加 set 關鍵字
  2. 會去除 set 子句中多余的逗號
  3. 不滿足條件時, 不會生成 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>

用于在前后添加或刪除一些內容

  1. prefix, 在前面添加內容
  2. prefixOverrides, 從前面去除內容
  3. suffix, 向后面添加內容
  4. suffixOverrides, 從后面去除內容
<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 查詢中使用

  1. collection: 待遍歷的集合
  2. open: 設置開始符號
  3. item: 迭代變量
  4. separator: 項目分隔符
  5. close: 設置結束符號
<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. 緩存用于提高查詢的效率.
  2. MyBatis的緩存是使用SQL標簽的ID作為緩存的唯一標識的. 執行相同的標簽可以使用緩存. 不同的標簽不能使用緩存.
  3. MyBatis 中有兩種緩存機制.

1.1 一級緩存

a)默認開啟. 線程級別的緩存, SqlSession 的緩存

b)在一個 SqlSession 生命周期中有效. SqlSession 關閉,緩存清空.

1.2 二級緩存

a)進程級別的緩存, SqlSessionFactory 的緩存

b)在一個 SqlSessionFactory 生命周期中有效.可以在多個SqlSession 生命中期中共享.

c)默認關閉, 需要使用的時候, 要為某個命名空間開啟二級緩存(在 mapper.xml 中配置<cache>).

<!-- 開啟二級緩存, 要求實體類進行序列化 或者添加readonly(true)-->
<cache />

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/129241.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息