MyBatis学习(二)--MyBatis获取参数值的两种方式

1、搭建新的module:mybatis_parameter

MyBatis获取参数值的两种方式:${}#{}

${}的本质就是字符串拼接,采用sql拼接,无法防止sql注入

#{}的本质就是占位符赋值 ,采用预编译 防止sql注入

不同参数使用案例

2、单个字面量类型的参数  int i = 1;

如果mapper接口中的方法参数为单个的字面量类型,此时可以使用#{}${}以任意的名称获取参数的值,如果使用${},注意需要手动添加单引号。

select * from user where username = #{username};
打印结果:Preparing: select * from user where username = ?;
select * from user where username = '${username}';
打印结果:Preparing: select * from user where username = 'qqq'

#方式可以防止SQL注入

//$的不加单引号会如下报错
select * from user where username = ${username};
Unknown column 'qqq' in 'where clause'
3、多个字面量类型的参数

如果mapper接口中的方法参数为多个时,此时MyBatis会自动将这些参数放在一个map集合(keyvalue)中,以arg0, arg1...为键,以参数为值;或者以param1, param2...为键,以参数为值。因此只需要通过#{}${}访问map集合的键就可以获取相对于的值,如果使用${},注意需要手动添加单引号。

//验证账号密码是否正确
User checkLogin(String username,String password);

//对应sql语句
select * from user where username = #{arg1} and password = #{arg0}
select * from user where username = #{param1} and password = #{param2}
select * from user where username = '${arg1}' and password = '${arg0}'
select * from user where username = '${param1}' and password = '${param2}'
4、map集合类型的参数

如果mapper接口中的方法参数为多个时,此时可以手动创建一个map集合,将这些参数放在map集合中,只需要通过#{}${}访问map集合的键(自己定义的键)就可以获取相对于的值,如果使用${},注意需要手动添加单引号。

//使用Map验证登录
User checkLoginByMap(Map<String,Object> map);

//对应测试类
@Test
public void testCheckLoginMap(){
    Map<String,Object> map = new HashMap<>();
    map.put("username","qqq");
    map.put("password","456");
    User user = mapper.checkLoginByMap(map);
    System.out.println(user);
}

正确写法(要写自己创建的key)

select * from user where username = #{username} and password = #{password}

对应正确结果

否则返回结果为空

select * from user where username = #{param1} and password = #{param1}

返回结果:null

5、实体类类型的参数  用的较多

如果mapper接口中的方法参数为实体类对象时,此时可以使用#{}${},通过访问实体类对象中的属性名称获取属性值,如果使用${},注意需要手动添加单引号

//向User表插入用户信息
int insertUser(User user);

