Mybatis輸入類型和結果類型
參數類型:
- 簡單類型:引用時名稱隨便寫
基本數據類型
基本數據類型的包裝類型
String
- pojo對象:引用時寫實體類的屬性名
#{name},引用的是實體類User中的name屬性
public class QueryVo {
// 包含其他的pojo
private User user;
private Integer startIndex;
private Integer pageSize;
}
<!--#{user.name} 引用屬性中的屬性名-->
<select id="findUserByQueryVo" parameterType="queryVO" resultType="user">
select * from user where name like "%"#{user.name}"%" limit #{startIndex},#{pageSize}
</select>
1.傳遞的多個參數
/**
* 多條件查詢
*/
public List<User> findUsers(Integer startIndex, Integer pageSize, String name);
parameterType:省略不配置
引入時: param1 ,param2,......
<select id="findUsers" resultType="user">
select * from user where name like "%"#{param3}"%" limit #{param1},#{param2}
</select>
2.傳遞map
//獲取session
SqlSession session = sessionFactory.openSession();
//通過getMapper方法獲取某接口的動態代理類對象
UserDao userDao = session.getMapper(UserDao.class);
Map<String,Object> map = new HashMap<>();
map.put("startIndex",2);
map.put("pageSize",2);
map.put("name","zhang");
List<User> userList = userDao.findUserByMap(map);
屬性名自己指定
引用時引用屬性名即可
<select id="findUserByMap" parameterType="map" resultType="User">
select * from user where name like "%"#{name}"%" limit #{startIndex},#{pageSize}
</select>
返回值
<!-- resultMap最終還是要將結果映射到pojo上,type就是指定映射到哪一個pojo -->
<!-- id:設置ResultMap的id -->
<resultMap id="users" type="user">
<!-- 定義主鍵 ,非常重要。如果是多個字段,則定義多個id -->
<!-- property:主鍵在pojo中的屬性名 -->
<!-- column:主鍵在數據庫中的列名 -->
<id property="id" column="id" />
<resultMap id="users" type="user">
<id column="u_id" property="id"></id>
<result column="name" property="name"></result>
<result column="address" property="address"></result>
<result column="birthday" property="birthday"></result>
<result column="sex" property="sex"></result>
</resultMap>
<select id="findAll" resultMap="users">
select * from sys_user
</select>
根據id查詢
<!--根據id查詢-->
<!--parameterType:指定參數類型-->
<!--簡單類型:基本數據類型&包裝類型 String
如果參數是簡單類型,引用時名稱隨便寫-->
<!--根據id查詢-->
<select id="findById" resultType="com.wqy.domain.User"
parameterType="java.lang.Integer">
select * from user where id =
#{id}
</select>
select * from user where id = #{abc}
select * from user where id = #{id}
模糊查詢
<!--
參數類型:pojo對象,引用實體類中的屬性名
#{name},引用的是實體類中的name屬性
-->
<!--模糊查詢-->
<select id="findByUser" parameterType="com.wqy.domain.User" resultType="com.wqy.domain.User">
SELECT * from user WHERE name LIKE "%"#{name}"%"
</select>
<select id="findByName" resultType="com.wqy.domain.User" parameterType="java.lang.String">
SELECT * from user WHERE name LIKE "%"#{abc}"%"
</select>
#{} 和${}
關於#{}:
1、#{}等同於 PreparedStatement 中的占位符?,會自動對傳入的字符串數據加一對單引號,可以避免 Sql 註入。
比如
select * from user where username = #{username} , 傳入的 username 為小張,那麽最後打印出來的就是
select * from user where username = ‘小張’
2、#{}可以接收簡單類型值或 Pojo 屬性值。
如果 parameterType 傳輸單個簡單類型值,#{}括號中可以是任意名稱。
關於${}:
1、${}將傳入的數據直接顯示生成在 Sql 中,只是簡單的拼接。
如:order by ${id},如果傳入的值是 id,則解析成的 Sql 為 order by id。
如果上面的例子使用${},則成了 select * from user where username = 小張
2、${}可以接收簡單類型值或 Pojo 屬性值,
如果 parameterType 傳輸單個簡單類型值,${}括號中只能是“value”這個字符串
<!--模糊查詢-->
<select id="findByUser" parameterType="com.wqy.domain.User" resultType="com.wqy.domain.User">
SELECT * from user WHERE name LIKE "%"#{name}"%"
</select>
user.setName("Rose");
"%"#{name}"%" Rose
#{name} %Rose%
${name} ‘%Rose%‘
‘%${name}%‘ Rose
<select id="findByName" resultType="com.wqy.domain.User" parameterType="java.lang.String">
SELECT * from user WHERE name LIKE "%"#{abc}"%"
</select>
"%"#{abc}"%" Rose
‘%${value}%‘ Rose
如果傳遞的是簡單類型參數,必須使用${value}
如果是pojo, 必須${屬性名}
總結:
1、$方式一般用於傳入數據庫對象,例如傳入表名、order by 的字段
2、一般能用#的就別用$.
增加用戶
<insert id="addUser" parameterType="com.wqy.domain.User">
INSERT INTO user values
(null,#{name},#{age})
</insert>
<!--
selectKey: 查詢鍵值
屬性:order:在添加之前查詢,還是之後查詢
keyProperty: 對應pojo對象中的屬性名
keyColumn: 對應數據庫中某列
resultType: 返回值類型
select last_insert_id(): 是mysql數據庫的一個函數,獲取該表最後一次添加的自增的值
-->
<insert id="addUser" parameterType="com.wqy.domain.User">
<selectKey order="AFTER" keyProperty="id" keyColumn="id" resultType="java.lang.Integer">
SELECT last_insert_id();
</selectKey>
INSERT INTO user values (null,#{name},#{age})
</insert>
sqlSession.insert("com.wqy.dao.UserDao.addUser", user);
System.out.println(user.getId());
在執行插入操縱後,可以打印用戶的id
Mybatis輸入類型和結果類型