[MyBatis]狂神说Java视频笔记

[MyBatis]狂神说Java视频笔记,第1张

[MyBatis]狂神说Java视频笔记 Mybatis 1.简介
  1. 定义

    • MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    • MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

    • iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

  2. 特点

    • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
    • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足 *** 作数据库的所有需求。
    • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
    • 提供映射标签,支持对象与数据库的orm字段关系映射
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供xml标签,支持编写动态sql。
  3. 补充

    • 持久化:将程序数据在持久状态和瞬时状态间转换的机制
    • 持久层:完成持久化工作的代码块
2.第一个Mybatis程序 1.创建maven项目 2.引入依赖

    org.mybatis
    mybatis
    3.5.2



    mysql
    mysql-connector-java
    5.1.47

3.编写MyBatis核心配置文件
  • mybatis-01srcmainresourcesmybatis-config.xml



    
        
            
            
                
                
                
                
            
        
    

4.编写mybatis工具类
  • mybatis-01srcmainjavacomzcutilsMybatisUtils.java
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //获取SqlSession连接
    public static SqlSession getSession(){
        return sqlSessionFactory.openSession();
    }
}
5.创建实体类
  • mybatis-01srcmainjavacomzcpojoUser.java
public class User {
    private int id;
    private String name;
    private String pwd;
}
6.编写mapper接口
  • mybatis-01srcmainjavacomzcmapperUserMapper.java