//对应sql语句
insert into user values(null,#{username},#{password},#{age},#{sex},#{email})
6、使用@Param标识参数

可以通过@Param注解标识mapper接口中的方法参数,此时MyBatis会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以param1,param2...为键,以参数为值;只需要通过#{}${}访问map集合的键就可以获取相对于的值,如果使用${},注意需要手动添加单引号。

//通过Param验证登录信息正确性
User checkLoginByParam(@Param("username") String username,@Param("password")String password);

//对应sql
//@Param注解的value属性值为键,以参数为值
select * from user where username = '${username}' and password = '${password}'
//以param1,param2...为键,以参数为值
select * from user where username = '${param1}' and password = '${param2}'

错误写法:

select * from user where username = #{aaa} and password = #{bbb}
提示信息:
 Parameter 'aaa' not found. Available parameters are [password, param1, username, pa

MyBatis-Plus是MyBatis的增强工具,提供了很多实用的功能,其中包括对关联查询的支持。MyBatis-Plus的关联查询主要通过Wrapper对象来实现,下面就来详细介绍一下MyBatis-Plus的关联查询的使用方法。 1. 基本概念 在使用MyBatis-Plus的关联查询之前,我们需要先了解一些基本概念。 1.1. 实体类 实体类是指与数据库表对应的Java类。在使用MyBatis-Plus的关联查询时,我们需要定义实体类,并在实体类中定义与其他表关联的属性。 1.2. Wrapper对象 Wrapper对象是MyBatis-Plus中用于构建SQL语句的查询条件对象,可以通过Wrapper对象实现关联查询。 1.3. QueryWrapper QueryWrapper是Wrapper的一种实现,用于构建查询条件。它可以通过链式调用的方式来构建查询条件,支持多种查询方式,包括等于、不等于、大于、小于、模糊查询等。 1.4. LambdaQueryWrapper LambdaQueryWrapper是QueryWrapper的一种升级版,它支持使用Lambda表达式来构建查询条件,使用起来更加简单、方便。 2. 关联查询的使用方法 了解了基本概念之后,下面就来介绍一下MyBatis-Plus的关联查询的使用方法。 2.1. 一对一关联查询 一对一关联查询是指两张表之间的关联关系是一对一的,例如用户表和身份证表之间的关联关系。 在MyBatis-Plus中,一对一关联查询可以通过selectJoin方法来实现。例如,查询用户表和身份证表中的所有数据,可以使用如下代码: ``` List<User> userList = userMapper.selectJoin(null); ``` 其中,userMapper是MyBatis的Mapper接口,User是用户表对应的实体类。在selectJoin方法中传入的参数为null,表示查询所有数据。 如果需要在查询时指定查询条件,可以通过QueryWrapper或LambdaQueryWrapper来构建查询条件,例如: ``` QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("user_name", "张三"); List<User> userList = userMapper.selectJoin(wrapper); ``` 上述代码中,使用QueryWrapper构建了一个查询条件,查询条件为用户名为“张三”,然后调用selectJoin方法来查询数据。 2.2. 一对多关联查询 一对多关联查询是指两张表之间的关联关系是一对多的,例如用户表和订单表之间的关联关系。 在MyBatis-Plus中,一对多关联查询可以通过selectList方法来实现。例如,查询用户表和订单表中的所有数据,可以使用如下代码: ``` List<User> userList = userMapper.selectList(null); for (User user : userList) { List<Order> orderList = user.getOrderList(); // 处理订单数据 } ``` 在查询用户表数据时,通过getUserList方法获取到了用户对应的订单数据,然后可以对订单数据进行处理。 如果需要在查询时指定查询条件,可以通过QueryWrapper或LambdaQueryWrapper来构建查询条件,例如: ``` QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("user_name", "张三"); List<User> userList = userMapper.selectList(wrapper); ``` 上述代码中,使用QueryWrapper构建了一个查询条件,查询条件为用户名为“张三”,然后调用selectList方法来查询数据。 2.3. 多对多关联查询 多对多关联查询是指两张表之间的关联关系是多对多的,例如学生表和课程表之间的关联关系。 在MyBatis-Plus中,多对多关联查询需要通过中间表来实现。假设学生表和课程表之间的关联关系是通过中间表“学生课程表”来实现的,那么学生表和课程表中的所有数据可以使用如下代码: ``` List<Student> studentList = studentMapper.selectList(null); for (Student student : studentList) { List<Course> courseList = student.getCourseList(); // 处理课程数据 } ``` 在查询学生表数据时,通过getCourseList方法获取到了学生所选的课程数据,然后可以对课程数据进行处理。 如果需要在查询时指定查询条件,可以通过QueryWrapper或LambdaQueryWrapper来构建查询条件,例如: ``` QueryWrapper<Student> wrapper = new QueryWrapper<>(); wrapper.eq("student_name", "张三"); List<Student> studentList = studentMapper.selectList(wrapper); ``` 上述代码中,使用QueryWrapper构建了一个查询条件,查询条件为学生名为“张三”,然后调用selectList方法来查询数据。 3. 总结 MyBatis-Plus的关联查询主要通过Wrapper对象来实现,支持一对一、一对多和多对多关联查询。在使用关联查询时,需要定义实体类,并在实体类中定义与其他表关联的属性。同时,可以通过QueryWrapper或LambdaQueryWrapper来构建查询条件,在查询时指定查询条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值