MyBatis获取参数值的两种方式:
${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引 号;
但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
正常情况下最好是使用#{}的方式,因为这种方式是以占位符的方式替换,可以避免sql注入,但是这种方式会自动加上单引号
而有的时候时候字段是不能加单引号的,就必须用${}
1、单个字面量类型的参数
若mapper接口中的方法参数为单个的字面量类型 此时可以使用${}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号
2、多个字面量类型的参数
若mapper接口中的方法参数为多个时 此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;以 param1,param2...为键,以参数为值;
因此只需要通过${}和#{}访问map集合的键就可以获取相对应的 值,注意${}需要手动加单引号
3、map集合类型的参数
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中 只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号
4、实体类类型的参数
若mapper接口中的方法参数为实体类对象时 此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号
5、使用@Param标识参数
可以通过@Param注解标识mapper接口中的方法参数 此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以 param1,param2...为键,以参数为值;
只需要通过${}和#{}访问map集合的键就可以获取相对应的值, 注意${}需要手动加单引号
这几种接收参数的形式,只需要掌握几种种就可以了,
第一种实体类的方式,访问实体类对象中的属性名获取属性值
//第二种map的方式,当多表查询的时候,字段不可能跟实体类中的字段相同,map的方式无须跟实体类的属性相同,以键值对的形式存入map集合
第三种使用@Param注解,注解中填的什么key 就#{key}${key}取值
6.实例
mapper接口
public interface ParameterMapper { /** * 验证登录(使用@Param) */ User checkLoginByParam(@Param("username") String username, @Param("password") String password); /** * 添加用户信息 */ int insertUser(User user); /** * 验证登录(参数为map) */ User checkLoginByMap(Map<String, Object> map); /** * 验证登录 */ User checkLogin(String username, String password); /** * 根据用户名查询用户信息 */ User getUserByUsername(String username); /** * 查询所有的员工信息 */ List<User> getAllUser(); }
mapper映射文件
<?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.atguigu.mybatis.mapper.ParameterMapper"> <!--List<User> getAllUser();--> <select id="getAllUser" resultType="User"> select * from t_user </select> <!--User getUserByUsername(String username);--> <select id="getUserByUsername" resultType="User"> <!--select * from t_user where username = #{username}--> select * from t_user where username = '${username}' </select> <!--User checkLogin(String username, String password);--> <select id="checkLogin" resultType="User"> <!--select * from t_user where username = #{arg0} and password = #{arg1}--> select * from t_user where username = '${param1}' and password = '${param2}' </select> <!--User checkLoginByMap(Map<String, Object> map);--> <select id="checkLoginByMap" resultType="User"> select * from t_user where username = #{username} and password = #{password} </select> <!--int insertUser(User user);--> <insert id="insertUser"> insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email}) </insert> <!--User checkLoginByParam(@Param("username") String username, @Param("password") String password);--> <select id="checkLoginByParam" resultType="User"> select * from t_user where username = #{username} and password = #{password} </select> </mapper>
测试
public class ParameterMapperTest { /** * MyBatis获取参数值的两种方式:${}和#{} * ${}本质字符串拼接 * #{}本质占位符赋值 * MyBatis获取参数值的各种情况: * 1、mapper接口方法的参数为单个的字面量类型 * 可以通过${}和#{}以任意的名称获取参数值,但是需要注意${}的单引号问题 * 2、mapper接口方法的参数为多个时 * 此时MyBatis会将这些参数放在一个map集合中,以两种方式进行存储 * a>以arg0,arg1...为键,以参数为值 * b>以param1,param2...为键,以参数为值 * 因此只需要通过#{}和${}以键的方式访问值即可,但是需要注意${}的单引号问题 * 3、若mapper接口方法的参数有多个时,可以手动将这些参数放在一个map中存储 * 只需要通过#{}和${}以键的方式访问值即可,但是需要注意${}的单引号问题 * 4、mapper接口方法的参数是实体类类型的参数 * 只需要通过#{}和${}以属性的方式访问属性值即可,但是需要注意${}的单引号问题 * 5、使用@Param注解命名参数 * 此时MyBatis会将这些参数放在一个map集合中,以两种方式进行存储 * a>以@Param注解的值为键,以参数为值 * b>以param1,param2...为键,以参数为值 * 因此只需要通过#{}和${}以键的方式访问值即可,但是需要注意${}的单引号问题 */ @Test public void testCheckLoginByParam(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); User user = mapper.checkLoginByParam("admin", "123456"); System.out.println(user); } @Test public void testInsertUser(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); int result = mapper.insertUser(new User(null, "李四", "123", 23, "男", "[email protected]")); System.out.println(result); } @Test public void testCheckLoginByMap(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); Map<String, Object> map = new HashMap<>(); map.put("username", "admin"); map.put("password", "123456"); User user = mapper.checkLoginByMap(map); System.out.println(user); } @Test public void testCheckLogin(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); User user = mapper.checkLogin("admin", "123456"); System.out.println(user); } @Test public void testGetUserByUsername(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); User user = mapper.getUserByUsername("admin"); System.out.println(user); } @Test public void testGetAllUser(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); List<User> list = mapper.getAllUser(); list.forEach(user -> System.out.println(user)); } @Test public void testJDBC() throws Exception { String username = "admin"; Class.forName(""); Connection connection = DriverManager.getConnection("", "", ""); //PreparedStatement ps = connection.prepareStatement("select * from t_user where username = '" + username + "'"); PreparedStatement ps = connection.prepareStatement("selelt * from t_user where username = ?"); ps.setString(1, username); } }
标签:username,map,ParameterMapper,mapper,获取,参数,user,MyBatis,参数值 From: https://www.cnblogs.com/dzs894330350/p/16726938.html