public interface UserMapper {
    List selectUsers();
}
7.编写实现mapper接口的xml文件
  • mybatis-01srcmainjavacomzcmapperUserMapper.xml




    
    
    
    select * from user where id = #{id}

  • test

    @Test
    public void selectUserById(){
        SqlSession session = MybatisUtils.getSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        User user = mapper.selectUserById(2);
        System.out.println(user);
        session.close();
    }
    
  • 2.delete
    1. UserMapper.java

      //根据id删除用户
      void delUserById(int id);
      
    2. UserMapper.xml

      
          DELETE FROM user WHERe id = #{id}
      
      
    3. test

      @Test
      public void delUserById(){
          SqlSession session = MybatisUtils.getSession();
          UserMapper mapper = session.getMapper(UserMapper.class);
          mapper.delUserById(3);
          //提交事务
          session.commit();
          session.close();
      }
      
    3.update
    1. UserMapper.java

      //根据id修改用户信息
      void updateUser(User user);
      
    2. UserMapper.xml

      
          UPDATE user set  name=#{name},pwd=#{pwd} where id = #{id}
      
      
    3. test

      @Test
      public void updateUser(){
          SqlSession session = MybatisUtils.getSession();
          UserMapper mapper = session.getMapper(UserMapper.class);
          mapper.updateUser(new User(4,"李白白白白","123456789"));
          session.commit();
          session.close();
      }
      
    4.insert
    1. UserMapper.java

      //添加用户
      void addUser(User user);
      
    2. UserMapper.xml

      @Test
      public void addUser(){
      SqlSession session = MybatisUtils.getSession();
      UserMapper mapper = session.getMapper(UserMapper.class);
      mapper.addUser(new User(3,"张三三三三","123456"));
      mapper.addUser(new User(4,"李三三三三","123456"));
      session.commit();
      session.close();
      }
      
    3. test

      @Test
      public void addUser(){
          SqlSession session = MybatisUtils.getSession();
          UserMapper mapper = session.getMapper(UserMapper.class);
          mapper.addUser(new User(3,"张三三三三","123456"));
          mapper.addUser(new User(4,"李三三三三","123456"));
          session.commit();
          session.close();
      }
      
    5.补充
    • 所有的增删改 *** 作都需要加事务
    6.巧用map
    1. 使用Map传递参数,可以很随意,不需要像传递对象那样,字段一一对应

    2. UserMapper

      //根据id修改用户指定信息
      void updateUser2(Map map);
      
    3. UserMapper.xml

      
          update user set pwd = #{password} where id = #{UserId}
      
      
    4. Test

      @Test
      public void updateUser2(){
          SqlSession session = MybatisUtils.getSession();
      
          UserMapper mapper = session.getMapper(UserMapper.class);
          Map map = new HashMap();
          map.put("UserId",3);
          map.put("password","111111111");
          mapper.updateUser2(map);
          session.commit();
          session.close();
      }
      
    7.模糊查询
    1. UserMapper

      //模糊查询
      List selectUserLike(String value);
      
    2. UserMapper.xml

      
      select id , name , pwd from user
      
      
    3. 上述语句只是简单地将所有的列映射到HashMap的键上,这由resultType属性指定。虽然在大部分情况下都够用,但是HashMap不是一个很好的模型。你的程序更可能会使用JavaBean或POJO(Plain Old Java Objects,普通老式Java对象)作为模型

    4. 手动映射

      1. 返回值类型为:resultMap

        
            SELECT * from user LIMIT #{startIndex},#{pageSize}
        
        
      2. 测试

        @Test
        public void selectUsersByLimit(){
            SqlSession session = MybatisUtils.getSession();
        
            UserMapper mapper = session.getMapper(UserMapper.class);
            Map map = new HashMap();
            map.put("startIndex",2);
            map.put("pageSize",3);
            List userList = mapper.selectUsersByLimit(map);
            for (User user : userList) {
                System.out.println(user);
            }
            session.close();
        }
        
      6.使用注解开发 1.入门
      1. mybatis-04srcmainresourcesmybatis-config.xml

        
        
        
        
            
            
                
                
                    
                    
                    
                    
                        
                        
                        
                        
                    
                
            
        
            
                
            
        
        
      2. mybatis-04srcmainjavacomzcpojoUser.java

        @Alias("user")
        public class User {
            private int id;
            private String name;
            private String pwd;
        }
        
      3. mybatis-04srcmainjavacomzcmapperUserMapper.java

        public interface UserMapper {
            //查询所有用户
            @Select("select * from user")
            List selectUsers();
        }
        
      4. mybatis-04srcmainjavacomzcutilsMybatisUtils.java

        public class MybatisUtils {
            private static SqlSessionFactory sqlSessionFactory;
            static {
                try {
                    String resource = "mybatis-config.xml";
                    InputStream inputStream = Resources.getResourceAsStream(resource);
                    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //获取SqlSession连接
            public static SqlSession getSession(){
                return sqlSessionFactory.openSession(true);
            }
        }
        
      5. 测试

        public class UserMapperTest {
            @Test
            public void test(){
                SqlSession session = MybatisUtils.getSession();
        
                UserMapper mapper = session.getMapper(UserMapper.class);
                List users = mapper.selectUsers();
                for (User user : users) {
                    System.out.println(user);
                }
        
                session.close();
            }
        }
        
      2.CRUD
      1. 通过id查询用户

        • UserMapper

          //通过id查询用户
          @Select("select * from user where id = #{uid}")
          User selectUserById(@Param("uid") int id);
          
      2. 增加一个用户

        • UserMapper

          //增加一个用户
          @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
          int addUser(User user);
          
      3. 删除一个用户

        • UserMapper

          //删除一个用户
          @Delete("delete from user where id = #{id}")
          int delUserById(@Param("id") int id);
          
      4. 修改用户信息

        • UserMapper

          //修改用户信息
          @Update("update user set name = #{name},pwd=#{pwd} where id = #{id}")
          int updateUser(User user);
          
      3.补充:关于@Parma()注解
      • 基本类型的参数或者String类型,建议加上
      • 引用类型不需要加
      • 如果只有一个基本类型的话,可以忽略
      • 在SQL中引用的是@Param()中设定的属性名
      7.一对多 1.环境搭建
      1. 数据库

        CREATE TABLE `teacher` (
        `id` INT(10) NOT NULL,
        `name` VARCHAR(30) DEFAULT NULL,
        PRIMARY KEY (`id`)
        ) ENGINE=INNODB DEFAULT CHARSET=utf8
        
        INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师');
        
        CREATE TABLE `student` (
        `id` INT(10) NOT NULL,
        `name` VARCHAR(30) DEFAULT NULL,
        `tid` INT(10) DEFAULT NULL,
        PRIMARY KEY (`id`),
        KEY `fktid` (`tid`),
        CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
        ) ENGINE=INNODB DEFAULT CHARSET=utf8
        
        
        INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');
        INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1');
        INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');
        INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');
        INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');
        
      2. mybatis-05srcmainresourcesmybatis-config.xml

        
        
        
        
            
            
                
                
                    
                    
                    
                    
                        
                        
                        
                        
                    
                
            
        
            
                
                
        
            
        
        
        
      3. mybatis-05srcmainjavacomzcutilsMyBatisUtils.java

        
        
        
        
            
            
                
                
                    
                    
                    
                    
                        
                        
                        
                        
                    
                
            
        
            
                
                
        
            
        
        
        
      4. mybatis-05srcmainjavacomzcpojoTeacher.java

        @Data
        public class Teacher {
            private int id;
            private String name;
        }
        
      5. mybatis-05srcmainjavacomzcpojoStudent.java

        @Data
        public class Student {
            private int id;
            private String name;
            //多个学生可以是一个老师,即多对一
            private Teacher teacher;
        }
        
      6. mybatis-05srcmainjavacomzcmapperTeacherMapper.java

        public interface TeacherMapper {
        }
        
      7. mybatis-05srcmainjavacomzcmapperStudentMapper.java

        public interface StudentMapper {
        }
        
      8. mybatis-05srcmainresourcesmapperStudentMapper.xml

        
        
        
        
        
        
        
        
      9. mybatis-05srcmainresourcesmapperTeacherMapper.xml

        
        
        
        
        
        
        
        
      2.查询学生数据,多对一查询
      • mybatis-05srcmainjavacomzcmapperStudentMapper.java

        public interface StudentMapper {
        
            //获取所有学生
            public List getStudents();
        
            //获取所有学生2
            public List getStudents2();
        }
        
      1. 第一种:按查询嵌套

        mybatis-05srcmainresourcesmapperStudentMapper.xml

        
        
        
        
        
        
            
            
                select * from teacher where id = #{id}
            
        
        
      2. 第二种:按结果嵌套

        mybatis-05srcmainresourcesmapperStudentMapper.xml

        
            
                SELECT
                    t.id   tid,
                    t.name tname,
                    s.id   sid,
                    s.name sname
                FROM teacher t, student s
                WHERe t.id = s.tid
            
        
            
                
                
                
                    
                    
                    
                
            
        
        
      3. 按查询嵌套处理

        mybatis-06srcmainresourcesmapperTeacherMapper.xml

        
        
        
        
            
            
                SELECT * from student WHERe tid = #{tid}
            
        
        
      4. 小结

        1. 关联-association:用于一对一和多对一
        2. 集合-collection:用于一对多
        3. JavaType和ofType用来指定对象类型
          • JavaType用来指定pojo中属性的类型
          • ofType指定的是映射到list集合属性中pojo类型
      9.动态SQL 1.定义
      • 我们之前写的 SQL 语句都比较简单,如果有比较复杂的业务,我们需要写复杂的 SQL 语句,往往需要拼接,而拼接 SQL ,稍微不注意,由于引号,空格等缺失可能都会导致错误。
      • 那么怎么去解决这个问题呢?这就要使用 mybatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach等标签,可组合成非常灵活的SQL语句,从而在提高 SQL 语句的准确性的同时,也大大提高了开发人员的效率。
      2.环境搭建
      1. mybatis-07srcmainresourcesmybatis-config.xml

        
            
            
        
        
        
            
            
        
        
      2. mybatis-07srcmainjavacomzcpojoBlog.java

        @Data
        public class Blog {
            private String id;
            private String title;
            private String author;
            private Date createTime;
            private int views;
        }
        
      3. mybatis-07srcmainjavacomzcutilsIDUtil.java

        public class IDUtil {
            //获取随机id
            public static String getId(){
                return UUID.randomUUID().toString().replaceAll("-","");
            }
        }
        
      4. mybatis-07srcmainjavacomzcutilsMyBatisUtils.java

      5. mybatis-07srcmainjavacomzcmapperBlogMapper.java

        public interface BlogMapper {
        }
        
      6. mybatis-07srcmainresourcesmapperBlogMapper.xml

        
        
        
        
        
        
        
      3.IF
      1. mybatis-07srcmainjavacomzcmapperBlogMapper.java

        public interface BlogMapper {
        
            //查询博客信息
            List queryBlogIF(Map map);
        }
        
      2. mybatis-07srcmainresourcesmapperBlogMapper.xml

        
        
        
        
        
        
            
            select *
            from mybatis.blog
            
                
                    title = #{title}
                
                
                    AND author = #{author}
                
            
        
        
        

      5.set

      1. set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)

      2. mybatis-07srcmainresourcesmapperBlogMapper.xml

        
            update blog
            
                
                    title = #{title},
                
                
                    author = #{author}
                
            
            where id = #{id};
        
        

      6.Choose

      1. 有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

      2. mybatis-07srcmainresourcesmapperBlogMapper.xm

        
            select *
            from mybatis.blog
            
                 
                
            
        
        
      6.Foreach
      1. foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符,看它多智能!

      2. 提示: 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

      3. mybatis-07srcmainresourcesmapperBlogMapper.xm

        
        
      10.缓存 1.什么是缓存
      • 存在内存中的临时数据。
      • 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询。从缓存中查询,可以提高查询效率,解决了高并发系统的性能问题。
      2.为什么使用缓存
      • 减少和数据库的交互次数,减少系统开销,提高系统效率。
      3.什么样的数据能使用缓存
      • 经常查询并且不经常改变的数据
      4.MyBatis缓存
      • MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。

      • MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存

        • 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)
        • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
        • 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存
      5.一级缓存

      一级缓存也叫本地缓存:

      • 与数据库同一次会话期间查询到的数据会放在本地缓存中。
      • 以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库;
      6.二级缓存
      • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存

      • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存;

      • 工作机制

      • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;

        • 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
        • 新的会话查询信息,就可以从二级缓存中获取内容;
        • 不同的mapper查出的数据会放在自己对应的缓存(map)中;

      欢迎分享,转载请注明来源:内存溢出

      原文地址: http://outofmemory.cn/zaji/5697439.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-12-17
    下一篇 2022-12-17

    发表评论

    登录后才能评论

    评论列表(0条)

    保存