MyBatis if choose 動(dòng)態(tài) SQL的實(shí)現(xiàn)
動(dòng)態(tài) SQL
動(dòng)態(tài) SQL 是 MyBatis 的強(qiáng)大特性之一。如果你使用過(guò) JDBC 或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接 SQL 語(yǔ)句有多痛苦,例如拼接時(shí)要確保不能忘記添加必要的空格,還要注意去掉列表最后一個(gè)列名的逗號(hào)。利用動(dòng)態(tài) SQL,可以徹底擺脫這種痛苦。
使用動(dòng)態(tài) SQL 并非一件易事,但借助可用于任何 SQL 映射語(yǔ)句中的強(qiáng)大的動(dòng)態(tài) SQL 語(yǔ)言,MyBatis 顯著地提升了這一特性的易用性。
如果你之前用過(guò) JSTL 或任何基于類 XML 語(yǔ)言的文本處理器,你對(duì)動(dòng)態(tài) SQL 元素可能會(huì)感覺(jué)似曾相識(shí)。在 MyBatis 之前的版本中,需要花時(shí)間了解大量的元素。借助功能強(qiáng)大的基于 OGNL 的表達(dá)式,MyBatis 3 替換了之前的大部分元素,大大精簡(jiǎn)了元素種類,現(xiàn)在要學(xué)習(xí)的元素種類比原來(lái)的一半還要少。
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
if
使用動(dòng)態(tài) SQL 最常見(jiàn)情景是根據(jù)條件包含 where 子句的一部分。比如:
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE'
<if test="title != null">
AND title like #{title}
</if>
</select>這條語(yǔ)句提供了可選的查找文本功能。如果不傳入 “title”,那么所有處于 “ACTIVE” 狀態(tài)的 BLOG 都會(huì)返回;如果傳入了 “title” 參數(shù),那么就會(huì)對(duì) “title” 一列進(jìn)行模糊查找并返回對(duì)應(yīng)的 BLOG 結(jié)果(細(xì)心的讀者可能會(huì)發(fā)現(xiàn),“title” 的參數(shù)值需要包含查找掩碼或通配符字符)。
如果希望通過(guò) “title” 和 “author” 兩個(gè)參數(shù)進(jìn)行可選搜索該怎么辦呢?首先,我想先將語(yǔ)句名稱修改成更名副其實(shí)的名稱;接下來(lái),只需要加入另一個(gè)條件即可。
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE'
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select><if test="seat_no != null and seat_no != '' ">
AND seat_no = #{seat_no}
</if> <sql id="search">
<if test="userParams.adminType==null or userParams.adminType==''">
and tu.ADMIN_TYPE_ID in(0,1)
</if>
<if test="userParams.adminType != null and userParams.adminType != ''">
and tu.ADMIN_TYPE_ID=#{userParams.adminType}
</if>
<if test="userParams.roleId != null and userParams.roleId != ''">
and (select group_concat(ur.ROLE_ID)
from t_user u
right join t_user_role ur on ur.USER_ID = u.USER_ID,
t_role r
where r.ROLE_ID = ur.ROLE_ID
and u.USER_ID = tu.USER_ID and r.ROLE_ID=#{userParams.roleId})
</if>
<if test="userParams.mobile != null and userParams.mobile != ''">
AND tu.MOBILE =#{userParams.mobile}
</if>
<if test="userParams.username != null and userParams.username != ''">
AND tu.USERNAME like CONCAT('%',#{userParams.username},'%')
</if>
<if test="userParams.ssex != null and userParams.ssex != ''">
AND tu.SSEX =#{userParams.ssex}
</if>
<if test="userParams.status != null and userParams.status != ''">
AND tu.STATUS =#{userParams.status}
</if>
<if test="userParams.deptId != null and userParams.deptId != ''">
AND td.DEPT_ID =#{userParams.deptId}
</if>
<if test="userParams.createTime != null and userParams.createTime != ''">
AND DATE_FORMAT(tu.CREATE_TIME,'%Y%m%d') BETWEEN substring_index(#{userParams.createTime},'#',1) and substring_index(#{userParams.createTime},'#',-1)
</if>
</sql>
choose、when、otherwise
有時(shí)候,我們不想使用所有的條件,而只是想從多個(gè)條件中選擇一個(gè)使用。針對(duì)這種情況,MyBatis 提供了 choose 元素,它有點(diǎn)像 Java 中的 switch 語(yǔ)句。
還是上面的例子,但是策略變?yōu)椋簜魅肓?“title” 就按 “title” 查找,傳入了 “author” 就按 “author” 查找的情形。若兩者都沒(méi)有傳入,就返回標(biāo)記為 featured 的 BLOG(這可能是管理員認(rèn)為,與其返回大量的無(wú)意義隨機(jī) Blog,還不如返回一些由管理員精選的 Blog)。
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE'
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select><choose> <when test="……"> …… </when> <otherwise> …… </otherwise> </choose>
<select id="findUsersByUser" resultType="cn.soboys.kmall.sys.entity.User">
select tu.USER_ID,tu.USERNAME,tu.SSEX,td.DEPT_NAME,tu.MOBILE,tu.EMAIL,tu.STATUS,tu.CREATE_TIME,
td.DEPT_ID
from t_user tu left join t_dept td on tu.DEPT_ID = td.DEPT_ID
<where>
<choose>
<when test="userParams.adminType==4">
and tu.ADMIN_TYPE_ID in(2,3)
</when>
<otherwise>
<include refid="search"></include>
</otherwise>
</choose>
</where>
</select>
trim、where、set
前面幾個(gè)例子已經(jīng)方便地解決了一個(gè)臭名昭著的動(dòng)態(tài) SQL 問(wèn)題?,F(xiàn)在回到之前的 “if” 示例,這次我們將 “state = ‘ACTIVE’” 設(shè)置成動(dòng)態(tài)條件,看看會(huì)發(fā)生什么。
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>如果沒(méi)有匹配的條件會(huì)怎么樣?最終這條 SQL 會(huì)變成這樣:
SELECT * FROM BLOG WHERE
這會(huì)導(dǎo)致查詢失敗。如果匹配的只是第二個(gè)條件又會(huì)怎樣?這條 SQL 會(huì)是這樣:
SELECT * FROM BLOG WHERE AND title like ‘someTitle'
這個(gè)查詢也會(huì)失敗。這個(gè)問(wèn)題不能簡(jiǎn)單地用條件元素來(lái)解決。這個(gè)問(wèn)題是如此的難以解決,以至于解決過(guò)的人不會(huì)再想碰到這種問(wèn)題。
MyBatis 有一個(gè)簡(jiǎn)單且適合大多數(shù)場(chǎng)景的解決辦法。而在其他場(chǎng)景中,可以對(duì)其進(jìn)行自定義以符合需求。而這,只需要一處簡(jiǎn)單的改動(dòng):
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>where 元素只會(huì)在子元素返回任何內(nèi)容的情況下才插入 “WHERE” 子句。而且,若子句的開(kāi)頭為 “AND” 或 “OR”,where 元素也會(huì)將它們?nèi)コ?/p>
如果 where 元素與你期望的不太一樣,你也可以通過(guò)自定義 trim 元素來(lái)定制 where 元素的功能。比如,和 where 元素等價(jià)的自定義 trim 元素為:
<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>
prefixOverrides 屬性會(huì)忽略通過(guò)管道符分隔的文本序列(注意此例中的空格是必要的)。上述例子會(huì)移除所有 prefixOverrides 屬性中指定的內(nèi)容,并且插入 prefix 屬性中指定的內(nèi)容。
用于動(dòng)態(tài)更新語(yǔ)句的類似解決方案叫做 set。set 元素可以用于動(dòng)態(tài)包含需要更新的列,忽略其它不更新的列。比如:
<update id="updateAuthorIfNecessary">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>這個(gè)例子中,set 元素會(huì)動(dòng)態(tài)地在行首插入 SET 關(guān)鍵字,并會(huì)刪掉額外的逗號(hào)(這些逗號(hào)是在使用條件語(yǔ)句給列賦值時(shí)引入的)。
或者,你可以通過(guò)使用trim元素來(lái)達(dá)到同樣的效果:
<trim prefix="SET" suffixOverrides=","> ... </trim>
注意,我們覆蓋了后綴值設(shè)置,并且自定義了前綴值。
foreach
動(dòng)態(tài) SQL 的另一個(gè)常見(jiàn)使用場(chǎng)景是對(duì)集合進(jìn)行遍歷(尤其是在構(gòu)建 IN 條件語(yǔ)句的時(shí)候)。比如:
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
<where>
<foreach item="item" index="index" collection="list"
open="ID in (" separator="," close=")" nullable="true">
#{item}
</foreach>
</where>
</select>foreach 元素的功能非常強(qiáng)大,它允許你指定一個(gè)集合,聲明可以在元素體內(nèi)使用的集合項(xiàng)(item)和索引(index)變量。它也允許你指定開(kāi)頭與結(jié)尾的字符串以及集合項(xiàng)迭代之間的分隔符。這個(gè)元素也不會(huì)錯(cuò)誤地添加多余的分隔符,看它多智能!
提示 你可以將任何可迭代對(duì)象(如 List、Set 等)、Map 對(duì)象或者數(shù)組對(duì)象作為集合參數(shù)傳遞給 foreach。當(dāng)使用可迭代對(duì)象或者數(shù)組時(shí),index 是當(dāng)前迭代的序號(hào),item 的值是本次迭代獲取到的元素。當(dāng)使用 Map 對(duì)象(或者 Map.Entry 對(duì)象的集合)時(shí),index 是鍵,item 是值。
至此,我們已經(jīng)完成了與 XML 配置及映射文件相關(guān)的討論。下一章將詳細(xì)探討 Java API,以便你能充分利用已經(jīng)創(chuàng)建的映射配置。
script
要在帶注解的映射器接口類中使用動(dòng)態(tài) SQL,可以使用 script 元素。比如:
@Update({"<script>",
"update Author",
" <set>",
" <if test='username != null'>username=#{username},</if>",
" <if test='password != null'>password=#{password},</if>",
" <if test='email != null'>email=#{email},</if>",
" <if test='bio != null'>bio=#{bio}</if>",
" </set>",
"where id=#{id}",
"</script>"})
void updateAuthorValues(Author author);bind
bind 元素允許你在 OGNL 表達(dá)式以外創(chuàng)建一個(gè)變量,并將其綁定到當(dāng)前的上下文。比如:
<select id="selectBlogsLike" resultType="Blog">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</select>多數(shù)據(jù)庫(kù)支持
如果配置了 databaseIdProvider,你就可以在動(dòng)態(tài)代碼中使用名為 “_databaseId” 的變量來(lái)為不同的數(shù)據(jù)庫(kù)構(gòu)建特定的語(yǔ)句。比如下面的例子:
<insert id="insert">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
<if test="_databaseId == 'oracle'">
select seq_users.nextval from dual
</if>
<if test="_databaseId == 'db2'">
select nextval for seq_users from sysibm.sysdummy1"
</if>
</selectKey>
insert into users values (#{id}, #{name})
</insert>動(dòng)態(tài) SQL 中的插入腳本語(yǔ)言
MyBatis 從 3.2 版本開(kāi)始支持插入腳本語(yǔ)言,這允許你插入一種語(yǔ)言驅(qū)動(dòng),并基于這種語(yǔ)言來(lái)編寫動(dòng)態(tài) SQL 查詢語(yǔ)句。
可以通過(guò)實(shí)現(xiàn)以下接口來(lái)插入一種語(yǔ)言:
public interface LanguageDriver {
ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);
SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType);
SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType);
}實(shí)現(xiàn)自定義語(yǔ)言驅(qū)動(dòng)后,你就可以在 mybatis-config.xml 文件中將它設(shè)置為默認(rèn)語(yǔ)言:
<typeAliases> <typeAlias type="org.sample.MyLanguageDriver" alias="myLanguage"/> </typeAliases> <settings> <setting name="defaultScriptingLanguage" value="myLanguage"/> </settings>
或者,你也可以使用 lang 屬性為特定的語(yǔ)句指定語(yǔ)言:
<select id="selectBlog" lang="myLanguage"> SELECT * FROM BLOG </select>
或者,在你的 mapper 接口上添加 @Lang 注解:
public interface Mapper {
@Lang(MyLanguageDriver.class)
@Select("SELECT * FROM BLOG")
List<Blog> selectBlog();
}SQL片段拼接#
我們?cè)賹憇ql語(yǔ)句的時(shí)候往往會(huì)有這樣一些要求,一些重復(fù)的sql語(yǔ)句片段,我們不想重復(fù)去寫,那么可以通過(guò)sql片段方式去抽離,公共sql然后在需要的地方去引用
MyBatis 中 <sql>元素用于定義一個(gè) SQL 片段,用于分離一些公共的 SQL 語(yǔ)句,例如:SELECT 關(guān)鍵字和 WHERE 關(guān)鍵字之間的部分。其中:
id:唯一標(biāo)識(shí)符,用于在其他地方使用<include>標(biāo)簽引用;lang:設(shè)置字符編碼;databaseId:指定執(zhí)行該 SQL 語(yǔ)句的數(shù)據(jù)庫(kù)ID,數(shù)據(jù)庫(kù)ID在 mybatis-cfg.xml 中的 中配置。
同時(shí),你也能夠看見(jiàn) <sql> 標(biāo)簽中可以使用<include>、<trim>、<where>、<set>、<foreach>、<choose>、<if>、<bind>等標(biāo)簽定義復(fù)雜的 SQL 片段
簡(jiǎn)單使用定義sql片段如下:
<sql id="user_columns">
`user_id`, `name`, `sex`, `age`
</sql>
在 <sql> 標(biāo)簽中使用<include> 標(biāo)簽引入定義的sql片段,如下:
<!-- 定義基礎(chǔ)列 -->
<sql id="user_base_columns">
`user_id`, `name`
</sql>
<!-- 定義一個(gè)SQL片段 -->
<sql id="user_columns">
<include refid="user_base_columns"/>, `sex`, `age`
</sql>
場(chǎng)景使用案例如:查詢用戶信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hxstrive.mybatis.sql.demo1.UserMapper">
<!-- 映射結(jié)果 -->
<resultMap id="RESULT_MAP" type="com.hxstrive.mybatis.sql.demo1.UserBean">
<id column="user_id" jdbcType="INTEGER" property="userId" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="sex" jdbcType="VARCHAR" property="sex" />
<result column="age" jdbcType="INTEGER" property="age" />
</resultMap>
<!-- 定義一個(gè)SQL片段 -->
<sql id="user_columns">
`user_id`, `name`, `sex`, `age`
</sql>
<!-- 查詢所有用戶信息 -->
<select id="findAll" resultMap="RESULT_MAP">
select <include refid="user_columns" /> from `user`
</select>
</mapper>
SQL參數(shù)取值和OGNL表達(dá)式
看到我們上面去值參數(shù)通過(guò)#{params}這種方式來(lái)去值的其中傳進(jìn)來(lái)的參數(shù) #{xx} 就是使用的 OGNL 表達(dá)式。
Mybatis 官方文檔中「XML 映射文件」模塊里邊,有解析到:
說(shuō)當(dāng)我們使用 #{} 類型參數(shù)符號(hào)的時(shí)候,其實(shí)就是告訴 Mybatis 創(chuàng)建一個(gè)預(yù)處理語(yǔ)句參數(shù),通過(guò) JDBC,這樣的一個(gè)參數(shù)在 SQL 中會(huì)由一個(gè) "?" 來(lái)標(biāo)識(shí),并傳遞到一個(gè)新的預(yù)處理語(yǔ)句中。


