基于Maven的mybatis框架搭建(均实践)

笔者自学的框架,知识点来自网上学习教程,方便实惠,推荐,特此声明。

一. mybatis(以Student类举例)
  1. pom引入依赖
    
    org.mybatis
    	mybatis
        3.4.6
    
    
        mysql
        mysql-connector-java
        5.1.46
    
    
        log4j
        log4j
        1.2.17
    
    
    在build下添加以下参数,使得 idea编译src的java目录的xml文件
    
        
            src/main/java
            
                **/*.xml
            
        
    
    
  2. StudentDao.xml
    mapper的文件名随意,一般会跟dao接口放在同一个包下,这里映射文件名称定为StudentMapper.xml
    mybatis会检测到student类型的对象,所以parameterType一般不用指定,values后面的#{}中的内容是Student的属性名
    
        
    	
    	
    	
       		 INSERT INTO t_student(name,age,score) VALUES (#{name},#{age},#{score})
    	   
    
    
  3. mybatis.xml
     
    
    
    
    
    
        
            
            
                
                
                
                
            
        
    
    
        
    	
    
    
    
  4. db.properties
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://127.0.0.1:3306/sqldemo?useSSL=false
    jdbc.user=root
    jdbc.password=password
    

二.相关解释
  1. mybatis.xml
    1.1 设置jdbc链接参数在db.propertes中,便于修改,同时通过以下语句载入mybatis.xml

    1.2 注册实体类(JavaBean)的全限定性类名的别名

    //设置单个bean
    
    	
    
    //使用package指定一个包名,mybatis会在这个包名下搜索需要的JavaBean
    //默认别名:基本类型前面加_例如_int,引用类型一般变第一个大写为小写如:student
    
    	
    
    

    也可以在Bean下的类上添加@Alias(String)注解来取别名
    1.3 生产环境:

    
    
    
    	
        	
        	
        	
        	
    	
    
    

    在environments标签中有两个environment子标签表示了两个数据库,此时可以在environments中使用default属性来指定使用哪一个数据库,这样子,在切换环境的时候,只需要修改default的属性即可。

    • transactionManager标签
      该标签用于指定MyBatis所使用的事务管理器。 MyBatis 支持两种事务管理器类型:
      • JDBC
        该事务器就是我们之前通过Connection的commit()方法提交,通过rollback()方法回滚,默认是需要手动提交的。
      • MANAGED
        由容器来管理事务的整个事务的生命周期,默认情况下会关闭连接,将来学习spring框架之后,就不用在配置事务管理器了,spring会使用自带的管理器。
    • dataSource标签
      该项主要用于配置数据源和数据库连接基本属性,有以下三种内建的数据源类型:
      • UNPOOLED
        该配置表示不使用连接池,每次请求都会创建一个数据库连接,使用完毕后再关闭。当项目对数据库性能要求不大的时候,可以使用该配置。
      • POOLED
        改配置表示使用mybatis自带的数据库连接池,可以在dataSource下的property属性中设置数据库连接池的基本信息,该部分可以在mybatis的官网中看到。
      • JNDI
        配置外部数据源

    1.4 路径映射的区别
    a:使用相对于类路径的资源引用

    
    
    	
    
    

    b:使用完全限定资源定位符(URL)

    
    
    	
    
    

    c: 该方式的使用,需要满足以下几个要求:
    (1)映射文件名要与 Dao 接口名称相同
    (2)映射文件要与接口在同一包中
    (3)映射文件中的 namespace 属性值为 Dao 接口的全类名(com.java.Dao.StudentDao)

    
    	
    	
    
    

    d: 这种方式的使用需要满足以下几个条件:
    (1)dao 使用 mapper 动态代理实现
    (2)映射文件名要与 Dao 接口名称相同
    (3)映射文件要与接口在同一包中
    (4)映射文件中的 namespace 属性值为 Dao 接口的全类名

    
    	
    	
    
    
  2. StudentDao.xml
    2.1语句解析

    
    
        INSERT INTO t_student(name,age,score) VALUES (#{name},#{age},#{score})
        
            SELECT @@identity
        
    
    
    • id:该SQL语句的唯一标识,可被用来代表该sql语句,在Java代码中要使用该标识。
    • parameterType:传入参数的类型,MyBatis会推断出传入参数的类型,因此可以不用配置。
    • { }:里面需要填写javabean中的属性,其底层是通过反射机制,调用bean类相关属性的get方法来获取值的。
    • 可筛选出主键并赋值给Student,无论提交不提交,只要有sql语句,就会分配主键

    2.2 查询语句知识点

    • 模糊查询:
      占位符型:’%’ #{name} ‘%’(即这里的字符串拼接不需要+号,而是需要空格。)
      拼接型:’%${value}%’(不需要空格,但是又sql注入问题,推荐使用#{})

    2.3 字段名和属性名不同的情况,例如在mysql里的password取了笔名pwd
    需要在Dao包下的StudentDao.xml的里设置

    
      	
    	
    
    
  3. mapper动态代理原理及步骤:
    此文做了例子描述
    粗略原理解释
    3.1 原理(笔者浅显理解):mybatis通过xml文件编写实现sql语句的编写,(原本需要实现StudentDao接口,生成实现类,用实现类使用sqlsession来调用xml文件的sql,实现对数据库的操作)但通过代理过后,可以直接利用sqlsession来生成接口类StudentDao的实现类,用实现类的方法调用xml文件里的语句来实现数据库操作。将dao的实现类删除之后,mybatis底层只会调用selectOne()或selectList()方法。而框架选择方法的标准是dao层方法中用于接收返回值的对象类型。若接收类型为 List,则自动选择 selectList()方法;否则,自动选择 selectOne()方法。
    3.2 应用:
    a: 编写xml文件,与Dao接口,要求如下

    • 映射文件名要与 Dao 接口名称相同
    • 映射文件要与接口在同一包中
    • 映射文件中的 namespace 属性值为 Dao 接口的全类名

    b: 编写Dao接口,方法要与xml文件的每个id相同

    • parameterType参数类型
    • resultType返回值类型
    • 最好抛出错误

    c: mybatis.xml加载Student.xml文件(上文有各种方式)
    d:编写方法,进行数据库操作

    //mybatis配置文件
    String resource = "mybatis.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    //使用SqlSessionFactoryBuilder创建sessionFactory
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //获取session
    SqlSession session = sqlSessionFactory.openSession();
    //获取mapper接口的代理对象
    UserMapper userMapper = session.getMapper(UserMapper.class);
    //在这里调用userMapper的方法。
    //如果没有设置sqlsession自动提交,则需要在最后提交
    session.commit();
    session.close();
    
  4. 进阶动态sql
    4.1以下为各标签例子

    
        
          
              name LIKE '%' #{name} '%'
          
          
              age > #{age}
          
          
              1 != 1
          
        
    
    
    
      WHERE id IN 
        
            #{id}
        
    
    

    4.2 动态SQL的注意事项

    • 在mybatis的动态sql中,我们可能会对一些数据进行比较大于>小于<,不过因为这些比较操作要写在xml文件中,就有可能导致xml文件解析出现问题,此时可以使用实体符号代替。尤其小于号不能出现
    	 原符号      实体符号
    	  <         <
    	  <=        <=
    	  >         >
    	  >=        >=
    	  &         &
    	  "         "
    	  '         '
    
    
    

    -除了使用特殊符号之外,我们还可以将这些数据(符号)放到里面,这里面的内容xml是不会解析的。

    
    

    (之后补充)

  5. 懒加载:1.直接加载 2.侵入式加载 3.深度加载
    5.1 直接加载:不设置属性在直接加载,立即执行完sql语句并返回
    5.2 侵入式延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情属性时,就会马上执行关联对象的select查询。
    5.3 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。

    <!--全局参数设置-->
    <settings>
    	<!--延迟加载总开关-->
    	<setting name="lazyLoadingEnabled" value="true"/>
    	<!--侵入式延迟加载开关-->
    	<!--3.4.1版本之前默认是true,之后默认是false-->
    	<!--true 为侵入式延迟加载,false为深度延迟加载 -->
    	<setting name="aggressiveLazyLoading" value="true"/>
    </settings>
    
  6. 缓存:缓存是为了在执行sql语句时提高效率,将sql语句的结果存储在缓存中,如果相同的sql就会直接回复结果。缓存作用域详解
    6.1 mybatis一共有2级缓存。其中一级缓存无法关闭,作用域为sqlsession,所以用一个MybatisUtil将sqlsession做成单例模式很有必要。一旦发生了数据更新那么,缓存就会清空。
    6.2 内置二级缓存:二级缓存的作用域与namespace有关,如果开启了几个sqlsession,但是只有一个namespace,那么就会进行缓存,不同 namespace 下的数据互不干扰。
    开启内置二级缓存:序列化javabean
    a:将javabean实现Serializable接口,如果该javabean有显示的父类的话,让父类也实现Serializable接口。
    b:在mapper配置文件中的mapper标签下添加下面标签:
    标签属性

    • eviction:逐出策略。当二级缓存中的对象达到最大值时,就需要通过逐出策略将缓存中的对象移出缓存。默认为 LRU。常用的策略有:
      • FIFO:First In First Out,先进先出
      • LRU:Least Recently Used,未被使用时间最长的
    • flushInterval:刷新缓存的时间间隔,单位毫秒。这里的刷新缓存即清空缓存。一般不指定,即当执行增删改时刷新缓存,如果长时间未刷新缓存有肯能会出现过期数据。
    • readOnly:设置缓存中数据是否只读。只读的缓存会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改的,这样性能会好一些,缺点是因为他是只读的,所以不能被修改。如果设置为false的话,读写的缓存会通过序列化返回该缓存对象的拷贝,因为会把对象进行拷贝,这会慢一些,但是安全,因此默认是 false。
    • size:二级缓存中可以存放的最多对象个数。默认为 1024 个。

    6.3 二级外置缓存:mybatis除了自带的二级缓存,还支持一些第三方的缓存,并且由于mybatis只擅长sql,所以这些第三方缓存的性能要比mybatis的好一些,下面以ehCache为例看下第三方的二级缓存使用方式。
    ehCache是一款知名的缓存框架,hibernate框架的默认缓存策略使用的就是ehCache。
    使用ehCache二级缓存,实体类无需实现Serializable接口。
    a:引入依赖

    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>2.10.0</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.caches</groupId>
        <artifactId>mybatis-ehcache</artifactId>
        <version>1.1.0</version>
    </dependency>
    
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.25</version>
    </dependency>
    

    b: 添加ehcache配置文件

    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
    </ehcache>
    

    c:在标签中用type使用外置缓存(还可以在这里设置属性)

     <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
     <property name="timeToIdleSeconds" value="3600"/>
     <property name="timeToLiveSeconds" value="3600"/>
     <property name="maxEntriesLocalHeap" value="1000"/>
      <property name="maxEntriesLocalDisk" value="10000000"/>
     <property name="memoryStoreEvictionPolicy" value="LRU"/>
    </cache>
    

你可能感兴趣的:(#,java框架)