Mybatis

Mybatis,第1张

Mybatis

目录
    • 1、概述
    • 2、JDBC编程问题
    • 3、MyBatis架构
    • 4、MyBatis环境搭建
      • 导入MyBatis 的jar包数据库驱动包
      • 设置log4j的配置文件:
      • 创建MyBatis全局配置文件
      • 创建映射文件
      • 插入数据
      • 修改数据
      • 删除数据
      • 查询数据
      • 其他查询
      • Mybatis-Dao 层 Mapper 接口
    • 测试MyBatis
    • 5、 Mybatis日志
    • 6、参数传递
    • 7、结果处理
    • 返回简单基本类型
    • POJO对象输出映射
    • 定义resultMap
    • 8、多表关联处理结果集
    • 懒加载
    • 9、注解方式
    • 10、Mybatis动态SQL
    • 11、特殊符号处理
    • 为什么使用缓存?
    • 一级缓存
    • 二级缓存

1、概述

原始Apache的一个开源项目iBatis,2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code 旗下,iBatis3.x正式更名为MyBatis。是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

MyBatis 是一款优秀的持久层框架,他支持定制化SQL,存储过程以及高级映射

MyBatis避免了几乎所有的JDBC代码,手动设置参数以及获取结果集。MyBatis 可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录,是一种ORM(ORM Object Relational Mapping 对象关系映射)实现。

MyBatis将基本的JDBC常用接口封装,对外提供 *** 作即可。

Mybatis 中文官网 https://mybatis.org/mybatis-3/zh/getting-started.html
要使用MyBatis,只需将mybatis-x-x.jar 文件置于类路径中即可。
如果使用Maven 来构建项目,则需要将下面的依赖代码置于pom.xml文件中:


        
            org.mybatis
            mybatis
            3.4.2
        

传统JDBC编程
1、加载数据库驱动
2、创建并获取数据库链接
3、创建statement对象
4、拼写sql语句
5、设置sql语句中的占位符的值
6、执行sql语句并获取结果
7、对sql执行结果进行解析处理
8、释放资源

2、JDBC编程问题

1、数据库连接的创建,释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决该问题。
2、SQL语句编写在Java代码中,这种硬编码造成代码不易维护,当SQL变动时需要修改java源代码。
3、使用preparedStatement向占位符传参数存在硬编码,因为SQL语句的where条件中占位符的个数可能会变化,修改SQL还要修改java源代码,系统不易维护。
4、对结果集解析存在硬编码,SQL语句变化导致解析代码变化,系统不易维护。

3、MyBatis架构

4、MyBatis环境搭建 导入MyBatis 的jar包数据库驱动包

org.mybatis
mybatis
3.4.2

下载地址:https://mvnrepository.com/artifact/org.mybatis/mybatis

设置log4j的配置文件:
log4j.rootLogger = debug,stdout,D
#System out Console
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%p] %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n

#System out File
log4j.appender.D = org.apache.log4j.FileAppender
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ] -[%l] %m%n

创建MyBatis全局配置文件