也就是說(shuō)當(dāng)我們使用 #{XX} OGNL 表達(dá)式的時(shí)候, 它會(huì)先幫我們生成一條帶占位符的 SQL 語(yǔ)句,然后在底層幫我們?cè)O(shè)置這個(gè)參數(shù):ps.setInt(1, id);
OGNL 是 Object-Graph Navigation Language 的縮寫,對(duì)象-圖行導(dǎo)航語(yǔ)言,語(yǔ)法為:#{ }。
是不是有點(diǎn)懵,不知道這是個(gè)啥?
OGNL 作用是在對(duì)象和視圖之間做數(shù)據(jù)的交互,可以存取對(duì)象的屬性和調(diào)用對(duì)象的方法,通過(guò)表達(dá)式可以迭代出整個(gè)對(duì)象的結(jié)構(gòu)圖
MyBatis常用OGNL表達(dá)式如下:

上述內(nèi)容只是合適在MyBatis中使用的OGNL表達(dá)式,完整的表達(dá)式點(diǎn)擊這里。
MyBatis中可以使用OGNL的地方有兩處:
- 動(dòng)態(tài)
SQL表達(dá)式中 ${param}參數(shù)中
如下例子MySql like 查詢:
<select id="xxx" ...>
select id,name,... from country
<where>
<if test="name != null and name != ''">
name like concat('%', #{name}, '%')
</if>
</where>
</select>
上面代碼中test的值會(huì)使用OGNL計(jì)算結(jié)果。
例二,通用 like 查詢:
<select id="xxx" ...>
select id,name,... from country
<bind name="nameLike" value="'%' + name + '%'"/>
<where>
<if test="name != null and name != ''">
name like #{nameLike}
</if>
</where>
</select>
這里的value值會(huì)使用OGNL計(jì)算。
注:對(duì)<bind參數(shù)的調(diào)用可以通過(guò)#{}或 ${} 方式獲取,#{}可以防止注入。
在通用Mapper中支持一種UUID的主鍵,在通用Mapper中的實(shí)現(xiàn)就是使用了標(biāo)簽,這個(gè)標(biāo)簽調(diào)用了一個(gè)靜態(tài)方法,大概方法如下:
<bind name="username_bind"
value='@java.util.UUID@randomUUID().toString().replace("-", "")' />
這種方式雖然能自動(dòng)調(diào)用靜態(tài)方法,但是沒(méi)法回寫對(duì)應(yīng)的屬性值,因此使用時(shí)需要注意。
${params}中的參數(shù)
上面like的例子中使用下面這種方式最簡(jiǎn)單
<select id="xxx" ...>
select id,name,... from country
<where>
<if test="name != null and name != ''">
name like '${'%' + name + '%'}'
</if>
</where>
</select>
這里注意寫的是${'%' + name + '%'},而不是%${name}%,這兩種方式的結(jié)果一樣,但是處理過(guò)程不一樣。
在MyBatis中處理${}的時(shí)候,只是使用OGNL計(jì)算這個(gè)結(jié)果值,然后替換SQL中對(duì)應(yīng)的${xxx},OGNL處理的只是${這里的表達(dá)式}。
這里表達(dá)式可以是OGNL支持的所有表達(dá)式,可以寫的很復(fù)雜,可以調(diào)用靜態(tài)方法返回值,也可以調(diào)用靜態(tài)的屬性值。
例子,條件判斷入?yún)傩灾凳欠癜幼址梢灾苯邮褂?nbsp;contains判斷
<foreach collection="list" item="item" index="index" separator="AND" open="(" close=")">
<choose>
<when test='item.cname.contains("select") or item.cname.contains("checkbox") or item.cname.contains("date")'>
<if test='item.cname.contains("select") or item.cname.contains("checkbox")'>
find_in_set(#{item.value},base.${item.cname})
</if>
<if test='item.cname.contains("date")'>
DATE_FORMAT(base.${item.cname},'%Y-%m-%d') = DATE_FORMAT(#{item.value},'%Y-%m-%d')
</if>
</when>
<otherwise>
base.${item.cname} = #{item.value}
</otherwise>
</choose>
</foreach>到此這篇關(guān)于MyBatis if choose 動(dòng)態(tài) SQL的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis 動(dòng)態(tài) SQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mybatis的動(dòng)態(tài)sql詳解(精)
- MyBatis 動(dòng)態(tài)拼接Sql字符串的問(wèn)題
- MyBatis 執(zhí)行動(dòng)態(tài) SQL語(yǔ)句詳解
- Mybatis中動(dòng)態(tài)SQL,if,where,foreach的使用教程詳解
- MyBatis執(zhí)行動(dòng)態(tài)SQL的方法
- mybatis動(dòng)態(tài)sql之Map參數(shù)的講解
- MyBatis動(dòng)態(tài)Sql之if標(biāo)簽的用法詳解
- mybatis的動(dòng)態(tài)sql之if test的使用說(shuō)明
相關(guān)文章
springboot默認(rèn)文件緩存(easy-captcha?驗(yàn)證碼)
這篇文章主要介紹了springboot的文件緩存(easy-captcha?驗(yàn)證碼),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
Spring依賴注入中的@Resource與@Autowired詳解
這篇文章主要介紹了Spring依賴注入中的@Resource與@Autowired詳解,提到Spring依賴注入,大家最先想到應(yīng)該是@Resource和@Autowired,對(duì)于Spring為什么要支持兩個(gè)這么類似的注解卻未提到,屬于知其然而不知其所以然,本文就來(lái)做詳細(xì)講解,需要的朋友可以參考下2023-09-09
Spring Security實(shí)現(xiàn)自定義訪問(wèn)策略
本文介紹Spring Security實(shí)現(xiàn)自定義訪問(wèn)策略,當(dāng)根據(jù)誰(shuí)訪問(wèn)哪個(gè)域?qū)ο笞龀霭踩珱Q策時(shí),您可能需要一個(gè)自定義的訪問(wèn)決策投票者,幸運(yùn)的是,Spring Security有很多這樣的選項(xiàng)來(lái)實(shí)現(xiàn)訪問(wèn)控制列表(ACL)約束,下面就來(lái)學(xué)習(xí)Spring Security自定義訪問(wèn)策略,需要的朋友可以參考下2022-02-02
Java通過(guò)調(diào)用C/C++實(shí)現(xiàn)的DLL動(dòng)態(tài)庫(kù)——JNI的方法
這篇文章主要介紹了Java通過(guò)調(diào)用C/C++實(shí)現(xiàn)的DLL動(dòng)態(tài)庫(kù)——JNI的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Spring boot如何基于攔截器實(shí)現(xiàn)訪問(wèn)權(quán)限限制
這篇文章主要介紹了Spring boot如何基于攔截器實(shí)現(xiàn)訪問(wèn)權(quán)限限制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
java實(shí)現(xiàn)excel和txt文件互轉(zhuǎn)
本篇文章主要介紹了java實(shí)現(xiàn)excel和txt文件互轉(zhuǎn)的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
詳解Spring?Boot中@PostConstruct的使用示例代碼
在Java中,@PostConstruct是一個(gè)注解,通常用于標(biāo)記一個(gè)方法,它表示該方法在類實(shí)例化之后(通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象之后)立即執(zhí)行,這篇文章主要介紹了詳解Spring?Boot中@PostConstruct的使用,需要的朋友可以參考下2023-09-09

