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

mybatis整理

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

mybatis整理

1. 简介
  • maven仓库

    
        org.mybatis
        mybatis
        3.5.6
    
    
    
  • 持久化

    持久化就是将程序的数据在持久状态和瞬时状态转化的过程

    为什么需要持久化?

    • 不想丢掉一些对象
    • 内存太贵
2. 第一个Mybatis程序 2.1 搭建环境
  1. 搭建数据库

  2. 搭建项目

    • 新建一个普通maven项目

    • 删除src目录 (父工程)

    • 导入maven依赖

      
          
          
              mysql
              mysql-connector-java
              5.1.47
          
          
          
          
              org.mybatis
              mybatis
              3.5.6
          
          
          
              junit
              junit
              4.12
          
      
      
2.2 创建一个模块
  • 编写mybatis的核心配置文件

    
    
    
    
    
        
            
                
                
                
                    
                    
                    
                    
                
                
            
        
    
        
        
            
        
    
    
    
  • 编写mybatis工具类

    package com.magician.utils;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    // sqlSessionFactory --> sqlSession
    public class MybatisUtils {
        private static SqlSessionFactory sqlSessionFactory;
        static {
            try {
                // 使用mybatis第一步 获取sqlSessionFactory对象
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory  = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        // 获取 SqlSession的实例
        // SqlSession完全包含了面向数据库执行SQL命令所需的所有方法
        public static SqlSession getSqlSession(){
            SqlSession sqlSession = sqlSessionFactory.openSession();
            return sqlSession;
        }
    }
    
    
2.3 编写代码
  • 实体类

    //实体类
    public class User {
        private int id;
        private String name;
        private String pwd;
    }
    
  • Dao接口

    public interface UserDao {
        List getUserList();
    }
    
  • 接口实现类 UserMapper.xml

    
    
    
    
    
        
        
            select * from mybatis.user
        
    
    
    
2.4 测试
  • junit测试

    @Test
    public void test(){
        //第一步:获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
    
        //方式一:getMapper
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List userList = userDao.getUserList();
    
        for (User user : userList) {
            System.out.println(user);
        }
    
        //关闭SqlSession
        sqlSession.close();
    
    }
    
    
3. CRUD
  • namespace中的包名要和Dao/Mapper接口的包名一致

  • select

    //根据id查询用户
    User getUserById(int id);
    
    
        select * from user where id = #{id}
    
    
6. 日志 6.1 日志工厂

如果一个数据库操作出现了异常,我们需要排错,日志就是最好的助手!

曾经:sout、debug

now: 日志工厂

logImpl:

SLF4J| LOG4J|LOG4J2|JDK_LOGGING…

具体使用哪一个日志实现,在设置中设定

STDOUT_LOGGING:标准日志,不用配置


    

6.2 LOG4J
  • 可以定义每一条日志信息的级别
  • 可以控制每一条日志的输出格式
  • 面向百度找操作!

  1. 先导入log4j的包

    
        log4j
        log4j
        1.2.17
    
    
  2. classpath路径下 建立 log4j.properties 文件

  3. 配置log4j为日志的实现

    
    	
    
    
  4. log4j的使用,直接测试运行刚才的查询。

7. 分页

思考:为什么要分页?

  • 较少数据的处理量

使用Limit分页:

SELECT * FROM user limit startIndex, pageSize;

使用mybatis实现分页:

  • 接口

    // 分页查询全部用户
    List getUserByLimit(Map map);
    
  • Mapper.xml

    
        select * from user limit #{startIndex}, #{pageSize}
    
    
  • 测试

    @Test
    public void getUserByLimit(){
    
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
        HashMap map = new HashMap();
        map.put("startIndex", 0);
        map.put("pageSize", 3);
    
        List userList = userMapper.getUserByLimit(map);
    
        for (User user: userList){
        System.out.println(user);
        }
    
        sqlSession.close();
     }
    
8. 使用注解开发 8.1 面向接口编程
  • 根本原因:解耦

关于接口的理解:

  • 接口反映了系统设计人员对系统的抽象理解。
8.2 使用注解开发
// 接口
@Select("select * from user")
List getUsers();

    
    

  • 底层主要应用反射
  • 底层:动态代理

Mybatis详细执行流程:

  1. Resources获取加载全局配置文件
  2. 实例化SqlSessionFactoryBuilder构造器
  3. 解析文件流XMLConfigBuider
  4. SqlSessionFactory实例化
  5. 事务管理器
  6. executor执行器
  7. 创建sqlSession
  8. 实现CRUD [回滚 5]
  9. 查看是否执行成功
  10. 提交事务
  11. 关闭
8.3 注解完成CRUD

工具类创建的时候实现自动提交事务

public static SqlSession getSqlSession(){
    return sqlSessionFactory.openSession(true);
}
public interface UserMapper {

    @Select("select * from user")
    List getUsers();

    //方法存在多个参数,所有参数前面必须加上@Param("id")注解
    @Select("select * from user where id=#{id}")
    User getUserById(@Param("id") int id);

    @Insert("insert into user (id,name,pwd) values(#{id},#{name},#{password})")
    int addUser(User user);

    @Update("update user set name=#{name},pwd=#{password} where id=#{id}")
    int updateUser(User user);

    @Delete("delete from user where id = #{uid}")
    int deleteUser(@Param("uid") int id);
}

关于@Param()注解:

  • 基本类型的参数或者String类型,需要加上
  • 引用类型不需要加
  • 如果只有一个基本类型的话,可以忽略
  • 我们在SQL中引用
10. 多对一的处理
  • 对于学生:关联 多个学生关联一个老师

  • 对于老师:集合 一个老师对应多个学生

  • mybatis-04

  • 查询所有的学生信息以及对应的老师信息

    select * from student, teacher where student.tid = teacher.id;
    

    按照查询嵌套处理:

    
        
        
    
        
        
    
    
    
        select * from teacher where id = #{id}
    
    

    按照结果嵌套处理:

    
        select *
        from teacher
        where id = #{tid}
    
    
        select * from blog where 1=1
        
            and title = #{title}
        
        
            and author = #{author}
        
    
    
    @Test
    public void queryBlogIf(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);
    
        HashMap map = new HashMap();
        map.put("title", "html");
    
        List blogList = blogMapper.queryBlogIF(map);
    
        for (Blog blog : blogList){
            System.out.println(blog);
        }
    }
    

    where元素只会在至少有一个子元素的条件返回SQL子句的情况下才去插入“WHERe”子句,若句子的开头为“AND”或“OR”,where元素也会将他们去除。

    12.2 choose(when, otherwise)
    List queryBlogChoose(Map map);
    
    
        select * from blog
        
            
        
    
    
    13. 缓存
    1. 什么是缓存?
      • 存在内存中的临时数据
      • 将用户经常查询的数据放在缓存中,提高查询效率,解决高并发开发系统的性能问题。
    2. 为什么使用缓存?
      • 减少和数据库交互的次数
      • 提高系统效率
    3. 经常查询并且不经常改变的数据经常使用缓存。
    4. 默认情况下开启一级缓存,二级缓存需要手动开启和配置
    5. 为了提高扩展性,Mybatis定义了Cache
    6. 可清楚策略:
      • LRU 最少使用原则
      • 先进先出原则
    13.1 一级缓存
    • 一级缓存也叫本地缓存
    13.2 二级缓存
    • 二级缓存也叫全局缓存,一级缓存作用域太低,所以诞生了二级缓存

    • 基于namespace级别的缓存,

    • 工作机制:

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

      
      
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/445658.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号