文章目录
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 类型内建的类型别名。它们都是不区分大小写的,而且为了应对原始类型的命名重复,采取了特殊的命名风格。
// 注意: 除了内置别名, 不要乱起别名
别名 | 映射的类型 |
---|---|
_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 |
代码示范
<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);