mybatis-02

1 篇文章 0 订阅
  1. 如果属性名和列名不一致,此时就获取不到数据,此时该属性值为null

    解决方案:
            使用ResultMap对对象和关系(表)做映射操作

  2.  

     

     

    在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接口中方法多参数的问题

  3. 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的值

  4.  

     

     

    问题:在查询所有员工以及员工所在部门的信息的时候,如果有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

  5. 在association中去映射关联对象的时候,通常column都使用的是别名(d_xxxx)
    那么这样在开发中就需要写很多的d_,此时可以使用association中的columnPrefix属性来指定前缀,然后就不需要再具体的列中写前缀(d_)

  6. 保存:
        保存员工:
         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属性

  7. many2many

  8. 保存:
         学生:
         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
         )

  9. 查询操作

  10. 通过对数据进行排序来说明#和$的区别

    在使用#从查询对象中将排序规则取出来的时候,该数据的类型是字符串类型,所以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中拼接参数(绝对不能使用用户输入的数据),可以使用
          在实际开发中一般都使用#{}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值