mybatis核心配置
【mybatis全局配置介绍】
mybatis-config.xml,是MyBatis的全局配置文件,包含全局配置信息,如数据库连接参数、插件等。整个框架中只需要一个即可。
1、mybatis全局配置文件是mybatis框架的核心配置,整个框架只需一个;
2、mybatis全局配置文件中的配置顺序:注意如果配置多项,必须按照以下顺序进行配置
properties:属性配置
settings:设置
typeAliases:类型别名设置
typeHandlers:类型处理器
enviroments:环境配置
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
mappers:映射器
1、properties(属性)
【作用】
1、加载外部的java资源文件(properties文件);
2、通过子标签property设置属性;
【需求】
使用properties属性,配置数据库连接参数;
【1】property标签设置
1、通过properties的子标签设置属性;
2、使用${key}获取设置的属性值;
【2】加载外部properties
第一步:新建资源文件
新建jdbc.properties文件,将连接参数抽取到配置文件中:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db4
username=root
password=1234
第二步:引入资源文件
在mybatis-config.xml文件中加载jdbc.properties文件;通过properties的属性resource引入;
【注意事项】:子标签和属性resource同时加载一个变量,先加载子标签,然后在加载resource关联的外部文件的值,那么子标签中的内容会被覆盖。此时子标签存在就没有意义了。
2、settings(设置)
settings参数有很多,今天咱们先学习驼峰匹配-mapUnderscoreToCamelCase。翻译过来就是映射下划线到驼峰式命名。
【作用】
开启驼峰匹配:完成经典的数据库命名到java属性的映射
经典数据库命名:如果多个单词之间,通常使用下划线进行连接。
java中命名:第二个单词首字母大写。
驼峰匹配:相当于去掉数据库的数据中的名字的下划线,和java进行匹配
【应用场景】
从数据库中查到数据的字段名user_name和实体类属性名userName,不一致,导致查到的数据无法封装到实体类中。
但是,实体类中的属性userName符合驼峰命名,数据库字段名user_name符合数据库经典字段命名。
如果此时直接查询数据,那么用户名是null。
【1】配置驼峰映射
在mybatis-config.xml中做如下配置:
settings设置:
mapUnderscoreToCamelCase :驼峰自动映射配置 ,值是true表示开启驼峰自动映射。满足条件:数据库字段名 user_name ,实体类属性名 userName
<!--
2、settings设置:
mapUnderscoreToCamelCase :驼峰自动映射配置 满足条件:数据库字段名 user_name ,实体类属性名 userName
-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
运行测试,查看结果:
【小结】
1、开启驼峰自动映射的作用:user_name ====> userName;
2、注意事项:字段名必须符合user_name格式,属性名必须符合驼峰命名规则;
【2】解决字段名和属性名不一致的方法
如果数据库字段名和属性名不一致,或者是也不满足上面的命名规则。可以通过在SQL语句中为字段名取别名进行映射。
3、typeAliases(类型别名)
【1】作用
类型别名是给类的全限定名称(包名.类名) 取一个短名称。存在的意义仅在于用来减少类完全限定名的冗余。例如:
这些全限定类名可通过设置类型别名–短名称代替。类型别名的设置有以下几种方式:
方式:使用typeAliases标签的子标签package包扫描映射别名;
【2】应用
【方式】package
扫描指定包下的所有类,扫描之后的别名就是类名,大小写不敏感(不区分大小写),建议使用的时候和类名一致。
设置别名:
<!--
三、typeAliases(类型别名)
【1】作用:给类的全限定名称 取一个短名称 com.heima.mybatis.pojo.User==>User
【2】用法:
1、单独取别名:<typeAlias type="com.heima.mybatis.pojo.User" alias="User"/>
2、批量取别名:<package name="com.heima.mybatis.pojo"/> 扫描到当前包下的所有类
类的类名==》别名
-->
<typeAliases>
<!--扫描com.itheima.sh.pojo包下所有的类,类名直接作为别名(别名不区分大小写)-->
<package name="com.itheima.sh.pojo"/>
</typeAliases>
使用别名:
【内置别名】
这是一些为常见的 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 |
【代码演示】
<!--parameterType="int" 表示sql语句参数id的类型,int是Integer的别名-->
<select id="queryById" resultType="user" parameterType="int">
select * from user where id = #{id}
</select>
4、typeHandlers(类型处理器)【了解】
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。
<!--
四、typeHandlers(类型处理器)
数据库数据类型:varchar ===StringTypeHandler===> 实体类:String
数据库数据类型:double DoubleTypeHandler 实体类中的数据: java.lang.Double
-->
5、environments
MyBatis 可以配置成适应多种环境,例如,开发、测试和生产环境需要有不同的配置;
尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。
虽然,这种方式也可以做到很方便的分离多个环境,但是实际使用场景下,我们更多的是选择使用spring来管理数据源,来做到环境的分离。
父标签: environments(环境配置)
子标签:
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
【1】默认环境设置
第一步:在environments标签中配置多个environment,通过属性default指定一个默认环境配置;
第二步:在构建SqlSessionFactory时,可指定具体环境,如果不指定就使用默认的环境配置;
【2】指定环境设置
第一步:在environments中配置多个环境
第二步:在构建SqlSessionFactory时,通过environment的id指定环境
代码演示:
<!--mybatis环境的配置-->
<!--
五、 environments(数据库环境配置)
开发过程中会使用第三方的连接池:druid,C3P0
Spring框架管理连接池
-->
<!--<environments default="test">-->
<environments default="development">
<!--通常我们只需要配置一个就可以了, id是环境的名字 -->
<environment id="development">
<!--事务管理器:由JDBC来管理-->
<transactionManager type="JDBC"/>
<!--数据源的配置:mybatis自带的连接池-->
<dataSource type="POOLED">
<!--
这里的value="${driver}" driver 是子标签property的name属性值
-->
<property name="driver" value="${driver}"/>
<property name="url" value="jdbc:mysql://localhost:3306/db4"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
<!--通常我们只需要配置一个就可以了, id是环境的名字 -->
<environment id="test">
<!--事务管理器:由JDBC来管理-->
<transactionManager type="JDBC"/>
<!--数据源的配置:mybatis自带的连接池-->
<dataSource type="POOLED">
<!--
这里的value="${driver}" driver 是子标签property的name属性值
-->
<property name="driver" value="${driver}"/>
<property name="url" value="jdbc:mysql://localhost:3306/db4"/>
<property name="username" value="root"/>
<property name="password" value="12345"/>
</dataSource>
</environment>
</environments>
@Test
public void queryById( ) throws Exception {
//获取mapper接口的动态代理实现
//1、从xml中构建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//这里指定了环境为test
// SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"test");
//build不方法不指定环境就使用默认的 <environments default="development">
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2、获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3、获取UserMapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.queryById(1);
System.out.println("user = " + user);
}
【注意事项】
虽然,这种方式也可以做到很方便的分离多个环境,但是实际使用场景下,我们更多的是选择使用第三方的连接池:druid,C3P0。并且使用spring来管理数据源(连接池),来做到环境的分离。
5.6、mappers(映射器)
mappers(映射器):UserMapper.xml====>UserMapper.java接口 关联.
作用:维护接口和映射文件之间的关系.
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。 但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:///
的 URL),或类名和包名等。方式如下:
使用方式:
1、加载映射文件,关联UserMapper.java接口
【1】 从src下加载映射文件;
2、加载接口,关联映射文件
条件:1、接口名和映射文件名保持一致;2、路径保持一致;
【2】批量加载class:
方式一:加载映射文件方式resource
在mybatis-config.xml文件中,通过mapper标签的resource属性引入当前工程src下的映射文件。
【缺点】
有多少个映射文件就要配置多少次,麻烦。
方式二:加载接口,关联映射文件方式package
在mybatis-config.xml中,开启包扫描:扫描包下的所有接口和对应的映射文件。
条件:1、接口名和映射文件名保持一致;2、路径保持一致;
在mybatis-config.xml配置mapper接口的全路径:
<mappers>
<package name="com.itheima.sh.dao"/>
</mappers>
【原理】:
扫描目标包目录下的mapper接口,并按照class的方式找到接口对应的映射文件。
其条件和设置class的条件一样:
1、映射文件和mapper接口在同一个目录下
2、文件名必须一致
3、映射文件的namespace必须和mapper接口的全路径保持一致
【缺点】:
1、需要遵守的条件太多
2、mapper.xml和mapper.java没有分离。
【mappers小结】:
mappers:配置映射文件
mapper
resource:配置类路径下的映射文件(掌握)
package:配置接口包扫描(掌握)
1、要求接口和映射文件在同一个包下
2、要求接口和映射文件同名
3、要求namesapce的值必须为接口的全限定类名
【推荐使用】resource加载映射文件,如果使用注解开发只能使用 package方式,注解开发不能使用加载配置文件的方式,因为注解已经取代了xml文件。所有注解都使用在接口的方法上。
7、全局配置小结
一、全局配置:如果需要配置多个,必须按照以下顺序
properties(属性)重点
settings(设置)重点
typeAliases(类型别名) 重点
typeHandlers(类型处理器)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
mappers(映射器)重点
二、常用配置:
1、properties(属性)
【作用】定义一些属性或者加载外部的资源文件
【用法】
2、加载外部的资源文件(src, jdbc.properties)掌握
<properties resource="jdbc.properties"></properties>
获取参数: ${driver}
2、settings(设置):
驼峰自动映射:数据库下划线命名:user_name ===》实体类属性命名:userName
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
说明:如果不满足驼峰式命名,查询时起别名。
3、typeAliases(类型别名)
【作用】给类的全名称 取 短名称 com.heima.pojo.User===>User,不区分大小写
【配置】
<typeAliases>
<package name="com.heima.mybatis.pojo"/> 掌握
</typeAliases>
4、mappers(映射器)
【作用】把映射文件 和 接口 进行绑定
【配置】
加载xml文件:
1、mapper resource="src下的映射文件" 多
加载接口:【1】映射文件和接口名称必须一致; 【2】路径一致
2、接口扫描: package name="com.heima.mybatis.dao" 多