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>