mybaits參數處理
Mybatis日常業務總我們無論是查詢也好,插入也罷,我們一般都需要將實體的多個屬性值到映射的sql語句中,
比較常見的做法就是將實體屬性封裝到Map中,mybatis會自動從map中取出對應的屬性值構造sql語句。
下面爲實例代碼:
- 實體類
package model;
public class Bloger {
private int id;
private String name;
//這裏需要注意變量的命名規範,因爲實體變量會和sql記錄一一對應,
// 所以不規範的命名方式會導致mybatis執行異常
private String userName;
private int age;
private String email;
public Bloger(){}
public Bloger(int id, String name, String userName, int age, String email) {
this.id = id;
this.name = name;
this.userName = userName;
this.age = age;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "BlogId:"+ getId()+ " BlogName:"+getName()+ " username:" + getUserName();
}
}
- 接口方法
package dao;
import model.Bloger;
import org.apache.ibatis.annotations.Select;
import java.util.Map;
public interface BlogerMapper {
//通過將需要傳輸的屬性值直接封裝到Map中
public Bloger selectBlogerOnMap(Map<String,Object> map);
public void insertBlogerOnMap(Map<String,Object> map);
}
- 映射文件
<?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="dao.BlogerMapper">
<select id="selectBlogerOnMap" resultType="Bloger">
select * from mybatis_test where id =#{id} and user_name=#{userName}
</select>
<!-- 值得注意的是 這裏的參數類型不再是普通的對象,而是map集合 -->
<insert id="insertBlogerOnMap" parameterType="Map">
insert into mybatis_test(name,user_name,age,email)
VALUES (#{name},#{userName},#{age},#{email})
</insert>
</mapper>
- 測試類
package test;
import dao.BlogerMapper;
import model.Bloger;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
public class MybatisDriver {
public static void main(String[] args) throws Exception{
mybatis_insert_onMap();
}
public static SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "source/configuration.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
public static void mybatis_select_onMap() throws Exception{
SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
SqlSession sqlSession=sqlSessionFactory.openSession();
BlogerMapper blogerMapper=sqlSession.getMapper(BlogerMapper.class);
Map<String,Object> map =new HashMap<>();
map.put("userName","wujianqinjian");
map.put("id",14);
//map.put("email","[email protected]");
Bloger bloger=blogerMapper.selectBlogerOnMap(map);
System.out.println(bloger);
sqlSession.close();
}
public static void mybatis_insert_onMap() throws Exception{
SqlSessionFactory sqlSessionFactory =getSqlSessionFactory();
SqlSession sqlSession=sqlSessionFactory.openSession();
BlogerMapper blogerMapper=sqlSession.getMapper(BlogerMapper.class);
Map<String,Object> mapInsert= new HashMap<>();
mapInsert.put("name","樊瑞17號");
mapInsert.put("userName","wujianqinjian18");
mapInsert.put("email","[email protected]");
mapInsert.put("age",43);
blogerMapper.insertBlogerOnMap(mapInsert);
sqlSession.commit();
sqlSession.close();
}
}
總結:我們可以看出Mybatis對傳參方式還是非常靈活的,不緊可以傳單一的基本數據類型,也可以傳對象,另外,還可以傳輸map集合!日常業務中,我們可以根據實際需要,選擇不同的傳參方式!
後續補充:
- 插入不轉義的字符串,在不恰當的位置使用${} 傳參會導致注入風險。
創建了一個技術閒聊羣:有興趣可加我微信,拉你一起討論雜七雜八的技術,雖然大家都不怎麼活躍!
加好友備註:你的博客名 && 隨便給我的任意文章點個贊或留言