Java MyBatis配置详解

35 篇文章 0 订阅

写在前面

??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示例中,我们的一些属性配置是直接写在配置数据源中的,比如usernamepassword,我们也可以在外部进行配置,并可以进行动态替换。
在这里插入图片描述

将属性配置改写在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文件中,会有许多StatementStatement 需要的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开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。

由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!

全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值