基本類型:前端
基本類型,參數名稱與佔位符中的名稱無關。java
#{} 傳入值時,sql解析時,參數是帶引號的sql
若是用了@Param("xxx") ,則mybatis會自動生成map做爲入參,那麼參數名稱則必須與佔位符一致session
<select id="findById" parameterType="int" resultType="cn.wh.vo.Role"> select * from t_role where id = #{xxxid} </select>
測試:mybatis
@Test public void testSelectOne(){ Role role = (Role)session.selectOne("cn.wh.mapper.RoleMapper.findById",1); System.out.println(role.getName()); }
自定義類型app
自定義類型做爲參數,自定義類中須要爲爲屬性提供get方法,若是沒有提供get方法,那麼會根據佔位符中的名稱去反射獲取值,若是佔位符中的名稱和屬性不一致,那麼報ReflectionException。測試
<select id="findListBypage" parameterType="cn.wh.util.PageUtil" resultType="Role"> select * from t_role limit #{index},#{size} </select>
測試:code
@Test public void testPage1(){ PageUtil pu = new PageUtil(); pu.setIndex(3); pu.setSize(3); List<Role> list = session.selectList("cn.wh.mapper.RoleMapper.findListBypage", pu); for(Role r:list){ System.out.println(r.getName()); } }
Mapxml
Map做爲參數類型,key和佔位符中的名稱一致便可,若是名稱不一致那麼將會把null,傳遞到佔位符中。排序
注意:#{}佔位符不能解決一下 3 類問題:
表名是動態的: Select * from #{table_name}
列名是動態的:Select #{column_name} from t_role
排序列是動態的: Select * from t_role order by #{columu}
${}傳入值,sql解析時,參數是不帶引號的。
所以${}參數不能爲基本數據類型,只能爲自定義類型和map
<!-- 查詢全部 --> <select id="findAll" parameterType="map" resultType="cn.wh.vo.Role"> select * from ${tableName} </select>
測試:
@Test public void testSelectList(){ Map<String,String> map = new HashMap<String,String>(); map.put("tableName", "t_role"); List<Role> list = session.selectList("cn.wh.mapper.RoleMapper.findAll",map); for(Role role:list){ System.out.println(role.getId()+"----"+role.getName()); } }
做爲鏈接符使用:
<select id="selectLike1" parameterType="map" resultType="Role"> select *from t_role where name like '${name}%'; </select>
測試:
@Test public void testLike2(){ Map<String,String> map = new HashMap<String,String>(); map.put("name", "黃"); List<Role> list = session.selectList("cn.wh.mapper.RoleMapper.selectLike1",map); for(Role r:list){ System.out.println(r.getName()); } }
在mybatis中的$與#都是在sql中動態的傳入參數。
eg:select id,name,age from student where name=#{name} 這個name是動態的,可變的。當你傳入什麼樣的值,就會根據你傳入的值執行sql語句。
#{}: 解析爲一個 JDBC 預編譯語句(prepared statement)的參數標記符,一個 #{ } 被解析爲一個參數佔位符 。
${}: 僅僅爲一個純碎的 string 替換,在動態 SQL 解析階段將會進行變量替換。
例子:
eg 1: select id,name,age from student where name=#{name} ;
解析爲:select id,name,age from student where name='cy';
eg 2: select id,name,age from student where name=${name};
解析爲:select id,name,age from student where name=cy;