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

mybatis

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

mybatis

Mabatis

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

MyBatis的持久化解决方案是将用户从原始的JDBC访问中解放出来,用户只需要定义需要操作的SQL语句,无须关注底层的JDBC操作,就可以以面向对象的方式来进行持久化层操作.底层数据库连接的获取,数据访问的实现,事务控制等都无须用户关心。

mybatis的使用
  • 导入maven依赖
		
            org.mybatis
            mybatis
            3.5.2
        
  • 编写核心配置文件


    
        
            
            
                
                
                
                
            
        

    

  • 编写mybatis工具类
public class MybatisUtils {
    
    static private SqlSessionFactory build;

    static {
        try {
            //获取sqlSessionFactory对象
            String resource = "src/main/resources/mybatis-config.xml";
            InputStream io = Resources.getResourceAsStream(resource);
            build = new SqlSessionFactoryBuilder().build(io);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //接下来可以通过sqlSessionFactory对象获取sqlSession
    public static SqlSession getSqlSession(){
       return build.openSession();
    }
}

介绍SqlSessionFactory:

SqlSessionFactory是MyBatis的关键对象。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得。

SqlSessionFactoryBuilder可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实,顾名思义SqlSessionFactory就是创建SqlSession的工厂。

介绍SqlSession:

SqlSession是MyBatis的关键对象,SqlSession中包含了执行SQL的所有方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句.

编写代码测试
  • Dao层接口
public interface UserDao {
    List getUserList();
}
  • 编写Mapper.xml配置实现接口




    

    
        select * from user where id = 1;
    

注意点:每一个Mapper都必须在Mybatis核心配置文件中注册(类似servlet)

resource用于绑定文件夹下的xml,

	
	
        
    
    

class绑定接口

	
        
        
    

由于maven约定大于配置,可能会出现mybatis-config.xml核心文件找不到的问题,在maven中加入静态资源过滤就可以解决


        
            
                src/main/java
                
                    ***.xml
                
                true
            
            
                src/main/resources
                
                    ***.xml
                
                true
            
        
    

插入一则自己遇到的bug:

org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 14; 1 字节的 UTF-8 序列的字节 1 无效。

原因是编码方式设置成了默认的UTF-8,改成UTF8就正常了

测试类:

public class UserDaoTest {
    @Test
    public void Test01(){
        //通过工具类获取sqlSession
        SqlSession sqlSession = MybatisUtils.getSqlSession();
//      反射获取接口
        UserDao mapper = sqlSession.getMapper(UserDao.class);
//      执行方法
        List userList = mapper.getUserList();

        for(User u:userList){
            System.out.println(u);
        }
    }
}
CRUD实现
  • namesapce

namesapce中的包名必须要和Dao接口中的保持一致

select

选择,查询数据

  1. id:对应绑定接口中的方法
  2. resultType:对应执行sql后返回的数据类型
  3. parameterType:对应传进来参数的类型(传参用#{}来取参数)

如果想要传递多种不同类型的参数,可以通过@param注解来实现,如:

public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);


        select * from mabatis.user where id = #{id};
    

	

    	
    	
    	
	
日志

数据库出错的排错工具:日志工厂

  • SLF4J

  • LOG4J

  • LOG4J2

  • JDK_LOGGING

  • COMMONS_LOGGING

  • STDOUT_LOGGING(标准日志输出)

  • NO_LOGGING

在mybatis-config.xml核心配置文件中设置setting

LOG4J

maven仓库包

        
            log4j
            log4j
            1.2.17
        

编写配置文件

配置根Logger等等,如:

log4j.rootLogger = level,appenderName1,appenderName2, .....

level是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别,默认优先级:

ALL < DEBUG < INFO

Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来

appenderName是日志信息输出位置,可以同时指定多个输出目的地

其他详情配置自个网上看: LOG4J框架配置文件详解_

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file

#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/zhang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n

#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

简单使用

  • 导包,获取Logger对象
    static Logger logger = Logger.getLogger([需要使用的类的名字].class);

使用方法类似于使用类

利用注解开发

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。

复杂操作用xml,简单SQL语句可以用注解

在mabatis-config.xml中用class绑定

绑定需要用到注解的类,如:

	
        
    

接口配置:

@Select("select * from user where id > 0")//sql的语句同xml文件
    List getUserList();
多对一的处理

其中Student对象的属性中包含Teacher对象

  • 按查询嵌套处理

过程:先查询出Student对象,再用查出来的Student对象的tid属性再嵌套查询teacher对象


    select * from mabatis.student;

    


        
    

    
        select s.id 学生序号, s.name 学生姓名, t.name 老师姓名, t.id 老师序号
        from mabatis.student s ,mabatis.teacher t
        where s.tid = t.id;
    
    
        
        
                
					
                    
                    
                
    
一对多的处理

个人推荐按结果嵌套映射,按查询嵌套。。。。痛苦面具

  • 按结果嵌套处理

一个老师对应多个学生:

public class Teacher {
  private long id;
  private String name;
  private List students;
}
//接口方法:
    public Teacher getTeacher(@Param("tid") int tid);


Mapper:

    
    
        
        
        
        
            
            
            
        
    
  • javaType 用来指定实体类中属性的类型
  • ofType 用来指定集合容器中存放的元素类型(泛型中的约束类型)
动态SQL

详情见官方文档: mybatis – MyBatis 3 | 动态 SQL

可以使用sql标签支持SQL语句复用,用的时候用include标签引用就彳亍

foreach标签遍历集合,item表示集合内的元素项,还有开始符,分割符,结束符等配置

缓存
  • 缓存是存放在内存中的临时数据
    • 将用户经常查询的数据存放在缓存中,用户查询就不用从数据库中查询而直接从缓存中获取,提高查询效率,减少和数据库的交互次数
    • 经常查询且不常修改的数据可用缓存

mybatis默认开启一级缓存,SqlSession级别,SqlSession被销毁缓存就失效了。作用范围是从Sqlsession被创建到被销毁

也可手动清理缓存

二级缓存需要手动配置,是namespace级别的,在当前mapper.xml中有效。使用cathe标签(详见官方文档)要用的话最好在核心配置文件中显式配置。

  • 映射语句文件中的所有 select 语句的结果将会被缓存。
  • 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  • 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  • 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
  • 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
  • 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

缓存查询顺序:用户发起请求–>查二级缓存–>查一级缓存–>查数据库

内存中的临时数据

  • 将用户经常查询的数据存放在缓存中,用户查询就不用从数据库中查询而直接从缓存中获取,提高查询效率,减少和数据库的交互次数
  • 经常查询且不常修改的数据可用缓存

mybatis默认开启一级缓存,SqlSession级别,SqlSession被销毁缓存就失效了。作用范围是从Sqlsession被创建到被销毁

也可手动清理缓存

二级缓存需要手动配置,是namespace级别的,在当前mapper.xml中有效。使用cathe标签(详见官方文档)要用的话最好在核心配置文件中显式配置。

  • 映射语句文件中的所有 select 语句的结果将会被缓存。
  • 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  • 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  • 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
  • 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
  • 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

缓存查询顺序:用户发起请求–>查二级缓存–>查一级缓存–>查数据库

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

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

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