Java MyBatis配置详解
⭐写在前面⭐
🧭MyBatis学习
🎉 内容回顾
Java MyBatis的介绍及其执行原理
📢今天我们进行MyBatis框架配置详解的学习,感谢你的阅读,内容若有不当之处,希望大家多多指正,一起进步!!!
♨️如果觉得博主文章还不错,可以👍三连支持⭐一下哦😀
文章目录
Java MyBatis配置详解
日志分析
可能很多小伙伴都是通过System.out.println()
简单的打印日志信息的,打印在输出窗口上,其实这样打印日志信息比较有局限性,今天我们用log4j
来打印日志
导入日志依赖
在pom.xml配置文件中导入log4j
依赖。
<!-- log4j日志依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
创建log4j.properties配置文件
拷贝一下内容到log4j.properties
文件中
## debug级别
log4j.rootLogger=DEBUG,Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd-HH\:mm\:ss,SSS} [%t] [%c] [%p] - %m%n
log4j.logger.com.mybatis=DEBUG /
## 输出sql语句
log4j.logger.java.sql.Connection = DEBUG
log4j.logger.java.sql.Statement = DEBUG
log4j.logger.java.sql.PreparedStatement = DEBUG
重新执行程序,查看日志
全局配置文件:mybatisConfig.xml
properties:读取外部资源
在上篇博客mybatis示例中,我们的一些属性配置是直接写在配置数据源中的,比如username
,password
,我们也可以在外部进行配置,并可以进行动态替换。
将属性配置改写在
properties
中,动态获取
当然也可以写在外部的配置文件中,然后导入
properties中引入配置文件
也可以在 SqlSessionFactoryBuilder.build() 方法中传入属性值
Properties properties = new Properties();
properties.setProperty("username","root");
properties.setProperty("password", "111111");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream,properties);
如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:
1. 首先读取在 properties 元素体内指定的属性。 然后根据 properties 元素中的 resource
2. 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
3. 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
🚀结论 因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。
settings:全局的参数设置
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。
例如:开启mybatis的二级缓存
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
typeAliases:类型别名
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
在 mapper.xml文件中,会有许多Statement ,Statement 需要的parameterType指定入参类型,需要resultType指定输出参数类型,如果是指定类型需要书写全限定名,不方便开发,可以通过类型别名,减少代码冗余。如下:
起别名有两种方式:
单个类型起别名 type: pojo全路径 ,alias: 别名的名称
<typeAliases>
<!--单个类型别名: type:pojo全路径 alias:别名的名称 -->
<typeAlias type="com.wyscoder.mybatis.pojo.Student" alias="student"/>
</typeAliases>
批量别名定义 package: pojo全路径 ,指定包名,将包下的所有pojo类定义别名,别名是类名(首字母大小写都可以)
<typeAliases>
<!--批量别名定义 package:指定包名,将包下的所有pojo类定义别名,别名是类名(首字母大小写都可以)-->
<package name="com.wyscoder.mybatis.pojo"/>
</typeAliases>
typeHandlers:类型处理器
MyBatis
在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。
objectFactory:对象工厂
每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。
plugins:插件
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
-
Executor (update, query, flushStatements, commit, rollback,
getTransaction, close, isClosed) -
ParameterHandler (getParameterObject, setParameters) ResultSetHandler
-
(handleResultSets, handleOutputParameters)
-
StatementHandler (prepare, parameterize, batch, update, query)
这些类中方法的细节可以通过查看每个方法的签名来发现,或者直接查看 MyBatis 发行包中的源代码。 如果你想做的不仅仅是监控方法的调用,那么你最好相当了解要重写的方法的行为。 因为在试图修改或重写已有方法的行为时,很可能会破坏 MyBatis 的核心模块。 这些都是更底层的类和方法,所以使用插件的时候要特别当心。
environments:环境配置
在我们开发过程中,会把代码放在开发环境,也可能会放在测试环境,还有可能会放在线上环境,但是可能每一种环境的配置都不一样,这时候我们可以配置多个环境,随环境的不同来切换环境。
映射器(mappers)
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。
1. 单个文件映射: resource属性一次加载一个文件,指定mapper.xml文件位置,mapper.xml文件通过namespace来查找mapper.java接口文件
<mappers>
<mapper resource="mapper/StudentMapper.xml"/>
</mappers>
2. class方式映射: 通过mapper接口映射单个文件。遵循规则: mapper.java和mapper.xml放在同一个目录下,且命名相同
<mappers>
<mapper class="com.wyscoder.mybatis.mapper.StudentMapper"/>
</mappers>
3. 批量mapper接口的扫描 通过mapper接口映射单个文件。遵循规则: mapper.java的接口文件和mapper.xml放在同一目录下,且命名相同
<mappers>
<package name="com.wyscoder.mybatis.mapper"/>
</mappers>
Mapper.xml映射配置文件
MyBatis
的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。
select
id属性: (必填的) Statement的id是唯一表示,和接口文件中的方法名保持一致。
parameterType: 表示输入参数的类型(pojo类,Integer,String…),入参类型也可以为resultMap类型(hashMap)两种类型二选一
resultType: (必填的) 表示输入参数的类型(pojo类,Integer,String…)返回类型也可以为resultMap类型(hashMap)两种类型二选一
<select id="selectStudentById" parameterType="int" resultType="Student">
select * from student where SID = #{id}
</select>
insert
id属性: (必填的) Statement的id是唯一表示,和接口文件中的方法名保持一致。
parameterType: (可选操作) 表示输入参数的类型(pojo类,Integer,String…),入参类型也可以为resultMap类型(hashMap)两种类型二选一
keyColumn: 指定数据库的主键
keyProperty: 主键对应的pojo类属性名
<insert id="方法名" parameterType="int" useGeneratedKeys="true" keyColumn="" keyProperty="">
//...
</insert>
update
id属性: (必填的) Statement的id是唯一表示,和接口文件中的方法名保持一致。
parameterType: (可选操作) 表示输入参数的类型(pojo类,Integer,String…),入参类型也可以为resultMap类型(hashMap)两种类型二选一
keyColumn: 指定数据库的主键
keyProperty: 主键对应的pojo类属性名
<update id="方法名" parameterType="int" useGeneratedKeys="true" keyColumn="" keyProperty="">
//...
</update>
delete
id属性: (必填的) Statement的id是唯一表示,和接口文件中的方法名保持一致。
parameterType: (可选操作) 表示输入参数的类型(pojo类,Integer,String…),入参类型也可以为resultMap类型(hashMap)两种类型二选一
<delete id="方法名" parameterType="int" useGeneratedKeys="true" keyColumn="" keyProperty="">
//...
</delete>
相关文章
- java虚拟机学习-JVM调优总结-典型配置举例(10)
- 后端Web开发框架(Java)
- Java循环结构
- [转]Java使用Cipher类实现加密,包括DES,DES3,AES和RSA加密
- 2020最新Java常见面试题及答案
- SpringBoot运行出现 Lookup method resolution failed; nested exception is java.lang.IllegalStateException
- 【Java】Eclipse的安装和JDK的安装与配置教程
- Java基础语法:1.第一个java程序
- Java-struts2的问题 java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
- mybatis generator配置,Mybatis自动生成文件配置,Mybatis自动生成实体Bean配置
- Java相关配置
- Java线程锁,synchronized、wait、notify详解--java 管程
- java.lang.OutOfMemoryError: Java heap space解决方法
- Spring_错误 java.sql.SQLException: Lock wait timeout exceeded | CannotAcquireLockException 的解决
- Java 8 stream 经典示例
- java基础面试题
- Java基础之JavaSE总结
- 一分钟搞定Java环境变量配置
- 【深入JAVA】java注解
- Eclipse迅速执行:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
- java 动态 lambda
- Java中核心注解的作用及其使用,了解Spring容器装载的过程和机制,自定义注解来实现自动配置项目依赖环境,包括mybatis、Dubbo、log4j、RabbitMQ、redis相关等自动配置
- java 和 IntelliJ IDEA 的一些配置
- Windows和Linux 导入java https调用接口时的受信任证书