大数据WEB阶段Mybatis(一)

Mybatis(一)

零、目录

  • Mybatis介绍
  • Mybatis入门案例
  • 增删改查练习
  • 映射文件中取值问题
  • Mybatis中单值传递和多值传递问题
  • sql语句的复用
  • 别名标签
  • 动态更新
  • 动态查询
  • 动态插入
  • 批量删除

一、Mybatis介绍

  1. Mybatis是一款优秀的数据持久层框架
  2. Mybatis内部也是JDBC原理
  3. 回顾JDBC缺点:
    1. 需要频繁的开关数据库连接
    2. 查询的结果需要手动进行封装
    3. JDBC中内有缓存机制
    4. SQL语句写在java代码中
  4. mybatis优点:
    1. 内置数据库连接池
    2. 会自动进行结果集封装
    3. 自带缓存机制
    4. SQL语句写在配置文件中
  5. mybatis工作流程 :大数据WEB阶段Mybatis(一)_第1张图片

二、 Mybatis入门案例

  1. 导入约束文件
    1. 如果你的电脑有网就不用导入了 , 在使用时会自动下载
    2. 如果你的机器没网 , 需要手动导入mybatis-3-mapper.dtd文件和mybatis-3-config.dtd文件
    3. 注意导入时 , 需要约束文件在不含中文的路径下 , keyType选择URI , key填写如:http://mybatis.org/dtd/mybatis-3-mapper.dtd 。大数据WEB阶段Mybatis(一)_第2张图片
  2. 导入响应的jar包大数据WEB阶段Mybatis(一)_第3张图片
  3. 添加配置文件

    1. 日志文件log4j.properties , 不需要改动直接复制即可

      log4j.rootLogger=DEBUG, Console
      #Console
      log4j.appender.Console=org.apache.log4j.ConsoleAppender
      log4j.appender.Console.layout=org.apache.log4j.PatternLayout
      log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
      log4j.logger.java.sql.ResultSet=INFO
      log4j.logger.org.apache=INFO
      log4j.logger.java.sql.Connection=DEBUG
      log4j.logger.java.sql.Statement=DEBUG
      log4j.logger.java.sql.PreparedStatement=DEBUG
      
    2. mybatis核心配置文件

      
      
      
      
      
          
      
      
          
              
                  
                  
                  
                  
                      
                      
                      
                      
                      
                  
              
      
              
                  
                  
                      
                      
                      
                      
                  
              
          
      
      
          
          
              
              
          
      
      
      
    3. 实体类对应的映射文件(该文件一般由逆向工程通过数据库配置自动生成实体类和对应的映射文件 , 不需要手动写)

      
      
      
           select * from  user
          
          
              insert into user(name , age) values( #{name} , #{age});
             
          
              delete from user where id=#{id};
          
          
              update user set name=#{name} , age = #{age} where id=#{id}; 
          
          
          
      
      
  4. 测试代码:

    private SqlSession session ;
    @Before
    public void init() throws IOException{
        //获取一个数据流
        InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
        //创建一个工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //创建一个会话
        session = factory.openSession(true);//true表示自动提交 , 默认为false , 需要手动提交
    }
    
    @Test
    public void testFindAll() throws IOException{
        //执行sql语句
        List users = session.selectList("UserMapper.findAll");
        System.out.println(users.get(0));
    }
    

三、增删改查练习

  1. 以下案例测试之前先创建会话

        private SqlSession session ;
            @Before
            public void init() throws IOException{
                //获取一个数据流
                InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
                //创建一个工厂
                SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
                //创建一个会话
                session = factory.openSession(true);//true表示自动提交 , 默认为false , 需要手动提交
            }
    
    1. 映射文件中添加:

      
              insert into user(name , age) values( #{name} , #{age});
             
      
    2. 测试:

      @Test
          public void insertUser() {
              User user = new User();
              user.setName("李四");
              user.setAge(20);
              //執行sql語句
              session.insert("UserMapper.insert", user);
              //提交增删改时都需要commit , 可以在opensession时添加参数为true设置文 自动提交
              session.commit();
          }
      
    1. 映射文件中添加:

      
              delete from user where id=#{id};
          
      
    2. 测试:

      @Test
          public void delete() throws IOException{
              //执行session
              session.delete("UserMapper.delete",3);
          }
      
    1. 映射文件中添加:

      
              update user set name=#{name} , age = #{age} where id=#{id}; 
          
      
    2. 测试:

      @Test
          public void updateUser(){
              //修改之前先获取到原数据
              User user = new User();
              user.setId(1);
              user.setName("张三");
              user.setAge(19);
      
              //对数据进行修改
              user.setName("王五");
              //执行数据库更新操作
              session.update("UserMapper.update", user);
          }
      
    1. 映射文件中添加:

      
      
    2. 测试:

      @Test
          public void testFindAll() throws IOException{
              //执行sql语句
              List users = session.selectList("UserMapper.findAll");
              System.out.println(users.get(0));
          }
      

四、映射文件中的取值符号

  1. #{变量名称} : 会在与sql语句拼接时自动加上引号, 并且有预编译的效果 , 可以防止sql注入攻击
  2. ${变量名称} : 在于sql语句拼接时不会添加引号 , 直接拼接在sql语句中
  3. 使用两种取值方式的选择:
    1. 绝大多数情况下使用#{} , 在传入的值为表的字段(如: order by 使 {} , 否则会失效)或者是sql语句的一部分时(如: order by id |使 {} , 否则会生效
    2. 能使用#{}绝不使用{} , 不能使用#{}时才使用{} .

五、Mybatis映射文件的多值传递和单值传递

  1. Mybatis中提供的增删改查方法只支持传递一个参数代表传入的值

    1. 当需要传递多个 值时, 可以将值放入map中 ;

      1. Mapper文件中:

        
        
      2. 测试:

        //多值传递      查询所有用户并按照年龄 降序排列
            @Test 
            public void findAllOrderByAgeDesc(){
                Map map = new HashMap();
                map.put("type", "age");
                map.put("paixu", "desc");
                List users = session.selectList("UserMapper.finfAllByOrderDesc" , map);
                for(User user : users){
                    System.out.println(user);
                }
        
            }
        
    2. 当传递一个值的时候 ,映射文件中取值时可以以任意变量名取值 。

      1. Mapper文件中:

        
        
      2. 测试:

        //单值传递
        @Test
        public void findByName(){
            User user = session.selectOne("UserMapper.findByName", "王五");
            System.out.println(user);
        }
        

六、 sql语句的复用

  1. 声明一个基本的sql语句 , 以便在后续的使用时直接调用
  2. 声明:

     select * from  user
    
  3. 调用:

    
    

七、别名标签

  1. 在映射文件中写resultType或者是paramType时需要写的是全类名 , 一般xxx.xxx.xxx.xxx.xxx.类名 都会很长 , 很容易写错 , 可以指定类别名以简化书写
  2. 在核心配置文件中配置别名

        
        
            
        
    
  3. 使用

        
    

八、 动态更新

  1. 当进行数据库修改的时候 ,有时只需要修改表中的某几个字段 , 其他字段保持不变 , 这是就需要用到动态更新 , 不然会出现其他值为null的问题 。
  2. 映射文件中sql语句的修改

    
        
    
  3. 注意: 字段后的“,” , 如果age为空 , set标签会自动把name属性后的“,”去掉

九、 动态查询

  1. 查询需要多个条件 , 但是不一定每一个条件都用的上 , 在数据封装时就会出现null值的情况 , 如果被sql指定势必会影响到sql 的查询结果 , 这是就需要用到动态查询 , 不然会出现满足条件为null的判断。
  2. 映射文件中sql语句的修改

        
            
    
  3. 注意: and加在字段前 , 当name字段为null时 , where标签会自动去掉age前的and 。

十、 动态插入

  1. 映射文件中sql语句的修改:

        
            
                insert into user 
                
                    name 
                     age 
                
                values
                
                    name = #{name} ,  
                     age = #{age} 
                
            
    

十一、批量删除

  1. 数组中存放要删除元素的id

        
            
                delete form user where id in
                 separator=",">
                    #{id}
                 
            
    
  2. 列表中存放要删除的元素

    
        
            delete form user where id in
            
                #{user.id}
             
        
    

你可能感兴趣的:(WEB,大数据)