MyBatis

文章目录

  • MyBatis
    • 一.简介
      • 1.什么是MyBatis
      • 2.持久化
      • 3.持久层
      • 4.为什么需要MyBatis
      • 5.特点
    • 二.第一个MyBatis程序
      • 1.搭建环境
      • 2.创建模块
      • 3.编写代码
      • 4.测试
    • 三.CRUD
      • 1.namespace
      • 2.增删改查语句
      • 3.万能的Map
      • 4.模糊查询
    • 四.配置解析
      • 1.核心配置文件
      • 2.环境配置(environments)
        • 事务管理器(transactionManager)
        • 数据源(dataSource)
      • 3.属性(properties)
      • 4.类型别名(typeAliases)
      • 5.设置(settings)
      • 6.其他配置
      • 7.映射器(mappers)
      • 8.作用域(Scope)和生命周期

一.简介

1.什么是MyBatis

  • MyBatis 是一款优秀的持久层框架

  • 它支持自定义 SQL、存储过程以及高级映射

  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

  • MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。

  • 2013年11月迁移到Github。

如何获得Mybatis

  • maven仓库
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version>
</dependency>
  • Github:链接
  • 中文文档:链接

2.持久化

数据持久化:

  • 持久化就是将程序在持久状态和瞬时状态转化的过程
  • 内存:断电即失
  • 数据库(jdbc),io文件持久化

为什么需要持久化:

  • 有些对象非常重要,不能让他丢失
  • 内存昂贵

3.持久层

Dao层,service层,control层

  • 完成持久化工作的代码块,就叫持久层
  • 层界限十分明显

4.为什么需要MyBatis

  • 帮助程序员将数据存入到数据库中
  • 方便
  • 传统的jdbc代码太复杂,为了简化

5.特点

  • 简单易学:
  • 灵活:
  • sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射。
  • 提供对象关系映射标签,支持对象关系组建维护。
  • 提供xml标签,支持编写动态sql

二.第一个MyBatis程序

思路:搭建环境->导入MyBatis->编写代码->测试

1.搭建环境

搭建数据库

