mybatis的參數傳遞java
主要的參數傳遞分爲:sql
1.一個普通數據類型apache
當一個方法中只有一個普通數據類型。在mapper配置文件中能夠使用#{}佔位符來進行佔位輸出。session
#{} 佔位符中,能夠寫參數的 #{變量名}。 也能夠寫 #{value}。mybatis
2.多個普通數據類型app
多個普通的參數。當咱們須要使用 #{} 佔位輸出的時候,能夠使用ui
param1,param2 …… paramNspa
也就是 #{param1} …… #{paramN}code
或者使用@Param命名參數xml
3.Map對象
當咱們的參數爲map對象的時候。咱們能夠使用 map對象的key來作爲佔位符,輸出數據。
#{map的key} 來作爲佔位符的輸出
4.一個pojo數據類型
當方法的參數是一個複雜類型的對象的時候。咱們能夠使用 對象的屬性名。當成佔位符的名稱。好比:#{ 屬性名 }
5.多個pojo數據類型
當有多個複雜pojo對象作爲參數傳遞給方法使用時候。咱們要取出數據作爲sql的參數。能夠使用以下方式:
#{param1.屬性名}
……
#{paramN.屬性名}
也能夠使用@Param命名參數。給每一個pojo對象起一個別名。而後再經過 #{別名.屬性名} 的方式取出數據值作爲參數使用。
package com.mapper.test; import static org.junit.Assert.*; import java.util.HashMap; import java.util.Map; import org.apache.ibatis.io.Resources; import org.apache.ibatis.jdbc.SQL; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.BeforeClass; import org.junit.Test; import com.mapper.UserMapper; import com.pojo.User; public class UserMapperTest { static SqlSessionFactory sqlSessionFactory; @BeforeClass public static void setUpBeforeClass() throws Exception { sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources .getResourceAsStream("mybatis-config.xml")); } @Test public void testQueryUserById() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper mapper = session.getMapper(UserMapper.class); System.out.println(mapper.queryUserById(1)); } finally { session.close(); } } @Test public void testQueryUsersByNameOrSex() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper mapper = session.getMapper(UserMapper.class); mapper.queryUsersByNameOrSex("bbb", 1).forEach(System.out::println); } finally { session.close(); } } @Test public void testQueryUsersByMap() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper mapper = session.getMapper(UserMapper.class); Map<String, Object> paramMap = new HashMap<String, Object>(); paramMap.put("name", "bbb"); paramMap.put("sex", 1); mapper.queryUsersByMap(paramMap).forEach(System.out::println); } finally { session.close(); } } @Test public void testUpdateUser() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper mapper = session.getMapper(UserMapper.class); mapper.updateUser(new User(9, "aaa", 1)); session.commit(); } finally { session.close(); } } @Test public void testQueryUsersByTwoUsers() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper mapper = session.getMapper(UserMapper.class); mapper.queryUsersByTwoUsers(new User(null, "bbb", null), new User(null, null, 1)).forEach(System.out::println); } finally { session.close(); } } @Test public void testQueryUsersLikeName() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper mapper = session.getMapper(UserMapper.class); String name = "bb"; mapper.queryUsersLikeName(name).forEach(System.out::println); } finally { session.close(); } } }
<?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="com.mapper.UserMapper"> <!-- public User queryUserById(Integer id); 當方法的參數類型是一個普通數據類型的時候, 那麼sql語句中配置的佔位符裏,能夠寫上參數名:#{id} --> <select id="queryUserById" resultType="com.pojo.User"> select id,last_name lastName,sex from t_user where id = #{id} </select> <!-- /** --> <!-- * 根據用戶名和性別查詢用戶信息 --> <!-- */ --> <!-- public List<User> queryUsersByNameOrSex(String name, Integer sex); 當方法參數是多個普通類型的時候。咱們須要在佔位符中寫入的可用值是:0,1,param1,param2 0 表示第一個參數(不推薦使用) 1 表示第二個參數 (不推薦使用) param1 表示第一個參數(推薦使用) param2 表示第二個參數(推薦使用) paramN 表示第n個參數(推薦使用) --> <!-- <select id="queryUsersByNameOrSex" resultType="com.pojo.User"> --> <!-- select id,last_name lastName,sex from t_user where last_name = #{param1} or sex = #{param2} --> <!-- </select> --> <!-- public List<User> queryUsersByNameOrSex(@Param("name") String name, @Param("sex") Integer sex); 當方法有多個參數的時候,咱們能夠使用mybatis提供的註解@Param來對方法的參數進行命名。 全名以後的使用。以下: @Param("name") String name ====使用>>>> #{name} @Param("sex") Integer sex ====使用>>>> #{sex} 使用了@Param以後,原來的0,1就不能再使用了。 可是Param1,和param2,能夠使用。 --> <select id="queryUsersByNameOrSex" resultType="com.pojo.User"> select id,last_name lastName,sex from t_user where last_name = #{0} or sex = #{1} </select> <!-- /** --> <!-- * 但願Map中傳入姓名和性別信息,以作爲查詢條件。 --> <!-- */ --> <!-- public List<User> queryUsersByMap(Map<String, Object> paramMap); 當咱們方法的參數類型是Map類型的時候,注意。 在配置的sql語句的佔位符中寫的參數名必定要和Map的key一致對應。 last_name = #{name} <<<<========>>> paramMap.put("name","bbb"); sex = #{sex} <<<<========>>> paramMap.put("sex",1); --> <select id="queryUsersByMap" resultType="com.pojo.User"> select id,last_name lastName,sex from t_user where last_name = #{name} or sex = #{sex} </select> <!-- public int updateUser(User user) 若是傳入的參數是一個javaBean的時候,佔位符中,要寫上javaBean的屬性名。 JavaBean屬性 sql中的佔位符 private Integer id; #{id} private String lastName; #{lastName} private Integer sex; #{sex} --> <update id="updateUser" parameterType="com.pojo.User"> update t_user set last_name=#{lastName}, sex=#{sex} where id=#{id} </update> <!-- /** --> <!-- * 要求使用第一個User對象的lastName屬性,和第二個User對象的sex屬性來查詢用戶信息。 --> <!-- */ --> <!-- public List<User> queryUsersByTwoUsers(User name,User sex); 若是你是多個JavaBean類型的時候,第一個參數是param1,第二個參數是param2.以此類推第n個參數就是paramN 固然你也能夠使用@Param來規定參數名。 若是你想要的只是參數對象中的屬性,而須要寫成爲以下: #{參數.屬性名} last_name ======== #{param1.lastName} sex ========= #{param2.sex} --> <select id="queryUsersByTwoUsers" resultType="com.pojo.User"> select id,last_name lastName,sex from t_user where last_name = #{param1.lastName} or sex = #{param2.sex} </select> <!-- /** --> <!-- * 根據給定的名稱作用戶名的模糊查詢 --> <!-- */ --> <!-- public List<User> queryUsersLikeName(String name); #{} 是佔位符 ${} 是把參數的值原樣輸出到sql語句中,而後作字符串的拼接操做 --> <select id="queryUsersLikeName" resultType="com.pojo.User"> select id,last_name lastName,sex from t_user where last_name like concat('%',#{name},'%') </select> </mapper>