栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybaits

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybaits

持久层框架:mybatis(半自动,一般使用于大型项目),hibernate(全自动,适用于小型,简单的项目),spring DataJPA,spring jdbcTemplate(一般不使用)

  • Mybatis框架
    1.什么是mybatis?
    MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Ordinary Java Object,普通的Java对象)映射成数据库中的记录
    2.MyBatis优缺点
    优点:MyBatis几乎避免了所有的jdbc代码,能自动映射,让程序员把精力放在sql语句上,属于半自动的持久层框架,支持定制sql,可以根据需求编写sql语句,也可以自动生成;
    缺点:sql语句多,还是有缺陷的;
    3.MyBatis开发有三种模式:
    3.1:Dao+DaoImpl(不常用)
    3.1.2:mybatis-configs.xml

    
    
    
        
        
        
        
            
                
                
                    
                    
                    
                    
                
            
        
        
        
            
        
    
    

    3.1.3:User.xml

    
    
    
        
            select * from `user` where username = #{username} and `password` = #{password};
        
        
    
            select * from `user` limit #{startRow},#{pageSize}
    
    	
    }
    

    测试类:

    @Test
    public void test7() throws Exception {
      Map map = new HashMap<>();
      Integer pageNo = 2;
      Integer pageSize = 5;
      //map集合的key 是 #{名} value是具体值
      map.put("startRow",(pageNo-1)*pageSize);
      map.put("pageSize",pageSize);
      List list = userDao.getUserByLimit(map);
      for (User user : list) {
        System.out.println(user);
      }
    }
    

    3.2:mapper动态代理开发(重点)
    什么是代理模式?
    用大白话解释就是,程序员不用编写DaoImpl实现类,让MyBatis帮我们就行,那么MyBatis就是一个代理商,帮我们完成实现,体现在代码上就是以后没有daoImpl实现类,只有Dao存在。但是使用代理模式必须满足4个条件:
    1.Dao中的方法名必须和select标签,update,delete,insert标签的id一致;
    2.mapper标签的namespace的值必须是接口的全路径名

    
    

    3.dao方法中的入参的类型必须和select,update,insert标签的parameterType类型一致
    4.dao方法中的返回值类型,必须和select表亲的resultType类型一样
    3.2.1:代码案例
    UserMapper.java

    public interface UserMapper {
        //模糊查询带分页
      public List getUserByLikeWithLimit(@Param("like") String like ,
                                                 @Param("startRow") Integer startRow,
                                                 @Param("pageSize") Integer pageSize);
        //模拟登录
        public User getUserByUserNameAndPassword(@Param("username") String username,
                                                 @Param("password") String password);
        //根据id查询
        public User getUserByUid(Integer uid)throws  Exception;
        ;
        //根据id删除
        public int deleteUserByUid(Integer uid)throws Exception;
    
        //根据id修改
        public int updateUserByUid(User user)throws Exception;
        
        //插入
        public int insertUser(User user)throws Exception;
    
        //模糊查询
        public List getUserByLike(String like)throws Exception;
    
    }
    

    UserMapper.xml

    
    
     
    
      	
        
            select * from `user` where username like concat('%',#{like},'%')
        
    
        
            select
            
             from `user`
                
                    
                        username like concat('%',#{like},'%')
                    
                
                
                    limit #{startRow},#{pageSize}
                
     
    

    3.2.3批量删除

     //批量删除
     public int deletesByUids(int[] ids)throws Exception;
    
    
      delete from `user`
        
          uid in
          
            #{a}
          
        
    
    

    3.2.4主键回填

    
      
    
            insert into `user`(uid,username,`password`,address) values(null,#{username},#{password},#{address})
    
        
    
    @Test
    public void test8() throws Exception {
      SqlSession sqlSession = SqlSessionUtil.getSqlSession();
      UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
      User user = new User();
      user.setUsername("呵呵");
      user.setPassword("123123");
      user.setAddress("上海");
    
      mapper.insertUser(user);
      //在插入成功后 获取 对象的 uid值  这里体现了 主键回填技术
      System.out.println(user.getUid());
    
      sqlSession.commit();
    
      sqlSession.close();
    }
    

    3.3.1:ResultMap标签
    作用1:如果数据库表的字段名和java实体属性名不一致就需要通过resultMap标签来手动映射

    
             
             
             
             
             
    
    
    
      select cid,number,uid from card where number = #{number}
    
    

    UserMapper.xml:

    
      
      
            select * from `user` where uid = #{uid}
        
    
    

    OrderMapper.xml

    
            select * from `order` where uid = #{uid}
        
    
    

    UserMapper.xml

    
    	
        
            select * from `order` where code =#{code}
        
    	//根据多个oid找多个订单
        
            select * from order_product_item opi inner join product p on opi.pid = p.pid
                    where oid=#{oid}
        
    	//根据商品名称查询订单pid 再根据多表itms查对应的oid