MyBatis框架:第七章:注解使用方式和參數(shù)傳遞及#{}和${}
myBatis的注解使用方式(了解。主要使用xml)
注解的使用示例:
public interface UserMapperAnnotation {
@Select("select id,last_name userName ,sex from t_user where id = #{id}")
public User selectUser(int id);
@Select("select * from t_user")
public List<User> selectUserList();
@Update("update t_user set last_name = #{lastName}, sex = #{sex} where id = #{id}")
public int updateUser(User user);
@Delete("delete from t_user where id = #{id}")
public int deleteUserById(int id);
@Insert("insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})")
@SelectKey(before = false, keyProperty = "id", resultType = Integer.class, statement = { "select last_insert_id()" })
public int insertUser(User user);
}
mybatis-config.xml配置文件中導(dǎo)入
<mappers>
<mapper class="com.dao.UserMapperAnnotation"/>
</mappers>
mybatis的參數(shù)傳遞
1.一個(gè)普通數(shù)據(jù)類型
當(dāng)一個(gè)方法中只有一個(gè)普通數(shù)據(jù)類型。在mapper配置文件中可以使用#{}占位符來進(jìn)行占位輸出。
#{} 占位符中,可以寫參數(shù)的 #{變量名}。 也可以寫 #{value}。
方法:
public int deleteUserById(int id);
#{變量名}
<delete id="deleteUserById" parameterType="int">
delete from t_user where id = #{id}
</delete>
#{value}
<delete id="deleteUserById" parameterType="int">
delete from t_user where id = #{value}
</delete>
2.多個(gè)普通數(shù)據(jù)類型
多個(gè)普通的參數(shù)。當(dāng)我們需要使用 #{} 占位輸出的時(shí)候,可以使用
param1,param2 …… paramN
也就是 #{param1} …… #{paramN}
或者使用@Param命名參數(shù)
使用param1、param2 …… paramN 占位輸出參數(shù)
方法:
public List findUserByNameAndSex(String username, int sex);
使用param1、param2 …… paramN 的方式 占位輸出參數(shù)
<select id="findUserByNameAndSex" resultType="com.atguigu.bean.User" >
select id,last_name lastName,sex from t_user where last_name = #{param1} and sex = #{param2}
</select>
3.使用@Param注解命名參數(shù)
方法:
public List findUserByNameAndSex(@Param(“username”) String username, @Param(“sex”) int sex);
使用命名參數(shù)輸出:
<select id="findUserByNameAndSex" resultType="com.atguigu.bean.User" >
select id,last_name lastName,sex from t_user where last_name = #{lastName} and sex = #{sex}
</select>
傳遞一個(gè)Map對象作為參數(shù)
當(dāng)我們的參數(shù)為map對象的時(shí)候。我們可以使用 map對象的key來做為占位符,輸出數(shù)據(jù)。
#{map的key} 來做為占位符的輸出
使用示例如下:
方法:
public List findUserByMap(Map<String, Object> map);
調(diào)用的代碼:
@Test
public void findUserByMap() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
Map<String, Object>map = new HashMap<String, Object>();
map.put(“l(fā)astName”, “admin”);
map.put(“sex”, 1);
System.out.println( userMapper.findUserByMap(map) );
} finally {
session.close();
}
}
配置如下:
<select id="findUserByMap" resultType="com.bean.User" >
select id,last_name lastName,sex from t_user where last_name = #{lastName} and sex = #{sex}
</select>
一個(gè)Pojo數(shù)據(jù)類型
當(dāng)方法的參數(shù)是一個(gè)復(fù)雜類型的對象的時(shí)候。我們可以使用 對象的屬性名。當(dāng)成占位符的名稱。比如:#{ 屬性名 }
示例:
public int insertUser(User user);
mapper中的配置:
<insert id="insertUser" parameterType="com.atguigu.bean.User" useGeneratedKeys="true" keyProperty="id">
insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})
</insert>
多個(gè)Pojo數(shù)據(jù)類型
當(dāng)有多個(gè)復(fù)雜pojo對象做為參數(shù)傳遞給方法使用時(shí)候。我們要取出數(shù)據(jù)做為sql的參數(shù)。可以使用如下方式:
#{param1.屬性名}
……
#{paramN.屬性名}
也可以使用@Param命名參數(shù)。給每個(gè)pojo對象起一個(gè)別名。然后再通過 #{別名.屬性名} 的方式取出數(shù)據(jù)值做為參數(shù)使用。
使用示例:
默認(rèn)param1、param2、paramN形式取對象屬性。配置如下:
方法:
public List findUserByTwoUser(User user1, User user2);
配置如下:
<select id="findUserByTwoUser" resultType="com.bean.User" >
select id,last_name lastName,sex from t_user where last_name = #{param1.lastName} and sex = #{param2.sex}
</select>
@Param注解命名參數(shù)的形式:
方法:
public List findUserByTwoUser(@Param(“user1”) User user1, @Param(“user2”) User user2);
配置如下:
<select id="findUserByTwoUser" resultType="com.bean.User" >
select id,last_name lastName,sex from t_user where last_name = #{user1.lastName} and sex = #{user2.sex}
</select>
#{}和${}的區(qū)別
#{} 在mapper的配置文件的sql語句中,它是占位符, 相當(dāng)于 ? 號。
${} 在 mapper 的配置文件的 sql 語句中,它是原樣輸出變量的值,然后以字符串拼接的功能進(jìn)行操作。
${} 中只能寫value,或者是@Param命名參數(shù)后的參數(shù)名稱
在輸出參數(shù)的時(shí)候,我們并不推薦使用 ${} 來輸出。因?yàn)榭赡軙?dǎo)至 sql 注入問題的存在
比如:
select * form t_user where id = #{id}
相當(dāng)于:
select * from t_user where id = ?
而
select * from t_user where id = ${value}
相當(dāng)于
select * from t_user where id = 原樣輸出變量的值
模糊查詢
現(xiàn)在要根據(jù)用戶名查詢用戶對象。 也就是希望查詢?nèi)缦拢?/p>
select id,last_name lastName ,sex from t_user where last_name like ‘%張%’
方法:
public List findUserLikeName(String name);
#{} 的實(shí)現(xiàn)配置和調(diào)用
調(diào)用代碼:
@Test
public void findUserLikeName() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
// 需要在傳遞參數(shù)的時(shí)候,自己加上前后的兩個(gè)百分號
System.out.println( userMapper.findUserLikeName("%a%") );
} finally {
session.close();
}
}
配置如下:
<select id="findUserLikeName" resultType="com.bean.User" >
select id,last_name lastName ,sex from t_user where last_name like #{name}
</select>
${} 的實(shí)現(xiàn)配置和調(diào)用
${} 的實(shí)現(xiàn),只是原樣的輸出參數(shù)的值。然后做字符串的拼接操作。
調(diào)用代碼:
@Test
public void findUserLikeName() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
// 需要在傳遞參數(shù)的時(shí)候,自己加上前后的兩個(gè)百分號
System.out.println( userMapper.findUserLikeName(“a”) );
} finally {
session.close();
}
}
配置如下:
<select id="findUserLikeName" resultType="com.bean.User" >
select id,last_name lastName ,sex,phone from t_user where last_name like '%${value}%'
</select>
MySQL的字符串拼接,concat函數(shù)實(shí)現(xiàn)。
在mysql中,有一個(gè)字符串拼接操作的函數(shù)。叫concat函數(shù)。當(dāng)我們需要做類似于like 這種查詢的時(shí)候。我們可以使用 #{} 組合 concat來解決參數(shù)輸入,以及不需要在傳遞參數(shù)的時(shí)候,加兩個(gè)%%的情況。還可以解決sql注入問題。使用如下:
代碼調(diào)用下:
@Test
public void findUserLikeName() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
// 需要在傳遞參數(shù)的時(shí)候,自己加上前后的兩個(gè)百分號
System.out.println( userMapper.findUserLikeName(“a”) );
} finally {
session.close();
}
}
配置如下:
<select id="findUserLikeName" resultType="com.bean.User" >
select id,last_name lastName ,sex from t_user where user_name like concat('%',#{name},'%');
</select>