MyBatis复习笔记

MyBatis复习笔记

码农世界 2024-05-28 前端 78 次浏览 0个评论

3.Mybatis复习

3.1 xml配置

  • properties:加载配置文件

  • settings:设置驼峰映射

    
      
    
    
  • typeAliases:类型别名设置

    #这样在映射器里面的resultType属性不需要写实体类的全路径名
    
        
    
    
  • mappers 映射器

    • 加载接口,关联映射文件

      
          
      
      

      3.2 getMapper底层

      • 首先调用Proxy.newProxyInstance方法创建Mapper动态代理
      • 动态代理invoke方法里会传入代理对象的方法,通过method.getName()获得方法名,接着使用Xpath解析xml从而获得id=方法名的标签表达式
      • 解析resultType属性值,通过反射技术class.forName(“resultType属性值”)获取到Class对象,通过newInstance()构造返回对象
      • 解析出sql语句,执行,并且查询结果封装到返回对象中

        3.3 SQL语句的CRUD

        • select

          
          
          
        • insert

          
              insert into user values (null ,#{username},#{birthday},#{sex},#{address})
          
          
        • update

          
              update user set username = #{username},birthday=#{birthday},sex=#{sex},address=#{address} where id = #{id}
          
          
        • delete

          
          
              delete from user where id = #{id}
          
          

          3.4 主键自增

          新增一条数据成功后,将这条数据的主键封装到实体类中,并查看主键的值。

          userMapper.saveUser(user);
          //查看新的数据的主键值
          System.out.println(user.getId());//null
          

          使用insert标签的属性useGeneratedKeys,keyProperty,keyColumn实现:

          属性说明
          useGeneratedKeystrue 获取自动生成的主键,相当于select last_insert_id()
          keyColumn表中主键的列名
          keyProperty实体类中主键的属性名
          
                  insert into user values (null ,#{username},#{birthday},#{sex},#{address})
          
          

          3.5 传入多个参数

          步骤一 使用@Param注解注定名称:

          //根据用户名和性别查询
          User queryByUserNameAndSex(@Param("username") String userName, @Param("sex") String sex);
          

          步骤二 在接收参数时,通过指定的名称获取参数值:

          
          

          3.6 Pojo传参

          接口与xml:

          void saveUser(User user);
          
              insert into user values (null ,#{username},#{birthday},#{sex},#{address})
          
          

          底层: sql语句中 #{username}取值 -> 到pojo中调用 getUsername(){}

          3.7 resultMap

          resultMap标签的作用:自定义结果集,自行设置结果集的封装方式

          • 配置resultMap
            id属性:resultMap标签的唯一标识,不能重复,一般是用来被引用的
            type属性:结果集的封装类型
            autoMapping属性:操作单表时,不配置默认为true,如果pojo对象中的属性名称和表中字段名称相同,则自动映射。
            
            
               
               
               
              
            
            
            • 修改select标签的statement中的resultMap

              
              

              4.动态SQL,多表查询,注解开发

              4.1 基本动态SQL标签

              • if标签

                
                  满足条件执行的代码
                
                
              • choose,when,otherwise标签

                choose标签:分支选择(多选一,遇到成立的条件即停止)
                	when子标签:编写条件,不管有多少个when条件,一旦其中一个条件成立,后面的when条件都不执行。
                           test属性:编写ognl表达式
                	otherwise子标签:当所有条件都不满足时,才会执行该条件。
                

                可能优点乱,那来举个例子:

                
                    
                
              • where标签

                标签作用:用于拼接多选一或者同时成立的SQL情况;

                还会根据情况,动态的去掉SQL语句中的AND或者or;

                还是举个例子吧:

                需求: 如果输入了用户名按照用户名进行查询,如果输入住址,按住址进行查询,如果两者都输入,两个条件都要成立

                假如不使用where标签,select标签应该这样:

                
                

                但是,假设用户名username是空,那么用户名的sql语句不参与条件,此时sql语句就会变为:SELECT * FROM user where AND address = #{address}

                那么可以使用where关键字:

                    
                
              • set标签

                set标签:在update语句中,可以自动添加一个set关键字,并且会将动态sql最后多余的逗号去除。

                案例:修改用户信息,如果参数user中的某个属性为null,则不修改。

                因此,set解决了这个问题:

                    
                   
                        update user
                        
                            
                                username = #{username},
                            
                            
                                birthday=#{birthday},
                            
                            
                                sex=#{sex},
                            
                            
                                address=#{address}
                            
                        
                        where id = #{id}
                    
                
              • foreach标签

                主要用来遍历:

                
                   #{元素}
                
                

                例子:

                按照id值是1,2,3来查询用户数据

                
                
                

                注意!!!在mapper接口编写传参时一定要加上@Param(“arrIds”)!!!!

                4.2 一对多查询

                以下例子的表关系如下:

                假如我们要查询用户id为1的订单信息,用户(1)->订单(n),sql语句为:

                select * from tb_user tbu inner join tb_order tbo on tbu.id = tbo.user_id where tbu.id=1
                

                一个用户关联多个订单 User(List orderList) ,在User类中定义一个List集合存储多个订单Order对象。

                编写XML文件:

                    
                    
                        
                        
                        
                        
                        
                            
                            
                        
                    
                    
                    
                

                总结下:

                一对多关系配置:
                1、在对象中添加映射关系;
                2、编写接口方法,编写SQL;
                3、编写resultMap处理数据库字段和实体类之间数据的封装;
                

                4.3 多对多查询

                举个例子:查询订单号为20140921001的订单的详情信息即查询订单信息+订单中的商品信息;

                订单表(n)->订单商品中间表(1)<-商品表(m) SQL大概这样:

                # 【需求】:查询订单号为20140921001的订单的详情信息 订单的详情信息 = 订单+商品
                SELECT
                	*
                FROM
                	tb_order tbo
                INNER JOIN tb_orderdetail detail ON tbo.id = detail.order_id
                INNER JOIN tb_item item ON detail.item_id = item.id
                WHERE
                tbo.order_number = '20140921001';
                

                那具体应该怎么实现呢?

                首秀按,对实体类进行修改,一个订单表中关联了多个订单详情信息,所以在订单表中添加List属性;每一条订单详情记录中都包含了一条商品信息,所以需要在Orderdetail中添加一个Item属性;

                编写xml:

                 
                    
                        
                        
                        
                        
                        
                            
                            
                            
                            
                            
                                
                                
                            
                        
                    
                    
                    
                

                4.4 高级查询总结

                resutlType无法帮助我们自动的去完成映射,所以只有使用resultMap手动的进行映射
                resultMap: 
                	属性:
                        type 结果集对应的数据类型  Order
                        id 唯一标识,被引用的时候,进行指定
                        autoMapping 开启自动映射
                        extends 继承
                	子标签:
                	 id:配置id属性
                	 result:配置其他属性
                      association:配置一对一的映射
                          property 定义对象的属性名
                          javaType 属性的类型
                          autoMapping 开启自动映射
                      collection:配置一对多的映射
                          property 定义对象的属性名
                          javaType 集合的类型
                          ofType 集合中的元素类型 泛型
                  		  autoMapping 开启自动映射
                

                4.5 注解开发

                @Insert:保存  
                         Value:sql语句(和xml的配置方式一模一样)
                         
                @Update:更新 
                         Value:sql语句
                         
                @Delete: 删除
                         Value:sql语句
                         
                @Select: 查询
                         Value:sql语句
                         
                @Options:可选配置(主键回填)
                         userGeneratedKeys:开关,值为true表示可以获取主键  相当于select last_insert_id()
                         keyProperty     :对象属性
                         keyColumn       : 列名
                

转载请注明来自码农世界,本文标题:《MyBatis复习笔记》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,78人围观)参与讨论

还没有评论,来说两句吧...

Top