MyBatis简介与运用

1.     Mybatis简介

1.1. Mybatis是什么

      Mybatis是一个java的持久层框架,保存到数据库

      持久化:保存到本地文件

 

1.2. Mybatis的作用

       操作数据库

1.3. 为什么要学习mybatis

        1、jdbc

        2、dbutils

        3、mybatis

       Mybatis的理念:使用10%代码去操作数据库

       解决方案:零实现,就是使用接口来操作数据库,不使用实现类

       

      Mybatis的定位:提高开发效率

1.4. Mybatis参考网址

英文参考手册:http://www.mybatis.org/mybatis-3/

中文参考手册:http://www.mybatis.org/mybatis-3/zh/logging.html

在线的api帮助文档:http://tool.oschina.net/apidocs/apidoc?api=mybatis-3.1.1

1.5. 配置流程图

 

 

2.     入门案例

2.1. 准备条件

1.1.1.   数据库脚本

drop database if exists mybatis_clazz;

create database mybatis_clazz;

use mybatis_clazz;

CREATE TABLE `tb_user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(20) NOT NULL,

  `password` varchar(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

 

INSERT INTO `tb_user` VALUES ('1', 'zhangsan', '123');

INSERT INTO `tb_user` VALUES ('2', 'lisi', '123456');

INSERT INTO `tb_user` VALUES ('3', '小明', '123456');

 

 

1.1.2.   相关jar包

 

1.1.3.   Xml约束

           dtd 约束xml的内容

     

         Eclipse添加dtd约束文件

 

 

2.2. 示例代码

1.1.4.   引入jar包

 

1.1.5.   配置文件

 创建mybatis-config.xml配置文件并引入dtd约束(复制如下代码)

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

配置文件内容

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <environments default="development">

        <environment id="development">

            <transactionManager type="JDBC" />

            <dataSource type="POOLED">

                <property name="driver" value="com.mysql.jdbc.Driver" />

                <property name="url" value="jdbc:mysql://localhost:3307/mybatis_clazz" />

                <property name="username" value="root" />

                <property name="password" value="root" />

            </dataSource>

        </environment>

    </environments>

</configuration>

 

 

1.1.6.   调用核心api测试

publicstaticvoid main(String[] args) throws IOException {

        String resource = "mybatis-config.xml";

        //1.读取配置文件

        InputStream inputStream = Resources.getResourceAsStream(resource);

        //2.获取到SqlSessionFactoryBuilder

        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

        //3.获取到SqlSessionFactory(工厂)

        SqlSessionFactory sqlSessionFactory = builder.build(inputStream);

        //4.SqlSession 操作数据库的类

        SqlSession session  = sqlSessionFactory.openSession();

        //测试

        Connection connection = session.getConnection();

        System.out.println(connection);

    }

1.1.7.   映射文件

创建映射文件并配置dtd约束

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 

映射文件代码

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--

namespace:用来配置映射文件与接口的关联

 -->

<mapper namespace="mapper.UserMapper">

<!--

    查询所有用户的信息

    id与我们的接口的方法名一致

-->

   <select id="selectAll" resultType="entity.User">

        select * from tb_user

   </select>

</mapper>

 

注意事项:

1.每一个映射文件需要配置namesapce属性,建立映射文件与接口关联关系

<mapper namespace="mapper.UserMapper">

 

2.每一个映射文件都需要在核心配置文件(mybatis-config.xml)配置

<!-- 配置映射文件 -->

    <mappers>

      <mapper resource="mapper/xml/UserMapper.xml"/>

    </mappers>

 

1.1.8.   测试代码

package test;

 

import java.util.List;

 

import org.apache.ibatis.session.SqlSession;

import org.junit.Test;

 

import entity.User;

import mapper.UserMapper;

import utils.MyBatisUtil;

 

public class UserMapperTest {

        

        

         @Test

         public void testSelectAll(){

           //获取到mybatis操作数据库的对象SqlSession

                   SqlSession session = MyBatisUtil.getSession();

                  

                   UserMapper userMapper = session.getMapper(UserMapper.class);

                  

                   List<User> userList = userMapper.selectAll();

                   System.out.println(userList);

                  

                  

         }

 

}

 

 

1.1.9.   增删查改代码

核心配置文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <environments default="development">

        <environment id="development">

            <transactionManager type="JDBC" />

            <dataSource type="POOLED">

                <property name="driver" value="com.mysql.jdbc.Driver" />

                <property name="url" value="jdbc:mysql://localhost:3307/mybatis_clazz" />

                <property name="username" value="root" />

                <property name="password" value="root" />

            </dataSource>

        </environment>

    </environments>

    <!-- 配置映射文件 -->

    <mappers>

      <mapper resource="mapper/xml/UserMapper.xml"/>

    </mappers>

</configuration>

 

 

映射文件代码

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"mybatis-3-mapper.dtd">

<!--

namespace:用来配置映射文件与接口的关联

 -->

<mapper namespace="mapper.UserMapper">

<!--

    查询所有用户的信息

    id与我们的接口的方法名一致

-->

   <select id="selectAll" resultType="entity.User">

        select * from tb_user

   </select>

  

   <!-- 插入数据

     parameterType参数类型()

    -->

   <insert id="insertUser" parameterType="entity.User">

     insert into tb_user(username,password) values (#{username},#{password})

   </insert>

  

   <!-- 删除数据 -->

   <delete id="deleteById">

       delete from tb_user where id=#{id}

   </delete>

  

   <!-- 修改用户数据-->

   <update id="updateUser" parameterType="entity.User">

      update tb_user set username=#{username},password=#{password} where id=#{id}

   </update>

  

  

  

  

</mapper>

 

接口代码

package mapper;

 

import java.util.List;

 

import entity.User;

 

public interface UserMapper {

         //查询所有

         public List<User> selectAll();

        

         //插入数据

         public int insertUser(User user);

        

         //修改数据

         public int updateUser(User user);

        

         //删除数据

         public int deleteById(int id);

 

}

 

 

测试代码

package test;

 

import java.util.List;

 

import org.apache.ibatis.session.SqlSession;

import org.junit.Test;

 

import entity.User;

import mapper.UserMapper;

import utils.MyBatisUtil;

 

public class UserMapperTest {

        

         //测试查询所有用户

         @Test

         public void testSelectAll(){

           //获取到mybatis操作数据库的对象SqlSession

                   SqlSession session = MyBatisUtil.getSession();

                  

                   UserMapper userMapper = session.getMapper(UserMapper.class);

                  

                   List<User> userList = userMapper.selectAll();

                   System.out.println(userList);

                  

                  

         }

         //测试插入数据

         @Test

         public void testInsertUser(){

                   SqlSession session = MyBatisUtil.getSession();

                   UserMapper userMapper = session.getMapper(UserMapper.class);

                   User user = new User("黄忠","ak47");

                   int row = userMapper.insertUser(user);

                   //提交事务

                   session.commit();

                   System.out.println("影响行数为:"+row);

         }

        

         //测试删除

                   @Test

                   public void testDeleteById(){

                            SqlSession session = MyBatisUtil.getSession();

                            UserMapper userMapper = session.getMapper(UserMapper.class);

                            int row = userMapper.deleteById(5);

                            //提交事务

                            session.commit();

                            System.out.println("影响行数为:"+row);

                   }

                  

                   //测试修改

                   @Test

                   public void testUpdateUser(){

                                               SqlSession session = MyBatisUtil.getSession();

                                               UserMapper userMapper = session.getMapper(UserMapper.class);

                                               User user = new User("黄忠","加特林");

                                               user.setId(6);

                                               int row = userMapper.updateUser(user);

                                               //提交事务

                                               session.commit();

                                               System.out.println("影响行数为:"+row);

                                     }

 

}

 

 

3.     三种操作方式(CRUD)

3.1. 使用dao的方式操作数据库(过去)

Xml代码

<mapper namespace="test">

    <!-- 查询所有用户信息 -->

    <select id="findByAll" resultType="com.ys.entity.User">

       select * from tb_user

    </select>

   

    <!--通过id查询用户数据 -->

    <select id="findById" parameterType="java.lang.Integer" resultType="com.ys.entity.User">

       select * from tb_user where id=#{id}

    </select>

</mapper>

 

测试代码

 

3.2. 使用xml和接口操作数据库(Mapper代理的方式)

 

3.3. 使用注解和接口操作数据库

接口代码

package com.ys.mapper;

 

import java.util.List;

 

import org.apache.ibatis.annotations.Delete;

import org.apache.ibatis.annotations.Insert;

import org.apache.ibatis.annotations.Select;

import org.apache.ibatis.annotations.Update;

 

import com.ys.entity.User;

 

public interface UserMapper {

        

         //查询所有用户数据

         @Select("select * from tb_user")

         public List<User> findByAll();

        

         //通过id查询用户数据

         @Select("select * from tb_user where id=#{id}")

         public User findById(int id);

        

         //插入用户数据

         @Insert("insert into tb_user(username,password) values (#{username},#{password})")

         public int insertUser(User user);

        

         //更新用户数据

         @Update("update tb_user set username=#{username},password=#{password} where id=#{id}")

         public int updateUser(User user);

        

         //根据id删除用户数据

         @Delete("delete from tb_user where id=#{id}")

         public int deleteById(int id);

 

}

 

 

测试代码

package com.ys.test;

 

import java.util.List;

 

import org.apache.ibatis.session.SqlSession;

import org.junit.Test;

 

import com.ys.entity.User;

import com.ys.mapper.UserMapper;

import com.ys.util.MybatisUtil;

 

public class UserMapperTest {

        

   @Test

    public void testFindByAll(){

            SqlSession session = MybatisUtil.getSession();

            UserMapper mapper = session.getMapper(UserMapper.class);

            List<User> userList = mapper.findByAll();

            System.out.println(userList);

   }

 

   //测试插入用户数据

   @Test

   public void testInsertUser(){

            User user = new User(123,"小欣欣","2345678");

            SqlSession session = MybatisUtil.getSession();

            UserMapper mapper = session.getMapper(UserMapper.class);

            int row = mapper.insertUser(user);

            session.commit();

            session.close();

            System.out.println("影响行数为:"+row);

   }

}

 

 

4.     核心API

4.1.  Resources

   读取核心配置文件

      getResourceAsStream(“配置文件的路径”);

4.2.  SqlSessionFactoryBuilder

用来构建SqlSessionFactory构建类

 

用完就扔

4.3.  SqlSessionFactory

创建与数据库的会话的工厂,在一个应用程序中只有一个实例(单例模式)

 

4.4. SqlSession

 数据库的一个会话,用来操作数据库

 线程不安全的,在使用的时候,每一个方法对应一个会话(SqlSession)

5.     Log4j 日志文件

5.1. 引入jar包

  mybatis-3.3.0\lib\log4j-1.2.17.jar

 

5.2. 在classpath目录下新建log4j.properties文件

Log4j.properties的内容

log4j.rootLogger=DEBUG,stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%-4r%-5p[%t]%37c%3x-%m%n

 

6.     核心配置文件的说明

核心配置文件指的就是mybatis-config.xml文件

 

   properties(属性)

         settings(全局配置参数)

         typeAliases(类型别名)

         typeHandlers(类型处理器)

      就是用来映射java数据类型和数据库的字段类型

   objectFactory(对象工厂)

         plugins(插件)

         environments(环境集合属性对象)

                   environment(环境子属性对象)

                            transactionManager(事务管理)

                  type : JDBC/MANAGED

                            dataSource(数据源)

                  指定数据源的类型

                    POOLED/UNPOOLED/JNDI

         mappers(映射器)

    mapper

      Resource:  xml映射文件

      Class  :  接口的全限定名

        注意事项:

            1.接口与映射文件同名,放在同一个目录下

通过包扫描的方式:

    <package name=”需要扫描的包”/>
                             注意事项:

             1.接口与映射文件同名,放在同一个目录下

 

  

 

6.1. Properties属性配置文件

可以把一些通用的属性值配置在属性文件中,加载到mybatis运行环境内

database.properties

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3307/mybatis_clazz

jdbc.username=root

jdbc.password=root

 

引入

使用

<dataSource type="POOLED">

                <property name="driver" value="${jdbc.driver}" />

                <property name="url" value="${jdbc.url}" />

                <property name="username" value="${jdbc.username}" />

                <property name="password" value="${jdbc.password}" />

</dataSource>

 

6.2. Settings配置全局参数

mybatis运行时可以调整一些全局参数

 

Mybatis启动可以配置的设置

设置参数

描述

有效值

默认值

cacheEnabled

该配置影响的所有映射器中配置的缓存的全局开关。

true | false

TRUE

lazyLoadingEnabled

延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。

true | false

FALSE

aggressiveLazyLoading

当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载(参考lazyLoadTriggerMethods).

true | false

false (true in ≤3.4.1)

multipleResultSetsEnabled

是否允许单一语句返回多结果集(需要兼容驱动)。

true | false

TRUE

useColumnLabel

使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。

true | false

TRUE

useGeneratedKeys

允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。

true | false

FALSE

autoMappingBehavior

指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。

NONE, PARTIAL, FULL

PARTIAL

autoMappingUnknownColumnBehavior

指定发现自动映射目标未知列(或者未知属性类型)的行为。

NONE, WARNING, FAILING

NONE

NONE: 不做任何反应

WARNING: 输出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'的日志等级必须设置为 WARN)

FAILING: 映射失败 (抛出 SqlSessionException)

defaultExecutorType

配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。

SIMPLE REUSE BATCH

SIMPLE

defaultStatementTimeout

设置超时时间,它决定驱动等待数据库响应的秒数。

任意正整数

Not Set (null)

defaultFetchSize

为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖。

任意正整数

Not Set (null)

safeRowBoundsEnabled

允许在嵌套语句中使用分页(RowBounds)。 If allow, set the false.

true | false

FALSE

safeResultHandlerEnabled

允许在嵌套语句中使用分页(ResultHandler)。 If allow, set the false.

true | false

TRUE

mapUnderscoreToCamelCase

是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。

true | false

FALSE

localCacheScope

MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。

SESSION | STATEMENT

SESSION

jdbcTypeForNull

当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。

JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER

OTHER

lazyLoadTriggerMethods

指定哪个对象的方法触发一次延迟加载。

A method name list separated by commas

equals,clone,hashCode,toString

defaultScriptingLanguage

指定动态 SQL 生成的默认语言。

A type alias or fully qualified class name.

org.apache.ibatis.scripting.xmltags.XMLLanguageDriver

callSettersOnNulls

指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。

true | false

FALSE

returnInstanceForEmptyRow

当返回行的所有列都是空时,MyBatis默认返回null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集 (i.e. collectioin and association)。(从3.4.2开始)

true | false

FALSE

logPrefix

指定 MyBatis 增加到日志名称的前缀。

Any String

Not set

logImpl

指定 MyBatis 所用日志的具体实现,未指定时将自动查找。

SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

Not set

proxyFactory

指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。

CGLIB | JAVASSIST

JAVASSIST (MyBatis 3.3 or above)

vfsImpl

指定VFS的实现

自定义VFS的实现的类全限定名,以逗号分隔。

Not set

useActualParamName

允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的工程必须采用Java 8编译,并且加上-parameters选项。(从3.4.1开始)

true | false

TRUE

configurationFactory

Specifies the class that provides an instance of Configuration. The returned Configuration instance is used to load lazy properties of deserialized objects. This class must have a method with a signature static Configuration getConfiguration(). (Since: 3.2.3)

A type alias or fully qualified class name.

Not set

 

示例代码

 

6.3. 别名

就是配置映射文件里的类名使用指定的名字来代替全限定名。

        可以将parameterTyperesultType中指定的类型通过别名引用

1.1.10.           自定义别名

定义单个别名:


    批量定义别名:

 

1.1.11.           内置别名

内置的别名就是,Mybatis框架默认已经设置的别名.

别名

映射的类型

_byte

byte

_long

long

_short

short

_int

int

_integer

int

_double

double

_float

float

_boolean

boolean

string

String

byte

Byte

long

Long

short

Short

int

Integer

integer

Integer

double

Double

float

Float

boolean

Boolean

date

Date

decimal

BigDecimal

bigdecimal

BigDecimal

object

Object

map

Map

hashmap

HashMap

list

List

arraylist

ArrayList

collection

Collection

iterator

Iterator

 

6.4. mappers的配置

 

7.     其他知识点

7.1. #{} 和 ${}的区别

#{} 是占位符,像我们PreparedStatement?,会进行预编译

${} 直接拼接sql语句,不对sql进行预编译,可能出现sql注入问题

 

7.2. 模糊查询代码

 

7.3. 插入返回主键

 

8.     Mapping映射文件

8.1. parameterType

配置输入参数的类型,使用全限定名或者使用别名

 

注意事项:

   传入的参数要么没有,要么只有一个

8.2.  resultType

配置输出参数的类型,使用全限定名或者使用别名

注意事项:

   配置的是单条数据的类型

 

8.3. resultMap

实体的属性名和数据库的字段不匹配时使用resultMap

9.     动态SQL

不管是使用什么标签的组成,重点在最后拼接出来的SQL.重点查看拼接的结果.

9.1. 什么是动态SQL

根据条件组合成一条SQL语句,这种情况我们称之为动态SQL.

9.2. 动态SQL的作用

作用就是提高SQ语句的重用性,从而减少编写代码.

9.3. 动态sql的使用

在动态sql标签中使用参数,不使用占位符

1.1.12.           <sql>片段

定义一个共用的SQL语句块

需求:定义公共的查询sql片段

定义

 

使用

通过include标签引入sql片段

 

 

1.1.13.           <if> <set>标签的使用

 set标签会根据情况自动忽略最后一个逗号

需求:实现一个这个样的update语句,如果参数值为空的时候,不修改.如果参数不为空的值才修改

分析: <if> <set>

 

If标签用来判断传入参数的属性是否为空

Set标签

   1、自动给我们sql 加上set 关键字

   2、把最后一个set语句的逗号删除

 

使用

 

 

1.1.14.           <choose> <when><otherwise>标签的使用

类似与

if (条件1){

  //如果条件1成立,条件2就不会执行了

}else if(条件2)

  //如果条件1不成立,条件2成立

else{

 //条件1,条件2都不成立

 

 

需求:查询一个的信息如果学生的名字不为空,那么就使用学生的名字查询,如果学生的名字为空,性别不为空,那么使用性别查询,如果学生的名字和性别都为空,那么查询年龄大于18的学生

分析: <choose> <when> <otherwise> <where>

 

 

 

1.1.15.           <where>标签的使用

where标签在多个条件拼接的时候使用

 

需求:查询一个学生的信息如果学生的名字不为空,那么就使用学生的名字查询,如果性别也不为空,那么使用性别+名字查询,如果学生年龄也不为空,那么使用名字+性别+年龄,如果名字性别年龄都为空就全表查询

 

where标签:

  1.、给sql语句加上where关键字

  2、删掉第一个and,or 关键字

 

 

 

1.1.16.           <foreach>标签

在statement通过foreach遍历parameterType中的集合类型。

 

需求:批量增加,传入一个集合的学生,将多个学生同时插入到数据库

 

批量删除

  需求:通过学生id进行批量删除

集合实现

   Mapper.xml代码

 

   Mapper.java代码

 

  数组实现

Mapper.xml

 

Mapper.java

 

 

批量增加

 需求:批量插入学生信息

实现代码

Mapper.xml

 

Mapper.java

 

 

 

注意事项

 

 1、传入参数为集合时,collection属性的值为:list/collection

 2、传入参数为数组时,collection属性的值为:array

 3、无论传入的参数时数组还是集合,parameterType的参数可以为:collection/list

 

 

 

 

10. 缓存

10.1.   什么是缓存

缓存就是将数据放在内存的缓冲区或文件上.查询时,如果数据已经存在,就不会再去查询数据库.

 

10.2.   缓存的作用

将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。

 

10.3.   缓存的分类

 

mybatis一级缓存是一个SqlSession级别,sqlsession只能访问自己的一级缓存的数据,二级缓存是跨sqlSession,是mapper级别的缓存,对于mapper级别的缓存不同的sqlsession是可以共享的。

 

10.4.   一级缓存

一级缓存默认是打开的一级缓存就是会话(Session)级别的缓存,就是说,同一个会话数据会缓存在缓冲区,只要会话(Session)不关闭,不管查询N次数据库,其实都是只查询了一次.

 

关闭一级缓存三种方式

1.通过session.clearCache();

2.操作数据库(增删改) commit()操作

3.通过关闭session.close();

 

 

10.5.   二级缓存

Mybatis里面,二级缓存就是文件级别的缓存.就是将每一个mapper映射文件查询的结果缓存在缓存区.即使关闭了会话(session),缓存也还在.

 

默认情况:只要发生了增,删,改,才会清除缓存.

 

1.1.17.           配置二级缓存的步骤

1.必须将缓存的实体类加上序列化接口

import java.io.Serializable;

 

2.映射文件配置缓存的支持

 

3.配置启动二级缓存,新版本已经是true(可以不配)

 

 

1.1.18.           禁用二级缓存

  对于查询频率较高的sql,需要禁用二级缓存。

  useCache="false"

1.1.19.           刷新二级缓存

 增,删,改操作(commit操作)刷新缓存

     在insert/delete/update设置 flushCache="false"

1.1.20.           二级缓存应用场景

对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。

 

10.6.   Mybatis整合第三方缓存框架ehcache

配置

1.引入ehcache的jar包

2.配置mapper里的cache标签

 

注意事项:

  Ehcache需要使用slf4j的日志支持

 

 

11. 高级查询

11.1.   高级查询是什么

高级查询就是在Mybatis的映射文件配置,一对一,一对多,多对多这几种表关联关系的配置

 

11.2.   配置支持驼峰命名法

骆驼命名法就是将字段user_name 能够使用实体类的 userName属性接收

配置信息

<!-- 配置全局的参数 -->

<settings>

<!-- 配置支持驼峰命名法 -->

<setting name="mapUnderscoreToCamelCase" value="true"/>

<!-- 配置输出日志 -->

<setting name="logImpl" value="LOG4J"/>

</settings>

 

11.3.   数据库关系图

 

11.4.   一对一

需求:一个学生对应一个地址

 

在实体类加上关系

 

 

编写sql

 

编写mapper.xml

第一种:

第二种:

第三种(延迟加载的时候使用):

 

11.5.   一对多

需求:一个学生对应多个课程

在实体类上加上一对多关系

 

编写sql

编写mapper.xml

第一种:

第二种:(延迟加载的时候使用)

 

 

 

12. 延迟加载

  按需加载

12.1.   延迟加载的意义

在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。

 

如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。

 

mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载

 

12.2.   配置延迟加载

设置项

描述

允许值

默认值

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。

true | false

false

aggressiveLazyLoading

当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载

true | false

true

 

    <!-- 全局配置参数 -->

    <settings>

         <!-- 延迟加载总开关 -->

         <setting name="lazyLoadingEnabled" value="true" />

         <!-- 设置按需加载 -->

         <setting name="aggressiveLazyLoading" value="false" />

    </settings>

注意事项:

   Mybatis的延迟加载只有使用resultMap 映射一对一,一对多时,

   associationcollection 中必须使用select属性

 

 

13. Mybaits注解使用详解

13.1.   @Param使用

绑定多个参数的时候使用

 

   原理:把参数封装到Map,注解中的参数就是map的key

 

   需求:实现分页查询

Mapper.java

 

Mapper.xml

 

13.2.   简单的增删改查注解

@Select

@Update

@Delete

@Insert

 

13.3.   结果集映射的注解

xml ---->    resultMap

Annotation --->   @Results

1.1.21.           映射结果集

 

1.1.22.           一对一查询

 

1.1.23.           一对多查询

 

 

13.4.   动态sql的注解

1.1.24.           @SelectProvider

Mapper.java

 

Provider.java

 

1.1.25.           @UpdateProvider

Mapper.java

 

Provider.java

 

 

1.1.26.           @DeleteProvider

Mapper.java

 

Provider.java

 

 

1.1.27.           @InsertProvider

Mapper.java

 

Provider.java

 

 

14. 逆向工程

mybatis官方为了提高开发效率,提高自动对单表生成sql,包括 :mapper.xml、mapper.java、表名.java(实体类)

 

1.第一步打开eclipse的插件市场

2、搜索mybaits-generator插件,并安装

3.耐心等待...

4.新建工程加入jar包

 

generatorConfig.xml代码

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

  <context id="context1">

  <!-- 取消注释 -->

  <!-- org.mybatis.generator.config.PropertyRegistry -->

  <commentGenerator>

    <property name="suppressAllComments" value="true"/>

  </commentGenerator>

  <!-- 数据库连接 -->

    <jdbcConnection connectionURL="jdbc:mysql://localhost:3307/mybatis_clazz_day03" driverClass="com.mysql.jdbc.Driver" password="root" userId="root" />

     <!-- 实体类的目录 -->

    <javaModelGenerator targetPackage="com.ysjt.entity" targetProject="mybatis_demo20_day05_generator" />

    <!-- 映射文件的目录 -->

    <sqlMapGenerator targetPackage="com.ysjt.mapper.xml" targetProject="mybatis_demo20_day05_generator">

         <property name="enableSubPackages" value="true" />

    </sqlMapGenerator>

    <!-- 映射接口的目录

    type:表示生成策略,

       XMLMAPPER       配置xml

       ANNOTATEDMAPPER  配置注解

    targetPackage:存放的包

    targetProject:项目名

    -->

    <javaClientGenerator targetPackage="com.ysjt.mapper" targetProject="mybatis_demo20_day05_generator" type="ANNOTATEDMAPPER" />

    <table  tableName="student" enableCountByExample="false" enableSelectByExample="false" enableUpdateByExample="false"  enableDeleteByExample="false"></table>

    <table tableName="course"  enableCountByExample="false" enableSelectByExample="false" enableUpdateByExample="false"  enableDeleteByExample="false"></table>

    <table tableName="teacher"  enableCountByExample="false" enableSelectByExample="false" enableUpdateByExample="false"  enableDeleteByExample="false"></table>

    <table tableName="address"  enableCountByExample="false" enableSelectByExample="false" enableUpdateByExample="false"  enableDeleteByExample="false"></table>

  </context>

</generatorConfiguration>

 

选中generatorConfig.xml右键

 

15. 整理知识点

15.1.   使用的settings

<!-- 配置全局的参数 -->

<settings>

    <!-- 配置全局缓存开关 -->

    <setting name="cacheEnabled" value="true"/>

    <!-- 延迟加载总开关 -->

    <setting name="lazyLoadingEnabled" value="true" />

    <!-- 设置按需加载 -->

    <setting name="aggressiveLazyLoading" value="false" />

    <!-- 配置驼峰命名 -->

    <setting name="mapUnderscoreToCamelCase" value="true"/>

    <!-- 配置输出日志 -->

    <setting name="logImpl" value="LOG4J"/>

</settings>

 

15.2.   jdbcType的属性

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值