02_Mybatis配置文件介绍和动态代理

本文详细介绍了Mybatis的核心配置文件结构,包括properties、settings、typeAliases、environments和mappers,以及动态代理的使用,强调了遵循的接口设计规则和事务处理方法。
摘要由CSDN通过智能技术生成

1.配置文件

主要是介绍Mybatis的核心配置文件。
在这里插入图片描述
这些标签是有序的,为什么?

思考:因为别人解析的代码就是固定的

核心: 4件套(url、driver、username、password)、映射文件(mappers/package)

1.1 properties

properties表示可以外部配置的属性,并可以进行动态替换。(作为典型的是JDBC配置)

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db47?useSSL=false&userUnicode=true&characterEncoding=utf8
username=root
password=123456
<configuration>
<!-- 引入外部配置文件 -->
<properties resource="jdbc.properties" ></properties>
</configuration>

在这里插入图片描述

1.2 settings

settings是MyBatis的行为配置(类似于idea和settings的关系)
eg: 日志配置

<configuration>
 <settings>
    <!--  添加日志的配置 -->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
</configuration>

一个完整的settings配置 (暂时没用)

<settings>
 <setting name="cacheEnabled" value="true"/>
 <setting name="lazyLoadingEnabled" value="true"/>
 <setting name="aggressiveLazyLoading" 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="safeResultHandlerEnabled" value="true"/>
 <setting name="mapUnderscoreToCamelCase" value="false"/>
 <setting name="localCacheScope" value="SESSION"/>
 <setting name="jdbcTypeForNull" value="OTHER"/>
 <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
 <setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/>
 <setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumTypeHandler"/>
 <setting name="callSettersOnNulls" value="false"/>
 <setting name="returnInstanceForEmptyRow" value="false"/>
 <setting name="logPrefix" value="exampleLogPreFix_"/>
 <setting name="logImpl" value="SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING"/>
 <setting name="proxyFactory" value="CGLIB | JAVASSIST"/>
 <setting name="vfsImpl" value="org.mybatis.example.YourselfVfsImpl"/>
 <setting name="useActualParamName" value="true"/>
 <setting name="configurationFactory" value="org.mybatis.example.ConfigurationFactory"/>
</settings>

1.3 typeAliases

typeAlies类型别名。(也就是我们可以对 类 起别名,简化操作) (暂时不建议使用)

<configuration>
 
 <!-- 类型别名 -->
 <typeAliases>
     <!-- alias别名 type全限定名 -->
     <typeAlias alias="account" type="com.snow.www.bean.Account"/>
     <typeAlias alias="user" type="com.snow.www.bean.User"/>
 </typeAliases>
</configuration>
<select id="selectAccountById"  resultType="account">
 select * from account where id = #{id}
</select>

在这里插入图片描述
注意: Mybatis对于一些基本类型和包装类型,以及集合类型,有内置的别名。

// 值得注意的是下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,而且为了应对原始类型的命名重复,采取了特殊的命名风格。
// 注意: 除了内置别名,  不要乱起别名
别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

代码示范

<select id="selectNameById"
         parameterType="java.lang.Integer"
         resultType="java.lang.String">
     select name from account where id = #{id}
</select>
<select id="selectNameById"
     parameterType="Integer"
     resultType="String">
 select name from account where id = #{id}
</select>
<select id="selectNameById"
     parameterType="integer"
     resultType="string">
 select name from account where id = #{id}
</select>
<select id="selectNameById"
         parameterType="_int"
         resultType="String">
  select name from account where id = #{id}
</select>

1.4 environments

environments: 可以配置成适应多种环境.比如开发环境、测试环境和生产环境等可能需要有不同的配置.

<!-- 环境的配置,其实就是去配置数据库连接-->
<environments default="development">

<!-- 环境的id,是唯一的-->
<environment id="development">

   <!-- 事务管理器
       JDBC:   使用JDBC连接来管理事务
       MANAGED: 把事务的管理交给外部的容器 -->
   <!-- 如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,
				因为 Spring 模块会使用自带的管理器来覆盖前面的配置。-->
   <transactionManager type="JDBC"/>

   <!--
       POOLED: 使用Mybatis自带的连接池
       UNPOOLED:不使用连接池
       JNDI:使用外部的连接池  -->
   <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>

