Mybatis的Mapper文件和全局配置文件详解
- 1、mapper文件
- 2、mybatis配置文件
- 3、测试类
1、mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-////DTD Mapper 3.0//EN"
"/dtd/">
<!-- mapper 根节点
namespace 命名空间,一般情况下一个mapper映射文件对应不同的命名空间,利于管理和维护
书写:默认情况下可以随意输入,但是如果使用接口绑定的方式就必须要输入对应的接口的完整限定名
namespace如果是基于statementId的方式去执行SQL就可以随便写
如果是基于接口绑定的方式就需要输入相应接口的完整限定名-->
<mapper namespace="">
<select id="selectEmp" resultType="">
select id,name from emp where id = #{id}
</select>
<!-- id 可以设置不同的命名中唯一的标识符,可以被用来引用这条语句。
如果是接口绑定的是一定要保证接口和方法名相同
parameterType 用来设置该Sql的参数类型,可以当它不存在,因为mybatis会根据接口方法的参数自动读取到参数类型
statementType 设置当前的statement
STATEMENT 代表jdbc的statement 不支持参数预解析
PREPARED 代表jdbc的PreparedStatement 支持参数预解析,默认的
CALLABLE 代表jdbc的CallableStatement 执行存储过程
useGeneratedKeys 获取插入后的自动增长的主键(mysql 和 sql server)
keyProperty 属性名,自动增长的列
要获取自动获取的主键 设置 useGeneratedKeys 和 keyProperty
keyColumn 如果该表是一个联合主键的话,指定是其中哪一个字段
databaseId 用于配合数据库厂商id指定不同数据库下不同的SQL
-->
<insert id="insertEmp">
<!-- 设置子查询,可以在增删改之前或之后执行
可以解决数据库列不自动增长
可以先查出一个id,然后返回给插入的Sql
resultType 返回类型
order 之前还是之后执行 AFTER、BEFORE-->
<selectKey order="BEFORE" keyProperty="id" resultType="int">
SELECT MAX(ID)+1 FROM EMP
</selectKey>
INSERT INTO `mybatis`.`emp`(`id`, `name`) VALUES (#{id}, #{name});
</insert>
<update id="updateEmp">
UPDATE emp SET name = #{name} WHERE id = #{id};
</update>
<delete id="deleteEmp">
DELETE FROM emp WHERE id = #{id};
</delete>
</mapper>
2、mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-////DTD Config 3.0//EN"
"/dtd/">
<!-- 就是 DOCTYPE 后面对应的根节点 -->
<configuration>
<!-- 配置外部属性资源文件 通过${}进行引用 -->
<!--<properties resource="">
<!– 可以在定义内部的属性 引用方式是一样的 –>
<property name="" value="root"/>
</properties>-->
<properties resource=""></properties>
<!-- mybatis的设置选项 可以改变mybatis的运行时行为 -->
<settings>
<!-- 是否允许在Sql中设置别名,默认为true -->
<setting name="useColumnLabel" value="true"/>
<!-- 设置自动生成主键,并且递增 -->
<!--<setting name="useGeneratedKeys" value="true"/>-->
<!-- 当 数据库的字段名 和 对象中的属性名 对应不上的时候,报一个value级别的错误
默认是NONE,什么都不发生,如果没有映射上就不赋值
WARNING FAILING-->
<!--<setting name="autoMappingUnknownColumnBehavior" value="FAILING"/>-->
<!-- 设置默认执行器:
SIMPLE 默认的,普通的执行器,每次都需要预解释sql
REUSE 服务器会重用Sql,不会每一次都预解释sql
BATCH 执行器不仅重用Sql,且会批量执行
-->
<!--<setting name="defaultExecutorType" value="SIMPLE"/>-->
<!-- 设置调用数据库超时时间,单位是秒 -->
<!--<setting name="defaultStatementTimeout" value="10"/>-->
<!-- 是否将数据库的蛇形命名 映射为 驼峰命名 -->
<!--<setting name="mapUnderscoreToCamelCase" value="true"/>-->
<!-- 当往数据库插入数据某个数据值为null时映射到数据库的类型:
默认:OTHER mysql是可以识别出OTHER类型的
NULL 如果是 ORACLE 一定要设置成 NULL,ORACLE设别不出OTHER类型
VARCHAR 当属性值为空时为数据库设置一个空字符串
-->
<!--<setting name="jdbcTypeForNull" value="OTHER"/>-->
<!-- 假如 mybatis 框架中实现了多个日志框架,可以使用 logImpl 属性来设置使用哪一个
如果使用了 SLF4J 可以不用设置该配置,因为SLF4J本身就是选择使用那种日志框架的 -->
<!--<setting name="logImpl" value="SLF4J"/>-->
<!-- 打开延迟加载的开关 -->
<!--<setting name="lazyLoadingEnabled" value="true" />-->
<!-- 将加载改为按需加载 -->
<!--<setting name="aggressiveLazyLoading" value="false"/>-->
</settings>
<!-- 设置别名 -->
<typeAliases>
<!-- 根据包设置包里面所有的类的别名 (会将类的名字设置别名,并且忽略大小写)
接着resultType的值就可以直接写类名-->
<package name=""/>
</typeAliases>
<!-- 相当于mybatis的拦截器,可以拦截4大对象,可以拦截SQL,给SQL添加一些公共的功能 -->
<!--<plugins>
<plugin interceptor=""></plugin>
</plugins>-->
<!-- 数据库环境,可以设置多个,default 默认环境 -->
<environments default="development">
<!-- 配置单个数据库环境,id指定当前数据库环境的唯一标识,会被上面的default标志所设置 -->
<environment id="development">
<!-- 事务管理器,类型
type = JDBC 使用jdbc的事务管理器
type = MANAGED 不运用事务
-->
<transactionManager type="JDBC"/>
<!--
数据源
type 指定连接池
POOLED 指定使用mybatis连接池
UNPOOLED 不使用连接池
JNDI JNDI连接池 可以在tomcat中使用
-->
<dataSource type="POOLED">
<property name="driver" value="${}"/>
<property name="url" value="${}"/>
<property name="username" value="${}"/>
<property name="password" value="${}"/>
</dataSource>
</environment>
</environments>
<!-- 数据库厂商表示:mybatis提供用于跨数据库平台
type="DB_VENDOR" 利用数据库的厂商名称来区分
在Sql里面可以通过databaseId属性指定使用特定数据库的Sql
获取数据库厂商名字:
String databaseProductName = ().getMetaData().getDatabaseProductName();
步骤:
1、为需要跨越不同的数据库设置不同的厂商名称
2、编写不同的SQL databaseId必须使用厂商的value
-->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
<!-- 设置映射器 -->
<mappers>
<!-- 4种映射方式
1、<mapper resource 设置MapperXml 这种方式适用于根据statementId进行操作
2、<mapper class 设置Mapper接口 这种方式适用于接口绑定的方式
3、<mapper url 使用磁盘的绝对路径
4、<package name 根据包路径,设置包路径下的所有Mapper接口,适用于接口绑定和注解
-->
<!--<mapper resource=""/>-->
<mapper class=""></mapper>
</mappers>
</configuration>
3、测试类
package cool.ale.tests;
import cool.ale.mapper.EmpMapper;
import cool.ale.pojo.Emp;
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 org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
public class MybatisTest {
@Test
public void test() throws IOException, SQLException {
// 从 xml中构建 SqlSessionFactory
String resource = "";
// 从xml构建输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 构建 SqlSessionFactory:将全局配置文件和所有的 mapper 全部加载到 Configuration 对象中去
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// true是设置自动提交,SqlSession 负责执行具体的数据操作
/**
* 给 openSession 设置不同的参数会给 SqlSession 后续的数据库操作造成不同影响
* (传递 true 或 false,true代表自动提交):可以设置事务的自动提交方式(是否在增删改操作时自动提交)
* Connection var1:将由当前环境配置的 DataSource 实例中获取 Connection 对象
* TransactionIsolationLevel var1:事务隔离级别将会使用驱动或数据源的默认设置
* ExecutorType var1:预处理语句是否复用,是否批量处理更新
*/
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 获取数据库厂商名字
String databaseProductName = sqlSession.getConnection().getMetaData().getDatabaseProductName();
System.out.println(databaseProductName);
// Mybatis 在 getMapper 就会创建 jdk 动态代理
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = mapper.selectEmp(101);
System.out.println(emp);
}
}