-
如果属性名和列名不一致,此时就获取不到数据,此时该属性值为null
解决方案:
使用ResultMap对对象和关系(表)做映射操作 -
在mybatis中提供了一套注解来编写sql语句,
@Insert @Update @Delete @Select等
在实际开发中,我们一般都使用xml来配置,而不是使用注解,因为维护成本比较高mybatis中的参数的注解:@Param
解决的问题:
需求:要使用mybatis来实现登录校验
以前的方法的定义方式:
User checkLogin(String username, String password);
但是这样定义之后,mybatis就会报错,因为mybatis在执行sql的时候,只允许传递一个参数
session.selectOne(statementId, 只有一个参数);解决方案:
因为mybatis只接受一个参数,那么我们就把所有的参数封装到一个对象中,然后传递给他方式1:将参数封装到一个对象中:User对象
User checkLogin(User u);
方式2:将参数封装到一个Map集合中:map
User checkLogin(Map<String, Object> map);
方式3:使用@Param注解来解决
User checkLogin(@Param(“name”) String name,@Param(“password”) String password);此时,mybatis会自动的将贴了@Param注解的参数封装到Map集合中
将注解的参数作为map的key, 将参数的值作为map的value
总结:使用该注解解决mapper接口中方法多参数的问题 -
sql的分析:
保存两个在同一部门的员工
保存:
应该先保存one方,先获取到one方的主键
insert into department(name) values(?)
在保存many方:
insert into employee(name, dept_id) values(?,?)
insert into employee(name, dept_id) values(?,?)
查询:
查询many方,然后通过many方获取到one方的信息
select * from employee where id = ?
然后调用员工对象中的get方法获取到部门信息
想要得到部门信息,还需要发送一个额外的sql去查询部门信息
select * from department where id = 上面的查询结果中的dept_id的值 -
问题:在查询所有员工以及员工所在部门的信息的时候,如果有5个员工,员工所在的部门都不一样,那么此时一共会发送5+1条sql,这个问题就称之为 N+1 的问题
这个问题通常是在显示一个员工信息列表的数据,需要同时将关联的对象显示出来,此时就可能会出现N+1的问题
解决思路:问题是因为我们使用的额外的sql去查询关联的数据,所以,我们要解决这个问题,就不能再使用这种方式
解决方案:使用内联查询的方式
发送一条连接查询的sql一次性将锁需要的数据查询出来
select * from employee e left join department d on e.dept_id=d.id注意:在实际开发中,通常是在一个列表中,需要查询出关联数据的时候,使用内连查询的方式来解决,其他的使用额外的sql
-
在association中去映射关联对象的时候,通常column都使用的是别名(d_xxxx)
那么这样在开发中就需要写很多的d_,此时可以使用association中的columnPrefix属性来指定前缀,然后就不需要再具体的列中写前缀(d_) -
保存:
保存员工:
insert into employee(name) values(?)
insert into employee(name) values(?)
保存部门:
insert into department(name) values(?)发送更新的sql将部门编号设置给对应的员工
update employee set dept_id = ? where id = ?
update employee set dept_id = ? where id = ?
查询:
查询到id为1的部门,然后获取到该部门所拥有的员工
select * from department where id = 1
在发送一条sql,根据部门编号去员工表中查询到对应的员工信息
select * from employee where dept_id = 1
将该结果封装到一个list集合中,在设置给Department对象中的emps属性 -
many2many
-
保存:
学生:
insert into student(name) values(?)
insert into student(name) values(?)
老师:
insert into teacher(name) values(?)
insert into teacher(name) values(?)
保存关系数据:
insert into student_teacher values(?, ?)
insert into student_teacher values(?, ?)
insert into student_teacher values(?, ?)
insert into student_teacher values(?, ?)
查询:
查询id为1的学生信息
select * from student where id = 1
根据学生的编号找到对应的老师的信息
select * from teacher where id in(
select teacher_id from student_teacher where student_id = 1
) -
查询操作
-
通过对数据进行排序来说明#和$的区别
在使用#从查询对象中将排序规则取出来的时候,该数据的类型是字符串类型,所以mybatis会自动的自动的在前后加上''
select * from t_user where order by 'salary' DESC
之前在学习排序的时候强调,在排序中如果使用了加了引号的列,那么排序会失效
#{}:首先mybatis会将#{}翻译为一个 ? ,然后在将值设置给对应的占位符, 如果参数的类型是字符串,那么会将其放在一个引号中'xxxxx'
解决思路:
我们想要将用户传递过来的排序规则直接拼接在sql后面
select * from t_user where order by salary DESC
使用$来实现该功能
select * from t_user where order by ${orderBy}
${}:直接将数据取出然后拼接到sql中#{}和${}的选择:
${}:可能会有sql注入的问题,不安全,一般不使用
在需要直接在sql中拼接参数(绝对不能使用用户输入的数据),可以使用
在实际开发中一般都使用#{}
mybatis-02
最新推荐文章于 2022-04-09 16:30:14 发布