<environment id="test">
   <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>

<environment id="prod">
   <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>

1.5 mappers

这个是映射器的配置。配置mapper.xml配置文件。
配置方式一: 直接以对应mapper文件的相对路径

<configuration>    
<mappers>
  <mapper resource="com/snow/www/mapper/AccountMapper.xml"/>
  <mapper resource="com/snow/www/mapper/User.xml"/>
  <mapper url="file:///E:yyy.xml"/>
</mappers>
</configuration>

★配置方式二: 配置某个包下的所有的配置文件

<configuration>   
<!--
        1. 接口和映射文件编译后要在同一级目录,并且同名
        2. 接口的全限定类名作为映射文件的命名空间
        3. 接口中的方法名(方法不允许重载)作为映射文件中的标签id(不允许重复)
    -->
	<mappers>
        <package name="com.snow.www.mapper"/>
    </mappers>
</configuration>

2.动态代理(Dynamic Proxy)

2.1动态代理简单介绍

动态代理:代理对象:好比明星,代理人:明星经济人,公司要找明星代言先找经济人,我们的动态代理的任务就是做好这个代理人。
一些问题

// 目前Mybatis使用起来还不够灵活,不够简单。
// 虽然解决了SQL语句硬编码的问题,但是又出现了新的问题
SQL语句的坐标存在硬编码
sqlSession调用的方法需要我们自己去指定
//也就是UserDaoImpl中的内容还不够通用,我们想要进一步干掉它

而Mybatis的动态代理可以帮助我们去生成接口的代理对象。我们可以自己不实现接口。

// 不需要实现接口,那么就需要遵守Mybatis使用动态代理的一些规则
1, 接口的全限定名称 和 mapper.xml中的namespace的值保持一致
2, 接口中的方法和 xml文件中的 <select> <insert> <update> <delete> 标签 一一对应,并且方法名要和标签的id值保持一致
3, 方法的返回值类型和标签中的resultType保持一致(注意:添加/删除/修改不需要返回值类型)
4, 参数保持一致(暂时可以不写)

// 建议要遵守的规则:希望
	1, 文件的名字 UserMapper.xml  | UserMapper.java 建议保持一致
	2, UserMapper.xml 和UserMapper.java 在编译之后的位置应该要在同一个路径下

2.2 建议要遵守的规则:希望

1, 文件的名字 UserMapper.xml | UserMapper.java 建议保持一致
在这里插入图片描述
编译后在同一路径,两只小鸟
在这里插入图片描述
2.namespace命名空间域对应接口UserMapper的全域名,resultType对应的数据库映射对象User的全域名
在这里插入图片描述
3.id的值对应着UserMapper接口中方法的名称
在这里插入图片描述

User就是我们的明星也就是数据库的映射对象,我们就这么通过UserMapper这个代理对象和其相对应的方法来执行和操作User对象

如何使用动态代理呢?

public class MyBatisExecution {

 // 查询id为2的用户
 public static void main(String[] args) throws Exception{
     //UserDao userDao = new UserDaoImpl();
     // 1.获取SqlSession
     SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
     // 2.根据SqlSession获得Mapper代理对象
     UserMapper userDao = sqlSession.getMapper(UserMapper.class);
     // 3.代理对象执行方法
     User user = userDao.selectByPrimaryKey(2);
     System.out.println("user = " + user);
 }
}

★事务

// 解决办法一:  执行完SQL语句之后, 使用sqlSession提交事务
sqlSession.commit();
// 解决办法二:  执行完SQL语句之后, 使用sqlSession内部封装的Connection 提交事务
Connection conn  = sqlSession.getConnection();
conn.commit();
// 解决办法三:(自动提交) 在获得SqlSession的时候, 给sqlSessionFactory.openSession设置为真
// 获取到的SqlSession,里面的connection不会自动提交
SqlSession session = sqlSessionFactory.openSession();
// 获取自动提交的SqlSession
SqlSession session = sqlSessionFactory.openSession(true);  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值