MyBatis 的配置文件包含了对MyBatis行为的设置信息。配置文档的顶层结构如下:
(标签需要按照特定的顺序排放)
configuration (配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

eg:





    

    
        

        
    

    
        
        
        
    
//环境配置
    
//环境变量    
        
        //事务管理器
            
            //数据源
            
                
                
                
                
            
        
    
    //映射器
    
        
        
        
    

创建映射文件



插入数据
    
         insert into admin(account,password,sex)values(#{account},#{password},#{sex})
       
      

#{ } 占位符,经过预编译的,编译好的SQL语句再取值,# 方式能够防止sql注入 ,安全的
${ } 字符串拼接方式,不安全,多用了传列名,而不是传数据

修改数据
    
        update admin set account=#{account},
                        password=#{password},
                        sex=#{sex}
                        where id=#{id}
    
删除数据
  
        delete from admin where id=#{id}
    
查询数据
   
    
        
    
    
	
        select * from admin  where account=#{acc} and sex=#{sex}
    
     
    
       SELECT COUNT(*) FROM ADMIN
    
    
    
        select * from admin  where account=#{acc} and sex=#{sex}
    

如果传入一个复杂的对象,就需要使用parameterType 参数进行类型定义,例如:

void insertUser(User user);


insert into users(id,username,password)
values (#{id},#{username},#{password})

也可以使用Map对象传递
void insertUser(Map map);
在sql中使用表达式获取map的键即可。

7、结果处理 返回简单基本类型

返回admin的数量个数

 int getAdminCount();
    
        select * from t_admin  where id=#{id}
    
定义resultMap

resultmap自定义映射,列名与类中属性名不同,关联关系(单个,集合)
resulttype 具体返回值类型

    
        
        
        
        
            
        
        
            
        
    
    
        SELECT
d.id,
d.name dname,
a.account,
emp.name ename
FROM dept d LEFT JOIN ADMIN a ON d.adminId = a.id
	    LEFT JOIN employee emp ON d.id = emp.deptId
	    WHERe d.id=#{id}
    
懒加载

概念:需要查询关联信息时,使用Mybatis 懒加载特性可有效减少数据库压力,首次查询只查询主表信息,关联表的信息在用户获取时再加载。
Mybatis一对一关联的association 和一对多的collection可以实现懒加载。懒加载时要用resultmap。
启动懒加载
(1)先在xml文件中配置setting 来开启懒加载



    
        
        
        
        
            
        
        
            
        
    
    
        select name  from  dept where id=#{id}
    
    
        SELECT
        emp.id,
        emp.name ename,
        emp.sex,
        d.name dname,
        a.account
        FROM employee emp LEFT JOIN  dept d ON emp.deptId=d.id
        LEFT JOIN ADMIN a ON emp.adminId =a.id
        
            
                emp.name =#{name}
            
            
                and emp.sex=#{sex}
            
        
    

Choose元素

 
            select  *
            from employee
            where sex in
            
                #{sex}
            
    
    
        select  *
        from employee
        where sex =#{sex}
    
11、特殊符号处理

对符号进行转义

< <
> >
" "
’ '
& &

可以用 来包裹特殊字符

为什么使用缓存?

缓存(cache)的作用是为了减去数据库的压力,提高数据库的性能。缓存实现的原理是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存,当再次需要获取该对象时,直接从内存中直接获取,不再向数据库执行select语句,从而减少对数据库的查询次数,提高数据库性能。

一级缓存

只是相对于同一个sqlSession 而言
生命周期:
a、MyBatis在开启一个数据库会话时,会创建一个新的sqlSession 对象,SqlSession 对象中会有一个新的Executor对象,Executor对象中持有一个新的PerpetualCache对象,如果SqlSession调用了close()方法,会释放一级缓存PerpetualCache对象,一级缓存将不可用。
b、如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但该对象仍然可以用。
c、SqlSession中执行了任何一个update *** 作(update()、delete()、insert()),会清空PerpetualCache对象中的数据,但该对象仍然可以用。

二级缓存

二级缓存是SqlSessionFactory级别的,根据mapper的namespace划分区域,相同的namespace的mapper查询的数据缓存在同一区域,如果使用mapper代理方法每个mapper的namespace都不同,此时可以理解为二级缓存区域是根据mapper划分。

配置:
1、在SqlMapperConfig.xml中启动二级缓存

    

2、POJO序列化
接口实现Serializable

3、配置映射文件


      
      @Test
      public  void find5(){
          SqlSession sqlSession = MybatisUtil.getSession();
          EmployeeMapper employeeMapper =sqlSession.getMapper(EmployeeMapper.class);
          employeeMapper.getEmplyeeByAge2("男");
         // employeeMapper.getEmplyeeByAge2("男");

          sqlSession.commit();
          sqlSession.close();

          SqlSession sqlSession1 = MybatisUtil.getSession();
          EmployeeMapper employeeMapper1 =sqlSession1.getMapper(EmployeeMapper.class);
          employeeMapper1.getEmplyeeByAge2("男");
          sqlSession1.commit();
          sqlSession1.close();
      }

只查找一次,在内存中找到

 @Test
      public  void find4(){
          SqlSession sqlSession = MybatisUtil.getSession();
          EmployeeMapper employeeMapper =sqlSession.getMapper(EmployeeMapper.class);
          employeeMapper.getEmplyeeByAge2("男");
        //  sqlSession.clearCache();//会清空PerpetualCache 对象中的数据,但该对象仍然可以使用
          Employee employee =new Employee();
          employee.setName("aaaa");
          Dept dept =new Dept();
          dept.setId(1);
          employee.setDept(dept);
          Admin admin =new Admin();
          admin.setId(1);
          employee.setAdmin(admin);
          employeeMapper.updateEmployee(employee);
          //sqSession中执行任何一个 update() delete() insert() 都会清空PerpetualCache 对象中的数据,但该对象仍然可以使用


          employeeMapper.getEmplyeeByAge2("男");

          sqlSession.commit();
          sqlSession.close();

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存