CREATE DATABASE `mybatis`;USE `mybatis`;CREATE TABLE `user` (`id` INT ( 20 ) NOT NULL,`name` VARCHAR ( 30 ) DEFAULT NULL,`pwd` VARCHAR ( 30 ) DEFAULT NULL,PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8;INSERT INTO `user`(`id`,`name`,`pwd`) VALUES(1,'张三','123456'),(2,'李四','123456'),(3,'王五','123456');

新建项目:


删除src目录,将此项目作为父目录

导入Maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!--父工程--><groupId>org.example</groupId><artifactId>MyBatis_Study</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies><!--在build中配置resources,来防止我们资源导出失败的问题--><build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include><include>**/*</include></includes></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources></build>
</project>

2.创建模块

同样创建一个maven模块

如果模块中没有parent则需要手动添加,可能是idea版本问题

编写mybatis核心配置文件

官方文档提供:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//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="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>

修改为自己的

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--core configuration file-->
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;characterEncoding=UTF-8&amp;useUnicode=true&amp;serverTimezone=GMT"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!--每一个mapper.xml都需要在MyBatis核心配置文件中注册--><mappers><mapper resource="com/mnm/dao/UserMapper.xml"/></mappers>
</configuration>

编写mybatis的工具类

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();}}public static SqlSession getSqlSession(){return sqlSessionFactory.openSession();}
}

3.编写代码

  • 实体类

public class User {private int id;private String name;private String pwd;public User(int id, String name, String pwd) {this.id = id;this.name = name;this.pwd = pwd;}public User() {}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", pwd='" + pwd + '\'' +'}';}
}
  • Dao接口
import com.mnm.pojo.User;import java.util.List;public interface UserDao {List<User> getUserList();
}
  • 接口实现类

由原来的UserDaoImpl转变为一个Mapper配置文件
官方文档内容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper"><select id="selectBlog" resultType="Blog">select * from Blog where id = #{id}</select>
</mapper>

稍加修改为自己的
UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mnm.dao.UserDao"><select id="getUserList" resultType="com.mnm.pojo.User">select * from user</select>
</mapper>

4.测试

import com.mnm.pojo.User;
import com.mnm.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class UserDaoTest {@Testpublic void test(){//1.获得sqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();//2.执行sqlUserDao userDao = sqlSession.getMapper(UserDao.class);List<User> userList = userDao.getUserList();for (User user : userList) {System.out.println(user);}sqlSession.close();}
}

三.CRUD

1.namespace

namespace中的包名要和dao/mapper接口的包名一致!

2.增删改查语句

查询语句

  • id:是对应的namespace中的方法名
  • resuletType:sql语句执行的返回值
  • parameterType:参数类型

将UserDao重命名为UserMapper后

UserMapper文件内容:

import com.mnm.pojo.User;import java.util.List;public interface UserMapper {//查询全部用户List<User> getUserList();//根据Id查询用户List<User> getUserById(int id);//添加用户int addUser(User user);//修改用户int updateUser(User user);//删除用户int deleteUser(int id);
}

UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mnm.dao.UserMapper"><select id="getUserList" resultType="com.mnm.pojo.User">select * from user</select><select id="getUserById" resultType="com.mnm.pojo.User" parameterType="int">select * from user where id=#{id}</select><insert id="addUser" parameterType="com.mnm.pojo.User">insert into user (id, name, pwd) VALUES (#{id},#{name},#{pwd})</insert><update id="updateUser" parameterType="com.mnm.pojo.User">update user set name=#{name},pwd=#{pwd} where id=#{id}</update><delete id="deleteUser" parameterType="int">delete from user where id=#{id}</delete>
</mapper>

UserDaoTest 测试类代码

import com.mnm.pojo.User;
import com.mnm.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class UserDaoTest {@Testpublic void test(){//1.获得sqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();//2.执行sqlUserMapper userDao = sqlSession.getMapper(UserMapper.class);List<User> userList = userDao.getUserList();for (User user : userList) {System.out.println(user);}sqlSession.close();}@Testpublic void getUserById(){//1.获得sqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();//2.执行sqlUserMapper userDao = sqlSession.getMapper(UserMapper.class);List<User> userList = userDao.getUserById(2);for (User user : userList) {System.out.println(user);}sqlSession.close();}@Testpublic void addUser(){//1.获得sqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);mapper.addUser(new User(4, "赵六", "123456"));sqlSession.commit();sqlSession.close();}@Testpublic void updateUser(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);mapper.updateUser(new User(4,"六六","234567"));sqlSession.commit();sqlSession.close();}@Testpublic void deleteUser(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);mapper.deleteUser(4);sqlSession.commit();sqlSession.close();}
}

注意:增删改需要提交事务

3.万能的Map

假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map

import com.mnm.pojo.User;import java.util.List;
import java.util.Map;public interface UserMapper {//添加用户2,有大量字段int addUser2(Map<String,Object> map);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mnm.dao.UserMapper"><!--添加用户2,有大量字段,传递map的key--><insert id="addUser2" parameterType="map">insert into user (id,name,pwd) VALUES (#{userId},#{userName},#{passWord})</insert>
</mapper>

测试类

import com.mnm.pojo.User;
import com.mnm.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class UserDaoTest {@Testpublic void addUser2(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);HashMap<String, Object> map = new HashMap<>();map.put("userId",4);map.put("userName","赵六");map.put("passWord","123456");mapper.addUser2(map);sqlSession.commit();sqlSession.close();}
}

Map传递参数,直接在sql中取出key即可
对象传递参数,直接在sql中取对象的属性即可
只有一个基本类型参数的情况下,可以直接在sql中取到

4.模糊查询

import com.mnm.pojo.User;import java.util.List;
import java.util.Map;public interface UserMapper {//模糊查询List<User> getUserLike(String value);
}

UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mnm.dao.UserMapper"><!--模糊查询--><select id="getUserLike" parameterType="String" resultType="com.mnm.pojo.User">select * from user where name like concat('%',#{value},'%')</select>
</mapper>
import com.mnm.pojo.User;
import com.mnm.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class UserDaoTest {@Testpublic void getUserLike(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> userLike = mapper.getUserLike("李");for (User user : userLike) {System.out.println(user);}sqlSession.close();}
}
---------------结果---------------
User{id=2, name='李四', pwd='123456'}

四.配置解析

1.核心配置文件

mybatis-config.xml
Mybatis 的配置文件包含了会深深影响Mybatis行为的设置和属性信息

  • configuration(配置)

    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)

        • transactionManager(事务管理器)
        • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)

2.环境配置(environments)

MyBatis 可以配置成适应多种环境,尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

注意一些关键点:

  • 默认使用的环境 ID(比如:default=“development”)。
  • 每个 environment 元素定义的环境 ID(比如:id=“development”)。
  • 事务管理器的配置(比如:type=“JDBC”)。
  • 数据源的配置(比如:type=“POOLED”)。

事务管理器(transactionManager)

在 MyBatis 中有两种类型的事务管理器

JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。

如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器

数据源(dataSource)

dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

如:dbcp,c3p0,druid,hikari 都用来连接数据库

有三种内建的数据源类型(也就是 type=“[UNPOOLED|POOLED|JNDI]”):

  • UNPOOLED– 这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢

  • POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。

  • JNDI – 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。

Mybatis默认的事务管理器就是JDBC,连接池:POOLED

3.属性(properties)

我们可以通过properties属性来引用配置文件
这些属性可以在外部进行配置且可以进行动态替换,既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。

编写一个配置文件:
db.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&characterEncoding=UTF-8&useUnicode=true&serverTimezone=GMT
username=root
password=root

在核心配置文件中引入

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--core configuration file--><configuration><!--引入外部配置文件--><properties resource="db.properties"/><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!--每一个mapper.xml都需要在MyBatis核心配置文件中注册--><mappers><mapper resource="com/mnm/dao/UserMapper.xml"/></mappers>
</configuration>

4.类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--core configuration file--><configuration><!--引入外部配置文件--><properties resource="db.properties"/><!--可以给实体类起别名--><typeAliases><typeAlias type="com.mnm.pojo.User" alias="User"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!--每一个mapper.xml都需要在MyBatis核心配置文件中注册--><mappers><mapper resource="com/mnm/dao/UserMapper.xml"/></mappers>
</configuration>

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean

每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。见下面的例子:

@Alias("author")
public class Author {...
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--core configuration file--><configuration><!--引入外部配置文件--><properties resource="db.properties"/><!--可以给实体类起别名--><typeAliases><package name="com.mnm.pojo"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!--每一个mapper.xml都需要在MyBatis核心配置文件中注册--><mappers><mapper resource="com/mnm/dao/UserMapper.xml"/></mappers>
</configuration>


在实体类比较少的时候,使用第一种方式
如果实体类非常多,建议使用第二种方式,且可通过注解来DIY别名

下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

别名 映射的类型
_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

5.设置(settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

<settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/><setting name="multipleResultSetsEnabled" value="true"/><setting name="useColumnLabel" value="true"/><setting name="useGeneratedKeys" value="false"/><setting name="autoMappingBehavior" value="PARTIAL"/><setting name="autoMappingUnknownColumnBehavior" value="WARNING"/><setting name="defaultExecutorType" value="SIMPLE"/><setting name="defaultStatementTimeout" value="25"/><setting name="defaultFetchSize" value="100"/><setting name="safeRowBoundsEnabled" value="false"/><setting name="mapUnderscoreToCamelCase" value="false"/><setting name="localCacheScope" value="SESSION"/><setting name="jdbcTypeForNull" value="OTHER"/><setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

官方文档中非常多,这里记录一些可能要用的:

设置名 描述 有效值 默认值
cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true/false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 true /false false
useColumnLabel 使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。 true /false true
useGeneratedKeys 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 true / false False
mapUnderscoreToCamelCase 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 true /false False
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J / LOG4J(deprecated since 3.5.9) /LOG4J2 / JDK_LOGGING / COMMONS_LOGGING /STDOUT_LOGGING / NO_LOGGING 未设置

6.其他配置

typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)

  • MyBatis Plus
  • MyBatis Generator Core
  • 通用mapper

7.映射器(mappers)

MapperRegistry:注册绑定我们的Mapper文件

方式一:使用相对于类路径的资源引用

<!--每一个mapper.xml都需要在MyBatis核心配置文件中注册-->
<mappers><mapper resource="com/mnm/dao/UserMapper.xml"/>
</mappers>

方式二:使用映射器接口实现类的完全限定类名
使用class文件绑定注册

<mappers><!--<mapper resource="com/mnm/dao/UserMapper.xml"/>--><mapper class="com.mnm.dao.UserMapper"/>
</mappers>

注意点:接口和他的mapper配置文件,必须同名,且在同一个包下

方式三:将包内的映射器接口实现全部注册为映射器
使用扫描包进行注册

<mappers><!--<mapper resource="com/mnm/dao/UserMapper.xml"/>--><!--<mapper class="com.mnm.dao.UserMapper"/>--><package name="com.mnm.dao"/>
</mappers>

注意点:接口和他的mapper配置文件,必须同名,且在同一个包下

8.作用域(Scope)和生命周期

生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题

SqlSessionFactoryBuilder

  • 一旦创建了 SqlSessionFactory,就不再需要它了
  • 局部变量

SqlSessionFactory

  • SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
  • 类似数据库连接池
  • 因此 SqlSessionFactory 的最佳作用域是应用作用域。
  • 最简单的就是使用单例模式或者静态单例模式。

SqlSession

  • 连接到连接池的一个请求
  • 请求完需要关闭请求
  • SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域
  • 用完之后要赶紧关闭,否则资源被占用

换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

这里面的每一个Mapper,就代表一个具体的业务.

MyBatis(一)相关推荐

  1. mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string

    mybatis查询报错: com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from strin ...

  2. MyBatis的插入后获得主键的方式

    需求: 使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法: 在mapper中指定keyProperty属性,示例如下: <insert id=" ...

  3. mybatis使用注解开发

    mybatis使用注解开发 面向接口编程 在之前我们是通过面向对象编程,但是在真正开发的时候我们会选择面向接口编程. 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的 ...

  4. mybatis ResultMap

    ResultMap 解决属性名和字段的名称不一致的问题. 查询为null的问题 创建java实体类: public class User {private int id; //idprivate St ...

  5. mybatis配置文件解析

    mybatis配置文件解析 mybatis核心配置文件`mybatis-config.xml文件. mybatis的配置文件包含了会深深影响mybatis行为的设置和属性信息. 能配置的内容: con ...

  6. mybatis CRUD操作

    mybatis CRUD操作 select select标签是mybatis最常用的标签之一. select语句有很多属性可以详细的配置每一天sql语句. id 命名空间唯一的标识. 接口中的方法名与 ...

  7. java mybatis基础

    java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...

  8. mybatis的资源过滤错误及xml文件编码错误

    mybatis 解决maven项目内资源过滤的问题 写的配置文件无法被导出或者生效的问题. 解决方案: <build><resources><resource>&l ...

  9. Mybatis传递多个参数的4种方式

    现在大多项目都是使用Mybatis了,但也有些公司使用Hibernate.使用Mybatis最大的特性就是sql需要自己写,而写sql就需要传递多个参数.面对各种复杂的业务场景,传递参数也是一种学问. ...

  10. SpringBoot (五) :SpringBoot整合mybatis

    说在前面 mybatis刚开始使用的时候比较麻烦,需要各种配置文件.实体类.dao层映射关联.还有一大推其它配置.初期开发了generator可以根据表结果自动生产实体类.配置文件和dao层代码,可以 ...

最新文章

  1. swift 多线程GCD和延时调用
  2. flume源码学习8-hdfs sink的具体写入流程
  3. 小巫新闻客户端底部菜单切换实现
  4. java实现随机验证码的图片
  5. 用Sql添加删除字段,判断字段是否存在的方法
  6. Android之INSTALL_FAILED_UPDATE_INCOMPATIBLE(pacakge:...do not match the previously installed version)
  7. 分支界限法0 1背包 c语言,分支限界法之布线问题(1)
  8. 复选框(checkbox)、单选框(radiobox)的使用
  9. 2019年知乎已发布两款App:短视频“即影”和男生种草“CHAO”
  10. 进程与服务的签名_服务器被黑客攻击后如何查找溯源攻击
  11. Android ListView更改item背景颜色
  12. 代码换行符_Excel办公技巧:如何定位、替换、清除单元格中的换行符?
  13. SIM卡高速PCB设计指南
  14. 企业级代码静态测试工具Helix QAC——关键特性
  15. 不等式解集怎么取_(√)口诀巧取不等式组的解集
  16. sendgrid html text,在Node.js中的SendGrid的“发件人”字段中添加名称
  17. vue页面分享微信朋友圈
  18. 比光刻机还重要的IP核是什么?
  19. python --给图片加文字
  20. SAP请求释放怎么撤回

热门文章

  1. 批处理脚本之批量打开常用软件
  2. 看一遍就懂,详解java多线程——volatile
  3. PAT 1074 宇宙无敌加法器
  4. webmatrix3 php,webmatrix
  5. 绿盟安全集中系统安装方法
  6. i9500android操作系统跑流量,四大手机安全软件谁更省流量?360手机卫士完胜
  7. 打印机批量扫描显示服务器超时,惠普打印机常见故障及解决方法,27年打印故障经验总结...
  8. Nacos Discovery教程
  9. 采用先进先出的退货问题
  10. 电容相位滞后?电感超前