關(guān)于Mybatis的mapper接口函數(shù)重載問(wèn)題
Mybatis的接口函數(shù)能不能進(jìn)行重載?
- mybatis版本:3.4x
- java版本:java 8
語(yǔ)法層面
1、接口的方法可以進(jìn)行重載,因?yàn)?java 語(yǔ)法可以讓接口函數(shù)進(jìn)行重載。
Mybatis框架方面
1、結(jié)論:可以有條件的進(jìn)行重載。
2、為什么會(huì)有這個(gè)問(wèn)題?:mybatis里面將接口里面的方法名稱和配置文件里面的id屬性進(jìn)行唯一配對(duì),在同一個(gè)命名空間下只能有一個(gè)id,那么所有函數(shù)名稱相同的重載函數(shù)都會(huì)被綁定到一個(gè)id上,所以,如果要實(shí)現(xiàn)函數(shù)的重載,必須讓一個(gè)SQL語(yǔ)句去適應(yīng)多個(gè)函數(shù)的參數(shù),如果是單純的重載是肯定不行的(重載函數(shù)的定義就是參數(shù)相關(guān)),但是得益于mybatis的多種傳參方式和隱性的分頁(yè)功能,可以在接口里面進(jìn)行函數(shù)重載,但是還是需要將所有的重載函數(shù)適配到同一個(gè)id的SQL上面去,仍然有很大的局限性,并不是可以隨意的進(jìn)行重載。
測(cè)試
1、數(shù)據(jù)庫(kù)環(huán)境
DROP TABLE IF EXISTS sys_user; CREATE TABLE sys_user( ? id BIGINT NOT NULL AUTO_INCREMENT COMMENT '用戶的ID', ? user_name VARCHAR(50) COMMENT '用戶名稱', ? user_password VARCHAR(50) COMMENT '密碼', ? user_email VARCHAR(50) COMMENT '郵箱', ? user_info TEXT COMMENT '簡(jiǎn)介', ? head_img BLOB COMMENT '頭像', ? create_time DATETIME COMMENT '創(chuàng)建時(shí)間', ? PRIMARY KEY (id) )DEFAULT CHARSET utf8; ALTER TABLE sys_user COMMENT '用戶表'; INSERT INTO sys_user VALUES ('1','admin','123456','admin@mybatis.tk','管理員',null,'2016-04-01 17:00:58'); INSERT INTO sys_user VALUES ('1001','test','123456','test@mybatis.tk','測(cè)試用戶',null,'2016-04-01 17:01:52');
2、實(shí)體類
public class SysUser { ? ? private Long id; ? ? private String userName; ? ? private String userPassword; ? ? private String userEmail; ? ? private String userInfo; ? ? private byte[] headImg; ? ? private Date createTime; ? ? public SysUser(){ ? ? } ? ? /**setter and getter*/ }
3、測(cè)試
3.1、測(cè)試模板代碼
public class SysUserDaoTest { ? ? private static SqlSessionFactory sqlSessionFactory; ? ? private SqlSession sqlSession; ? ? @BeforeClass ? ? public static void beforeClass(){ ? ? ? ? String resource = "plus/mybatis-config.xml"; ? ? ? ? try{ ? ? ? ? ? ? InputStream inputStream = Resources.getResourceAsStream(resource); ? ? ? ? ? ? sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); ? ? ? ? }catch(IOException e){ ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } ? ? @Before ? ? public void before(){ ? ? ? ? //事物手動(dòng)提交 ? ? ? ? sqlSession = sqlSessionFactory.openSession(false); ? ? } ? ? @After ? ? public void after(){ ? ? ? ? //回滾事物 ? ? ? ? sqlSession.rollback(true); ? ? ? ? //關(guān)閉會(huì)話 ? ? ? ? sqlSession.close(); ? ? } }
3.2、測(cè)試場(chǎng)景一
重載實(shí)現(xiàn)分頁(yè)、參數(shù)類型轉(zhuǎn)換實(shí)現(xiàn)重載。
3.2.1、接口
public interface SysUserDao { ? ? SysUser selectById(Long id); ? ? List<SysUser> selectById(Long id,RowBounds rowBound); ?}
3.2.2、mapper配置文件
<!-- ? ? id:注意事項(xiàng):接口方法不能進(jìn)行重載,在3.4版本后是錯(cuò)的?。。。?!,因?yàn)橹辽倏梢苑猪?yè)?。?! ? ? ? ? ? ? 1、接口中的所有重載方法對(duì)應(yīng)XML里面的同一個(gè)ID,但是3.4之后有一個(gè)分頁(yè)的插件,所以至少可以接受一個(gè)org.apache.ibatis.session.RowBounds的隱性參數(shù)。 ? ? ? ? ? ? 2、雖然接口里面的方法可以進(jìn)行重載,但是需要一個(gè)前提:不要指定 parameterType 屬性!! ? ? ? ? ? ? ? ? 接口方法如下: ? ? ? ? ? ? ? ? SysUser selectById(Long id); ? ? ? ? ? ? ? ? List<SysUser> selectById(Long id,RowBounds rowBound); ? ? ? ? ? ? ? ? SysUser selectById(String name); ? ? ? ? ? ? ? ? 測(cè)試代碼如下: ? ? ? ? ? ? ? ? SysUserDao sysUserDao = sqlSession.getMapper(SysUserDao.class); ? ? ? ? ? ? ? ? SysUser sysUser = sysUserDao.selectById(1L); ? ? ? ? ? ? ? ? Assert.assertEquals("admin",sysUser.getUserName()); ? ? ? ? ? ? ? ? SysUser sysUser1 = sysUserDao.selectById("1"); ? ? ? ? ? ? ? ? Assert.assertEquals("admin",sysUser1.getUserName()); ? ? ? ? ? ? ? ? /* ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ?; ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - ==> Parameters: 1(Long) ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - <== ? ? ?Total: 1 ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ?; ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - ==> Parameters: 1(String) ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - <== ? ? ?Total: 1 ? ? ? ? ? ? ? ? ?*/ ? ? ? ? ? ? ? ? ?RowBounds rowBound = new RowBounds(0,2); ? ? ? ? ? ? ? ? List<SysUser> sysUsers = sysUserDao.selectById(1L,rowBound); ? ? ? ? ? ? ? ? Assert.assertEquals(1,sysUsers.size()); ? ? ? ? ? ? ? ? /* ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ?; ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - ==> Parameters: 1(Long) ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - <== ? ? ?Total: 1 ? ? ? ? ? ? ? ? ?*/ ? ? ? ? ? ? ? ? 事實(shí)證明,當(dāng)不指定參數(shù)類型的時(shí)候(也僅僅當(dāng)不指定參數(shù)類型的時(shí)候才可以,因?yàn)橹剌d重載的是參數(shù)),是可以進(jìn)行 ? ? ? ? ? ? ? ? 接口方法重載的,因?yàn)閙ybatis的參數(shù)類型推斷會(huì)自動(dòng)的轉(zhuǎn)換參數(shù)類型,比如: ? ? ? ? ? ? ? ? ? ? sysUserDao.selectById("楚云飛"); ? ? ? ? ? ? ? ? 因?yàn)镮D的類型是Long類型,所以數(shù)據(jù)類型的自動(dòng)轉(zhuǎn)換失敗,但是是不會(huì)出現(xiàn)異常的,只是它選取出來(lái)的數(shù)據(jù)集為null,因?yàn)镮D的類型是bigint,沒(méi)有bigint值為楚云飛,所以為null結(jié)果集。 ? ? --> ? ? <select id="selectById" resultMap="sysUser" flushCache="true"> ? ? ? ? SELECT * FROM sys_user WHERE id = #{id}; ? ? </select> ? ? <resultMap id="sysUser" type="plus.pojo.SysUser"> ? ? ? ? <id property="id" column="id"/> ? ? ? ? <result property="userName" column="user_name"/> ? ? ? ? <result property="userPassword" column="user_password"/> ? ? ? ? <result property="userEmail" column="user_email"/> ? ? ? ? <result property="userInfo" column="user_info"/> ? ? ? ? <result property="headImg" column="head_img" jdbcType="BLOB"/> ? ? ? ? <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> ? ? </resultMap>
3.3、測(cè)試場(chǎng)景二
參數(shù)傳遞方式實(shí)現(xiàn)重載,map參數(shù)傳遞和固定參數(shù)名的參數(shù)傳遞方式
3.3.1、接口
public interface SysUserDao { ? ? SysUser selectByCondition(@Param("id")Long id,@Param("userName")String userName,@Param("userPassword")String userPassword); ? ? SysUser selectByCondition(Map params); }
3.3.2、mapper配置文件
<!-- ? ? 固定參數(shù)傳遞: ? ? ? ?函數(shù)接口: ? ? ? ? ? ?SysUser selectByCondition(@Param("id")Long id,@Param("userName")String userName,@Param("userPassword")String userPassword); ? ? ? ? ? ?SysUser selectByCondition(Map params); ? ? ? ?測(cè)試函數(shù): ? ? ? ? ? ? @Test ? ? ? ? ? ? public void selectByCondition(){ ? ? ? ? ? ? ? ? SysUserDao sysUserDao = sqlSession.getMapper(SysUserDao.class); ? ? ? ? ? ? ? ? SysUser sysUser = sysUserDao.selectByCondition(1L,"admin","123456"); ? ? ? ? ? ? ? ? Assert.assertEquals("admin@mybatis.tk",sysUser.getUserEmail()); ? ? ? ? ? ? ? ? /* ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectByCondition - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ? AND user_name = ? AND user_password = ?; ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectByCondition - ==> Parameters: 1(Long), admin(String), 123456(String) ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectByCondition - <== ? ? ?Total: 1 ? ? ? ? ? ? ? ? ?*/ ? ? ? ? ? ? ? ? Map<String,Object> params = new HashMap<String,Object>(3); ? ? ? ? ? ? ? ? //傳入的鍵值必須和SQL語(yǔ)句里面的以及重載函數(shù)的參數(shù)名稱相同才可以實(shí)現(xiàn)正確的重載,否則將重載出錯(cuò)。 ? ? ? ? ? ? ? ? params.put("id",1L); ? ? ? ? ? ? ? ? params.put("userName","admin"); ? ? ? ? ? ? ? ? params.put("userPassword","123456"); ? ? ? ? ? ? ? ? SysUser sysUser1 = sysUserDao.selectByCondition(params); ? ? ? ? ? ? ? ? /* ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectByCondition - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ? AND user_name = ? AND user_password = ?; ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectByCondition - ==> Parameters: 1(Long), admin(String), 123456(String) ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectByCondition - <== ? ? ?Total: 1 ? ? ? ? ? ? ? ? ?*/ ? ? ? ? ? ? ? ? Assert.assertEquals("admin@mybatis.tk",sysUser1.getUserEmail()); ? ? ? ? ? ? } --> ? ? <select id="selectByCondition" resultMap="sysUser" flushCache="true"> ? ? ? ? SELECT * FROM sys_user WHERE id = #{id} AND user_name = #{userName} AND user_password = #{userPassword}; ? ? </select>
3.4、完整的測(cè)試代碼
package plus.dao; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.*; import org.junit.*; import plus.pojo.SysUser; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; public class SysUserDaoTest { ? ? private static SqlSessionFactory sqlSessionFactory; ? ? private SqlSession sqlSession; ? ? @BeforeClass ? ? public static void beforeClass(){ ? ? ? ? String resource = "plus/mybatis-config.xml"; ? ? ? ? try{ ? ? ? ? ? ? InputStream inputStream = Resources.getResourceAsStream(resource); ? ? ? ? ? ? sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); ? ? ? ? }catch(IOException e){ ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } ? ? @Before ? ? public void before(){ ? ? ? ? //事物手動(dòng)提交 ? ? ? ? sqlSession = sqlSessionFactory.openSession(false); ? ? } ? ? @After ? ? public void after(){ ? ? ? ? //回滾事物 ? ? ? ? sqlSession.rollback(true); ? ? ? ? //關(guān)閉會(huì)話 ? ? ? ? sqlSession.close(); ? ? } ? ? @Test ? ? public void selectById(){ ? ? ? ? SysUserDao sysUserDao = sqlSession.getMapper(SysUserDao.class); ? ? ? ? SysUser sysUser = sysUserDao.selectById(1L); ? ? ? ? Assert.assertEquals("admin",sysUser.getUserName()); ? ? ? ? SysUser sysUser1 = sysUserDao.selectById("1"); ? ? ? ? Assert.assertEquals("admin",sysUser1.getUserName()); ? ? ? ? /* ? ? ? ? plus.dao.SysUserDao.selectById - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ?; ? ? ? ? plus.dao.SysUserDao.selectById - ==> Parameters: 1(Long) ? ? ? ? plus.dao.SysUserDao.selectById - <== ? ? ?Total: 1 ? ? ? ? plus.dao.SysUserDao.selectById - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ?; ? ? ? ? plus.dao.SysUserDao.selectById - ==> Parameters: 1(String) ? ? ? ? plus.dao.SysUserDao.selectById - <== ? ? ?Total: 1 ? ? ? ? ?*/ ? ? ? ? RowBounds rowBound = new RowBounds(0,2); ? ? ? ? List<SysUser> sysUsers = sysUserDao.selectById(1L,rowBound); ? ? ? ? Assert.assertEquals(1,sysUsers.size()); ? ? ? ? /* ? ? ? ? plus.dao.SysUserDao.selectById - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ?; ? ? ? ? plus.dao.SysUserDao.selectById - ==> Parameters: 1(Long) ? ? ? ? plus.dao.SysUserDao.selectById - <== ? ? ?Total: 1 ? ? ? ? ?*/ ? ? } ? ? @Test ? ? public void selectByCondition(){ ? ? ? ? SysUserDao sysUserDao = sqlSession.getMapper(SysUserDao.class); ? ? ? ? SysUser sysUser = sysUserDao.selectByCondition(1L,"admin","123456"); ? ? ? ? Assert.assertEquals("admin@mybatis.tk",sysUser.getUserEmail()); ? ? ? ? /* ? ? ? ? plus.dao.SysUserDao.selectByCondition - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ? AND user_name = ? AND user_password = ?; ? ? ? ? plus.dao.SysUserDao.selectByCondition - ==> Parameters: 1(Long), admin(String), 123456(String) ? ? ? ? plus.dao.SysUserDao.selectByCondition - <== ? ? ?Total: 1 ? ? ? ? ?*/ ? ? ? ? Map<String,Object> params = new HashMap<String,Object>(3); ? ? ? ? params.put("id",1L); ? ? ? ? params.put("userName","admin"); ? ? ? ? params.put("userPassword","123456"); ? ? ? ? SysUser sysUser1 = sysUserDao.selectByCondition(params); ? ? ? ? /* ? ? ? ? plus.dao.SysUserDao.selectById - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ?; ? ? ? ? plus.dao.SysUserDao.selectById - ==> Parameters: 1(Long) ? ? ? ? plus.dao.SysUserDao.selectById - <== ? ? ?Total: 1 ? ? ? ? ?*/ ? ? ? ? Assert.assertEquals("admin@mybatis.tk",sysUser1.getUserEmail()); ? ? } }
3.5、完整的mapper文件
<?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"> <mapper namespace="plus.dao.SysUserDao"> ? ? <!-- ? ? id:當(dāng)使用接口時(shí),屬性值必須為接口里面的方法名稱,在同一個(gè)命名空間里面不重復(fù),否則將啟動(dòng)報(bào)錯(cuò); ? ? ? ? 在任何情況下,id屬性不能出現(xiàn)英文句點(diǎn) '.' (Caused by: org.apache.ibatis.builder.BuilderException: Dots are not allowed in element names, please remove it) ; ? ? ? ? 注意事項(xiàng):接口方法不能進(jìn)行重載,在3.4版本后是錯(cuò)的?。。。?!,因?yàn)榭梢苑猪?yè)?。?! ? ? ? ? ? ? 1、接口中的所有重載方法對(duì)應(yīng)XML里面的同一個(gè)ID,但是3.4之后有一個(gè)分頁(yè)的插件,所以可以接受一個(gè)org.apache.ibatis.session.RowBounds的隱性參數(shù)。 ? ? ? ? ? ? 2、雖然接口里面的方法可以進(jìn)行重載,但是如果要在運(yùn)行的時(shí)候依然不報(bào)錯(cuò)的話,需要一個(gè)前提:不要指定 parameterType 屬性!! ? ? ? ? ? ? ? ? 接口方法如下: ? ? ? ? ? ? ? ? SysUser selectById(Long id); ? ? ? ? ? ? ? ? List<SysUser> selectById(Long id,RowBounds rowBound); ? ? ? ? ? ? ? ? SysUser selectById(String name); ? ? ? ? ? ? ? ? 測(cè)試代碼如下: ? ? ? ? ? ? ? ? SysUserDao sysUserDao = sqlSession.getMapper(SysUserDao.class); ? ? ? ? ? ? ? ? SysUser sysUser = sysUserDao.selectById(1L); ? ? ? ? ? ? ? ? Assert.assertEquals("admin",sysUser.getUserName()); ? ? ? ? ? ? ? ? SysUser sysUser1 = sysUserDao.selectById("1"); ? ? ? ? ? ? ? ? Assert.assertEquals("admin",sysUser1.getUserName()); ? ? ? ? ? ? ? ? /* ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ?; ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - ==> Parameters: 1(Long) ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - <== ? ? ?Total: 1 ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ?; ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - ==> Parameters: 1(String) ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - <== ? ? ?Total: 1 ? ? ? ? ? ? ? ? ?*/ ? ? ? ? ? ? ? ? ?RowBounds rowBound = new RowBounds(0,2); ? ? ? ? ? ? ? ? List<SysUser> sysUsers = sysUserDao.selectById(1L,rowBound); ? ? ? ? ? ? ? ? Assert.assertEquals(1,sysUsers.size()); ? ? ? ? ? ? ? ? /* ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - ==> ?Preparing: SELECT * FROM sys_user WHERE id = ?; ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - ==> Parameters: 1(Long) ? ? ? ? ? ? ? ? plus.dao.SysUserDao.selectById - <== ? ? ?Total: 1 ? ? ? ? ? ? ? ? ?*/ ? ? ? ? ? ? ? ? 事實(shí)證明,當(dāng)不指定參數(shù)類型的時(shí)候(也僅僅當(dāng)不指定參數(shù)類型的時(shí)候才可以,因?yàn)橹剌d重載的是參數(shù)),是可以進(jìn)行 ? ? ? ? ? ? ? ? 接口方法重載的,因?yàn)閙ybatis的參數(shù)類型推斷會(huì)自動(dòng)的轉(zhuǎn)換參數(shù)類型,比如: ? ? ? ? ? ? ? ? ? ? sysUserDao.selectById("楚云飛"); ? ? ? ? ? ? ? ? 因?yàn)镮D的類型是Long類型,所以數(shù)據(jù)類型的自動(dòng)轉(zhuǎn)換失敗,但是是不會(huì)出現(xiàn)異常的,只是它選取出來(lái)的數(shù)據(jù)集為null ? ? --> ? ? <select id="selectById" resultMap="sysUser" flushCache="true"> ? ? ? ? SELECT * FROM sys_user WHERE id = #{_parameter}; ? ? </select> ? ? <!-- ? ? 參數(shù)傳遞問(wèn)題: ? ? 1、接口函數(shù): ? ? ? ? SysUser selectByCondition(Long id,String userName,String userPassword); ? ? 參數(shù)傳遞: ? ? ? ? 1、默認(rèn)參數(shù)傳遞:默認(rèn)的參數(shù)的命名為 param + 序位,SQL語(yǔ)句如下: ? ? ? ? ? ? SELECT * FROM sys_user WHERE id = #{param1} AND user_name = #{param2} AND user_password = #{param3}; ? ? ? ? 2、默認(rèn)參數(shù)傳遞:直接序列參數(shù),SQL語(yǔ)句如下: ? ? ? ? ? ? SELECT * FROM sys_user WHERE id = #{0} AND user_name = #{1} AND user_password = #{2}; ? ? ? ? 3、固定參數(shù)傳遞: ? ? ? ? ? ? 函數(shù)接口: ? ? ? ? ? ? ? ? SysUser selectByCondition(@Param("id")Long id,@Param("userName")String userName,@Param("userPassword")String userPassword); ? ? ? ? ? ? SQL語(yǔ)句如下: ? ? ? ? ? ? ? ? SELECT * FROM sys_user WHERE id = #{id} AND user_name = #{userName} AND user_password = #{userPassword}; ? ? ? ? 4、使用Map傳遞參數(shù): ? ? ? ? ? ? 函數(shù)接口:SysUser selectByCondition(Map params); ? ? ? ? ? ? 調(diào)用代碼段: ? ? ? ? ? ? ? ? Map<String,Object> params = new HashMap<String,Object>(3); ? ? ? ? ? ? ? ? params.put("id",1L); ? ? ? ? ? ? ? ? params.put("userName","admin"); ? ? ? ? ? ? ? ? params.put("userPassword","123456"); ? ? ? ? ? ? ? ? SysUser sysUser1 = sysUserDao.selectByCondition(params); ? ? ? ? ? ? ? ? Assert.assertEquals("admin@mybatis.tk",sysUser1.getUserEmail()); ? ? ? ? ? ? SQL語(yǔ)句: ? ? ? ? ? ? ? ? SELECT * FROM sys_user WHERE id = #{id} AND user_name = #{userName} AND user_password = #{userPassword}; ? ? ? ? ? ? 思考: ? ? ? ? ? ? ? ? 1、與固定參數(shù)的SQL相比,沒(méi)有改變SQL語(yǔ)句,而且兩個(gè)接口實(shí)現(xiàn)重載。 ? ? ? ? ? ? ? ? 2、接口函數(shù)可以實(shí)現(xiàn)重載,但是需要SQL語(yǔ)句來(lái)兼容這個(gè)函數(shù)的重載,也就是可以進(jìn)行有條件的重載。 ? ? ? ? 5、使用 $ 和 # 進(jìn)行取值的區(qū)別: ? ? ? ? ? ? 1. #將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串,會(huì)對(duì)自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號(hào)。如:order by #user_id#,如果傳入的值是111,那么解析成sql時(shí)的值為order by "111", 如果傳入的值是id,則解析成的sql為order by "id". ? ? ? ? ? ? 2. $將傳入的數(shù)據(jù)直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那么解析成sql時(shí)的值為order by user_id, ?如果傳入的值是id,則解析成的sql為order by id. ? ? ? ? ? ? 3. #方式能夠很大程度防止sql注入。 ? ? ? ? ? ? 4.$方式無(wú)法防止Sql注入。 ? ? ? ? ? ? 5.$方式一般用于傳入數(shù)據(jù)庫(kù)對(duì)象,例如傳入表名. ? ? ? ? ? ? 6.一般能用#的就別用$. ? ? ? ? ? ? SELECT * FROM sys_user WHERE id = ${id} AND user_name = '${userName}' AND user_password = '${userPassword}'; ? ? --> ? ? <select id="selectByCondition" resultMap="sysUser" flushCache="true"> ? ? ? ? SELECT * FROM sys_user WHERE id = #{id} AND user_name = #{userName} AND user_password = #{userPassword}; ? ? </select> ? ? <resultMap id="sysUser" type="plus.pojo.SysUser"> ? ? ? ? <id property="id" column="id"/> ? ? ? ? <result property="userName" column="user_name"/> ? ? ? ? <result property="userPassword" column="user_password"/> ? ? ? ? <result property="userEmail" column="user_email"/> ? ? ? ? <result property="userInfo" column="user_info"/> ? ? ? ? <result property="headImg" column="head_img" jdbcType="BLOB"/> ? ? ? ? <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> ? ? </resultMap> </mapper>
3.6、完整的接口
public interface SysUserDao { ? ? SysUser selectById(Long id); ? ? List<SysUser> selectById(Long id,RowBounds rowBound); ? ? SysUser selectById(String name); ? ? SysUser selectByCondition(@Param("id")Long id,@Param("userName")String userName,@Param("userPassword")String userPassword); ? ? SysUser selectByCondition(Map params); }
MyBatis實(shí)現(xiàn)方法重載的小技巧
QuestionMapper.java
利用接口默認(rèn)方法 default 實(shí)現(xiàn)
QuestionMapper.xml
利用動(dòng)態(tài)sql對(duì) userId 字段進(jìn)行判斷
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Mybatis-Plus接口BaseMapper與Services使用詳解
- 解決mybatis-plus自動(dòng)配置的mapper.xml與java接口映射問(wèn)題
- 使用Spring掃描Mybatis的mapper接口的三種配置
- 詳解mybatis-plus配置找不到Mapper接口路徑的坑
- Mybatis Mapper接口工作原理實(shí)例解析
- Mybatis MapperScannerConfigurer自動(dòng)掃描Mapper接口生成代理注入到Spring的方法
- Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過(guò)程解析
相關(guān)文章
淺談導(dǎo)入JavaWeb 項(xiàng)目出現(xiàn)的問(wèn)題
這篇文章主要介紹了導(dǎo)入JavaWeb 項(xiàng)目出現(xiàn)的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Springboot整合MongoDB的Docker開發(fā)教程全解
這篇文章主要介紹了Springboot整合MongoDB的Docker開發(fā),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2020-07-07Java四種訪問(wèn)控制修飾符知識(shí)點(diǎn)總結(jié)
本篇文章給大家詳細(xì)分析了Java四種訪問(wèn)控制修飾符的相關(guān)知識(shí)點(diǎn),有興趣的朋友可以參考學(xué)習(xí)下。2018-03-03Java判斷數(shù)字位數(shù)的方法總結(jié)
本文給大家整理了Java判斷數(shù)字位數(shù)的兩種常用方法,對(duì)此有興趣的可以跟著小編一起學(xué)習(xí)下。2018-02-02springboot如何使用redis的incr創(chuàng)建分布式自增id
這篇文章主要介紹了springboot如何使用redis的incr創(chuàng)建分布式自增id,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11ZooKeeper框架教程Curator分布式鎖實(shí)現(xiàn)及源碼分析
本文是ZooKeeper入門系列教程,本篇為大家介紹zookeeper一個(gè)優(yōu)秀的框架Curator,提供了各種分布式協(xié)調(diào)的服務(wù),Curator中有著更為標(biāo)準(zhǔn)、規(guī)范的分布式鎖實(shí)現(xiàn)2022-01-01詳解Intellij IDEA 2017 debug斷點(diǎn)調(diào)試技巧(總結(jié))
這篇文章主要介紹了詳解Intellij IDEA 2017 debug斷點(diǎn)調(diào)試技巧(總結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀
這篇文章主要為大家介紹了logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Java實(shí)現(xiàn)十秒向MySQL插入百萬(wàn)條數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)十秒向MySQL插入百萬(wàn)條數(shù)據(jù),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定借鑒價(jià)值,需要的可以參考一下2022-11-11