目录html
前言java
一、properties属性mysql
1.1property子元素redis
四、插件mybatis
MyBatis配置文件并不复杂,它主要用来配置基本的上下文参数和运行环境,包含了影响 MyBatis行为甚深的设置(settings)和属性(properties)信息。
MyBatis的配置文件文档的顶层结构以下:
<configuration>: 配置
<properties/> 属性[主要设置二级缓存,目前应用较少,多使用redis缓存]♠
<settings/> [全局配置参数]♠
<typeAliases/> [类型别名]♠
<typeHandlers/> [类型处理器]♠
<objectFactory/> [对象工厂]
<plugins/> [插件]♠
<environments> [配置环境]♠
<environment> [环境变量]
<transactionManager> [事务管理器]
<dataSource> [数据源]
<environment/>
<environments/>
<databaseIdProvider/> [数据库厂商标识]
<mappers/> [映射器]♠
</configuration>
mappers [映射器]
在配置 mybatisConfig.xml 配置文件的时候,最关键的一点就是,必须按照上面标签的顺序进行配置。若是颠倒了它们的顺序,那么在MyBatis启动阶段就会发生异常。本节主要来了解Mybatis配置项的做用,其中propertis、settings、typeAliases、typeHandler、plugin、environments、mappers是经常使用的内容。
properties属性能够给系统配置一些运行参数,能够放在XML文件或者properties文件中,而不是放在Java编码中,这样的好处在于方便参数修改,而不用从新编译代码。通常而言,MyBatis提供了3种方式让咱们使用properties:
使用properties子元素将数据库链接的相关配置进行改写,以下:
<?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> <!-- ================properties配置=================== --> <!--♠♠方式1: 引用java属性的文件db.properties <properties resource="db.properties" /> --> <!--♠方式2: 在<propties>标签下的子元素<propertie>定义数据库配置的name和value 若是属性参数有成千上百个,该方式不是最优的,建议使用方式1,经过java属性文件导入方式。 --> <properties> <proper name="jdbc.driver" value="com.mysql.jdbc.Driver"></proper> <proper name="jdbc.url" value="jdbc:mysql://localhost:3306/boot_security?characterEncoding=utf-8"></proper> <proper name="jdbc.username" value="root"></proper> <proper name="jdbc.password" value="root"></proper> </properties> <!--♠♠♠方式3:代码传递方式传递参数 建立SqlSessionFactory时,将配置信息重置到properties属性中。 --> <!-- ============数据库环境配置============== --> <!-- 数据库环境--> <environments default="development"> <environment id="development"> <!-- 使用JDBC事务管理器--> <transactionManager type="JDBC" /> <!-- <transactionManager type="MANAGED" /> --> <!-- 数据库链接池--> <!-- <dataSource type="UNPOOLED">采用非数据库池的管理方式 --> <!-- <dataSource type="JNDI"> --> <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> </environment> </environments> </configuration>
这里咱们看properties属性设置的方式2,这里使用了元素<properties>下的子元素<propertis>定义,用字符串jdbc.username定义数据库用户名,而后就能够在数据库定义中引入这个已经定义好的属性参数,如${jdbc.username},这样定义一次就能够处处引用了。
弊端:若是属性参数有几百个、几千个、这并非最好的选择,这个时候可使用properties文件
使用properties文件,其逻辑就是键值对应,咱们能够配置多个键值放在一个properties文件中,也能够把多个键值放在多个properties文件中,以便往后维护和修改。
建立一个db.properties文件,放在classpath的路径下。
db.properties文件以下:
#配置数据源 #key-value形式 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/boot_security?characterEncoding=utf-8 jdbc.username=root jdbc.password=root
在MyBatis中经过<properties>的属性resource来引入properties文件。以下properties属性设置的方式1所示:
<?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> <!-- ================properties配置=================== --> <!--♠♠方式1: 引用java属性的文件db.properties --> <properties resource="db.properties" /> <!--♠方式2: 在<propties>标签下的子元素<propertie>定义数据库配置的name和value 若是属性参数有成千上百个,该方式不是最优的,建议使用方式1,经过java属性文件导入方式。 <properties> <proper name="jdbc.driver" value="com.mysql.jdbc.Driver"></proper> <proper name="jdbc.url" value="jdbc:mysql://localhost:3306/boot_security?characterEncoding=utf-8"></proper> <proper name="jdbc.username" value="root"></proper> <proper name="jdbc.password" value="root"></proper> </properties> --> <!--♠♠♠方式3:代码传递方式传递参数 建立SqlSessionFactory时,将配置信息重置到properties属性中。 --> <!-- ============数据库环境配置============== --> <!-- 数据库环境--> <environments default="development"> <environment id="development"> <!-- 使用JDBC事务管理器--> <transactionManager type="JDBC" /> <!-- <transactionManager type="MANAGED" /> --> <!-- 数据库链接池--> <!-- <dataSource type="UNPOOLED">采用非数据库池的管理方式 --> <!-- <dataSource type="JNDI"> --> <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> </environment> </environments> </configuration>
也能够按照${jdbc.username}的方法引入properties文件的属性参数到MyBatis配置文件中。这个时候经过维护properties文件就能够维护咱们的配置内容了。
真实的生产环境中,数据库的用户密码是对开发人员和其余人员保密的。运维人员为了保密,通常都须要把用户和密码通过加密成为密文后,配置到properties文件中。对于开发人员及其余人员而言,就不知道其真实的用户密码了,数据库也不可能使用已经加密的字符串去链接,此时每每须要经过解密才能获得真实的用户和密码了。如今假设系统己经为提供了这样的一个CodeUtils.decodes(str)进行解密,那么咱们在建立SqlSessionFactory前,就须要把用户名和密码解密,而后把解密后的字符串重置到properties属性中,以下所示:
String resource = "mybatisConfig.xml"; InputStream inputStream = Resources.getResourceAsStream("jdbc.properties"); Properties prop = new Properties(); prop.load(inputStream ); String username = prop.getProperty("jdbc.username"); String password = prop.getProperty("jdbc.password"); //解密用户和密码,并在属性中重置 prop.put("jdbc.username",CodeUtils.decode(username)); prop.put("jdbc.password",CodeUtils.decode(password)); inputStream = Resources.getResourceAsStream(resource); //使用程序传递的方式覆盖原有的properties属性参数 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,prop);
优先使用程序传递方式,其次使用properties文件的方式,最后是使用property子元素的方式。
settings是MyBatis中最复杂的配置,大部分状况下使用默认值便可运行,不须要大量配置它,只需修改一些经常使用的规则便可,好比自动映射、驼峰命名、级联规则、是否启动缓存、执行器类型等。
<?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> <!-- ===========================================Setting设置================================================= --> <settings> ====>开启驼峰规则与下划线间的映射关系 <setting name="mapUnderscoreToCamelCase" value="true"/> 设置jdbc与数据库的关系类型 mysql不须要配置 Oracle须要 <setting name="jdbcTypeForNull" value="NULL"/> 设置懒加载 优化速度 当开启时,全部关联对象都会延迟加载。 特定关联关系中可经过设置fetchType属性来覆盖该项的开关状态。默认值false <setting name="lazyLoadingEnabled" value="true"/> 设置懒积极加载为消极加载 优化速度 <setting name="aggressiveLazyLoading" value="false"/> ====>该配置影响的全部映射器中配置的缓存的全局开关。默认值true <setting name="cacheEnabled" value="true"/> 是否容许单一语句返回多结果集(须要兼容驱动)。 默认值true <setting name="multipleResultSetsEnabled" value="true"/> 使用列标签代替列名。不一样的驱动在这方面会有不一样的表现, 具体可参考相关驱动文档或经过测试这两种不一样的模式来观察所用驱动的结果。默认值true <setting name="useColumnLabel" value="true"/> ====>容许 JDBC 支持自动生成主键,须要驱动兼容。 若是设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工做(好比 Derby)。 默认值false <setting name="useGeneratedKeys" value="false"/> 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(不管是否嵌套)。 默认值PARTIAL <setting name="autoMappingBehavior" value="FULL"/> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。默认SIMPLE <setting name="defaultExecutorType" value="SIMPLE"/> 设置超时时间,它决定驱动等待数据库响应的秒数。 <setting name="defaultStatementTimeout" value="25"/> ====>容许在嵌套语句中使用分页(RowBounds)默认值False <setting name="safeRowBoundsEnabled" value="false"/> ====>容许在嵌套语句中使用分页(ResultHandler)默认值False <setting name="safeResultHandlerEnabled" value="false"/> ====>MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种状况下会缓存一个会话中执行的全部查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不一样调用将不会共享数据。 <setting name="localCacheScope" value="SESSION"/> 指定哪一个对象的方法触发一次延迟加载。 <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> </settings> </configuration>
当类的全限定名称很长,须要大量使用的时候,总写那么长的名称不方便。此时,MyBatis容许定义一个简写来表明这个类,这就是别名。
<?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> <!-- ========================================typeAliases别名设置============================================= --> <!-- 定义实体类的别名:系统定义别名,或者自定义别名 --> <!--方式1:定义单个POJO实体类的别名 引入POJO实体类的类全路径和别名后,其对应的映射文件中resutlType返回结果的类型应当为alise定义的别名 type:实体类的全路径名称 alias:别名 <typeAlias type="com.mybatis.model.SysUser" alias="user"/> --> <typeAliases> <!-- 按ID查询用户,使用单个POJO实体类别名方式定义,对须要起别名的类单独配置 --> <typeAlias alias="sysUser" type="com.mybatis.pojo.SysUser"/> <typeAlias alias="sysRole" type="com.mybatis.pojo.SysRole" /> </typeAliases> <!--方式2:使用“包扫描”的方式批量定义别名,定义后别名等于类名,不区分大小写,建议按照驼峰命名约束进行命名 能够配合mybatis的注解@Alias("xxx")进行区分,进而避免别名重名致使的扫描失败的问题 <typeAliases> <package name="com.mybatis.pojo" /> </typeAliases> --> </configuration>
插件是最为强大和灵活的组件,同时也是最复杂、最难使用的组件,并且它十分危险,由于插件将覆盖MyBatis底层对象的核心方法和属性,操做不当将产生严重后果,甚至是摧毁MyBatis框架。因此在研究插件以前,咱们要弄清楚MyBatis底层的构成和运行原理,不然将难以安全高效地使用它,后面将独立出一篇内容进行深刻探索。
在MyBatis中,运行环境主要的做用是配置数据库信息,它能够配置多个数据库,通常而言只须要配置其中一个便可。它又分为两个可配置的元素:【1】事务管理器(transactionManager);【2】数据源(dataSource)
在实际状况中,会使用Spring对数据源和数据库的事务进行管理。
运行环境配置(包含事务管理器、数据源)以下:
<!-- =================数据库环境配置================= --> <!-- 数据库环境--> <environments default="development"> <environment id="development"> <!-- 使用JDBC事务管理器--> <transactionManager type="JDBC" /> <!-- <transactionManager type="MANAGED" /> --> <!-- 数据库链接池--> <!-- <dataSource type="UNPOOLED">采用非数据库池的管理方式 --> <!-- <dataSource type="JNDI"> --> <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> </environment> </environments>
这里用到两个元素:transactionManager和environment
在MyBatis中,transactionManager提供了两个实现类,它须要实现接口:Transaction。
public insterface Transaction{ //获取链接 Connection getConnection() throw SQLException; //事务提交 void commit() throw SQLException; //回滚事务 void roolback() throw SQLException; //关闭事务 void close() throw SQLException; //超时 Integer getTimeout() throw SQLException; }
从方法可知,Trannsaction接口主要的工做就是提交、回滚、关闭数据库的事务。
MyBatis为Transaction提供了两个实现类:【1】JdbcTransaction;【2】ManageredTransaction
对应着两个工厂:JdbcTransactionFactory和ManageredTransactionFactory,这个工厂须要实现TransactionFactory接口,经过他们会生成对应的Transaction对象。因而能够把事务管理器配置成如下两种方式:
<transactionManager type="JDBC"/> <transactionManager type="MANAGED"/>
解释:
若是不想使用MyBatis的规则时,咱们能够这样配置:
<transactionManager type="com.learn.ssm.chapter4.transaction.MyTransactionFactory" />
自定义一个事务工厂:
public class MyTransactionFactory implements TransactionFactory{ @Override public Transaction newTransaction(Connection connection) { return new MyTransaction(connection); } @Override public Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit) { return new MyTransaction(dataSource,level,autoCommit); } @Override public void setProperties(Properties arg0) { } }
实现了工厂方法后,还须要一个事务实现类MyTransaction,用来实现Transaction接口:
public class MyTransaction extends JdbcTransaction implements Transaction{ public MyTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) { super(ds, desiredLevel, desiredAutoCommit); } public MyTransaction(Connection connection) { super(connection); } @Override protected void openConnection() throws SQLException { super.openConnection(); } @Override protected void resetAutoCommit() { super.resetAutoCommit(); } @Override protected void setDesiredAutoCommit(boolean arg0) { super.setDesiredAutoCommit(arg0); } @Override public void close() throws SQLException { super.close(); } @Override public void commit() throws SQLException { super.commit(); } @Override public Connection getConnection() throws SQLException { return super.getConnection(); } @Override public void rollback() throws SQLException { super.rollback(); } }
这样就可以经过自定义事务规则。
environment的主要做用是配置数据库。
MyBatis中,数据库经过PooledDataSourceFactory、UnpooledDataSourceFactory和JndiDataSourceFactory三个工厂类来提供,前二者对应产生PooledDataSource、UnpooledDataSource类对象,而JndiDataSourceFactory则会根据则DI的信息拿到外部容器实现的数据库链接对象。不管如何这三个工厂类,最后生成的产品都会是一个实现了DataSource接口的数据库链接对象。
因为存在三种数据源,可按照下面的形式配置它们:
<transactionManager type="UNPOOLED"/> <transactionManager type="POOLED"/> <transactionManager type="JNDI"/>
映射器定义命名空间(namespace),命名空间对应的是一个接口的全路径,而不是实现类。
所以,在配置Mapper映射器以前,咱们先定义一个Mapper接口:
/** * 映射器接口 */ public interface SysRoleMapper { /*[1.1]新增一条角色------->自定义主键*/ public int insertRole(SysRole sysRole); /*[1.2]新增一条角色------->自增主键*/ public int insertRole2(SysRole sysRole); /*[2]删除一条角色*/ public int deleteRole(Integer id); /*[3]修改一条角色*/ public int updateRole(SysRole sysRole); /*[4]查询一条角色*/ public SysRole getRole(Integer id); }
有了Mapper接口后,还须要mapper接口对应的XML映射文件:
<?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"> <!-- Mapper动态代理方式实现mybatis配置,使用mybatis接口、对应的ml映射文件、model实体类 namespace:命名空间[接口类的全路径], 做用:作sql隔离 Mapper接口代理实现编写规则: 1.映射文件中namespace名等于Mapper接口类的全路径; 2.映射文件中SQL语句要等于Mapper接口类的方法名称 3.映射文件中传入参数类型要等于Mapper接口类中方法的传入参数类型 4.映射文件中返回结果集类型要等于Mapper接口类中方法的返回类型 --> <mapper namespace="com.mybatis.mapper.SysRoleMapper"> <!-- ==========新增========== --> <!--insert:新增/插入数据,==========自定义主键========== id:通常对应接口中定义的SQL方法名称; parameterType:指定传入的参数类型; 子元素selectKey:支持自定义键值的生成规则。 keyProperty:将返回的主键放入传入参数的Id中保存【指定采用哪一个属性做为POJO的主键】; order:当前函数相对于SQL语句的执行顺序,在insert前执行的是BEFORE,在insert后执行的是AFTER 因为mybatis的自增原理执行完SQL语句后才将主键生成,因此使用selectKey的执行顺序为AFTER resultType:返回的主键id的类型,也就是keyProperties中id属性的类型 resultMap:用来描述从数据库结果集中来加载对象,它是最复杂、强大的元素【提供映射规则】 若是要返回数据库自增主键:可使用select LAST_INSERT_ID() 执行 select LAST_INSERT_ID()数据库函数,返回自增的主键 LAST_INSERT_ID():MySQL的函数,返回auto_increment自增列新记录id的值 #{}占位符:若是传入的是pojo实体类型,占位符中的变量名称必须是pojo实体类中对应的属性.属性.属性... --> <insert id="insertRole" parameterType="sysRole"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> select LAST_INSERT_ID() </selectKey> insert into sys_role(name,description,createTime,updateTime) values (#{name}, #{description}, #{createTime},#{updateTime}) </insert> <!-- insert:新增/插入数据,==========自增主键========== useGeneratedKeys:获取数据库生成的主键,若是存在多个主键,就用逗号隔开 --> <insert id="insertRole2" parameterType="sysRole" useGeneratedKeys="true" keyProperty="id"> insert into sys_role(name,description) values (#{name}, #{description}) </insert> <!-- ==========删除========== --> <!-- 按ID删除,parameterType传入参数类型=========>POJO类中角色关联表对应的id字段参数的类型 --> <delete id="deleteRole" parameterType="java.lang.Integer"> delete from sys_role where id = #{id} </delete> <!-- ==========修改========== --> <update id="updateRole" parameterType="sysRole"> update sys_role set name = #{name},description = #{description} where id = #{id} </update> <!-- ==========查询========== --> <!--<select>标签 id:sql语句惟一标识,通常为Mapper接口类中的查询方法名 parameterType:指定SQL方法传入的参数类型(或者指定传入的参数类型) resultType:指定返回结果集的类型,【常设置为实体类的全路径,返回指向的model类型】 #{}占位符:起到占位做用,若是传入的是基本类型(string,long,double,int,boolean,float等),那么#{}中的变量名称能够随意写。 resultType="sysRole",全局配置文件中,使用单个定义别名,也可使用model实体类的全路径,与核心配置文件中<typeAlias>标签中的alias命名一致 flushCache:调用SQL后,是否要求mybatis清空以前查询本地缓存和二级缓存,默认false useCache:启动二级缓存开关,是否将本次结果缓存,默认false --> <!-- ==========sql元素========== --> <!-- 只需编写一次,就能够在其余元素中引用它了 --> <sql id="roleCols"> id,name,description </sql> <select id="getRole" parameterType="java.lang.Integer" resultType="sysRole" flushCache="true"> select id,role_name as roleName from sys_role where id = #{id} <!-- ==========>>>>>使用sql元素<<<<<========== --> <!-- select <include refid="roleCols" /> from sys_role where id = #{id} --> </select> <!-- ==========list========== --> <!--按名称模糊查询 ,返回结果是集合 返回结果为集合时,能够调用selectList方法,这个方法返回的结果就是一个集合,因此映射文件中应该配置成集合泛型的类型 ${}拼接符:字符串原样拼接,若是传入的参数是基本类型(string,long,double,int,boolean,float等),那么${}中的变量名称必须是value 注意:拼接符有sql注入的风险,因此慎重使用 resultType="sysRole",全局配置文件中,使用包扫描的方式批量定义别名,不区分大小写,也可使用model实体类的全路径 --> <select id="findRolesByMap" parameterType="map" resultType="sysRole"> select id,name as name,description createTime as createTime,updateTime as updateTime where name like concat('%',#{name},'%') and description like concat('%',#{description},'%') </select> <!-- ==========注解方式传递多个参数========== --> <select id="findRolesByAnnotation" resultType="sysRole"> select id,name as name,description from sys_role where name like concat('%',#{name},'%') and description like concat('%',#{description},'%') </select> <!-- ==========Java Bean方式传递多个参数========== --> <select id="findRoleByBean" parameterType="com.mybatis.pojo.SysRole"> select id,name,description from sys_role where name like concat('%',#{name},'%') and description like concat('%',#{description},'%') </select> <!-- ==========混合使用的方式传递多个参数========== --> <select id="findRoleByMix" resultType="sysRole"> select id,name as name,description from sys_role where name like concat('%',#{name},'%') and description like concat('%',#{description},'%') limit #{page.start},#{page.limit} </select> <!-- ==========混合使用的方式传递多个参数========== --> <!-- ==========使用resultMap做为映射结果集========== --> <!-- resultMap:定义了一个roleMap,它的属性id表示它的标积, type表示使用哪一个类做为其映射的类,能够是全名或者全限定名 子元素id:表示resultMap的主键 result:表示其属性 property:表示model/POJO的属性名称 column:表示SQL的列名。把POJO的属性和SQL的列名作对应 select元素中,resultMap制定了采用哪一个resultMap做为其映射规则 --> <!-- <resultMap id="roleMap" type="sysRole"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="description" column="description"/> </resultMap> <select id="getRole" parameterType="java.lang.Integer" resultMap="roleMap"> select id,role_name as roleName from sys_role where id = #{id} </select> --> <!-- ==========分页参数RowBounds========== --> <select id="findRoleByRowBounds" resultSets="sysRole"> select id,name as name,description as description from sys_role where name like concat('%',#{name},'%') and description like concat('%', #{description},'%') </select> </mapper>
有了Mapper接口和映射文件后,咱们须要在mybatis的基础配置文件中引入Mapper映射器,引入Mapper映射器的方法不少,通常分为如下几种:
<!-- ==========================================mapper映射器配置=============================================== --> <!-- Mapper映射器,加载核心映射配置文件 --> <mappers> <!--方式1:经过文件路径引入映射器 原始映射文件配置方式,映射文件的全路径,须要一一的书写,较繁琐 映射文件和Mapper接口能够不用放在一个目录下 --> <mapper resource="mappers/SysRoleMapper.xml"/> <mapper resource="mappers/SysUserMapper.xml"/> <!--方式2:经过类注册方式引入映射器 mapper接口代理方式,使用class属性引入接口的全路径名称: 使用规则: 1. 接口的名称和映射文件名称除扩展名外要彻底相同 2. 接口和映射文件要放在同一个目录下 <mapper class="com.mybatis.mapper.SysRoleMapper"/> <mapper class="com.mybatis.mapper.SysUserMapper"/> --> <!--方式3:经过包扫描的方式批量引入映射器 使用规则: 1. 接口的名称和映射文件名称除扩展名外要彻底相同 2. 接口和映射文件要放在同一个目录下 <package name="com.mybatis.mapper"/> --> <!--方式4:使用映射文件引入映射器 <mapper url="file:///var/mappers/mappers/SysRoleMapper.xml"/> <mapper url="file:///var/mappers/mappers/SysUserMapper.xml"/> --> </mappers>