Mybatis框架的配置详解
-
主配置文件配置详解:SqlMapConfig.xml文件
-
SqlMapConfig.xml文件,是Mybatis中的全局核心配置文件,包含了数据库连接的配置信息、mapper映射配置文件加载的路径、全局的一些参数、别名等一些配置信息。
-
配置项的详解:
- configuration标签: 是包裹着所有配置项的标签,是整个配置文件的顶级标签。
- environments标签:数据库环境信息的集合。一个配置文件中能进行配置多个数据库环境的集合。因此在mybatis中能将SQL语句对多个数据库同时进行映射。(和spring框架进行整合之后这个配置就不会再使用了)【现阶段重点】
- 属性:default: 用于指定默认的环境(指定的是environment标签中的id属性值)
- 子标签:environment:数据库环境配置的详细配置标签。
- 属性:id属性: 配置的当前环境的唯一标识
- 子标签:transactionManager:事务管理,指定 MyBatis 的事务管理器。属性有:type(表示的是事务管理的类型)datasource:数据源:使其中的 type 指定数据源的连接类型,有三种取值:POOLED UNPOOLED JNDI,在标签对中可以使用 property 属性指定数据库连接池的其他信息。如数据库的驱动、url、用户的名称和密码。
- type属性三种取值详解:
- POOLED:采用传统的
javax.sql.DataSource
规范中的连接池,mybatis中有针对规范的实现 连接池就是用于存储连接的一个容器 容器其实就是一个集合对象, 该集合必须是线程安全的, 通能两个线程拿到同一连接 该集合还必须实现队列的特性:先进先出 - UNPOOLED 采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想 就是不使用连接池
- JNDI采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样注意:如果不是web或者maven的war工程,是不能使用的 若使用tomcat服务器,采用的连接池是dbcp连接池
- POOLED:采用传统的
- mappers标签:映射器,指定的是 sql 映射文件的位置,告知 MyBatis 去哪里加载 sql 映射配置。【重点】
- 子标签:mapper标签:表示的是映射文件的位置
- 属性【三种】1 resource属性:适用于类路径下的文件加载:注意的是mybatis原始开发Dao.xml文件与接口文件不在同一路径下,仅能用resource加载映射文件(常用在xml配置的方式) 2 class属性:仅适用于类路径下,接口文件与映射文件在同一路径下,且接口名与映射文件名相同,并且映射文件命名为接口全限定类名的情况.(常常用在注解配置的方式) 3 url:同样是指定配置文件的位置,但是使用的是url的形式(url的形式:协议 主机名 端口名 文件的路径名 文件名使用的是file协议)
- package标签: 适用于类路径下,接口文件与映射文件在同一路径下,且接口名与映射文件名相同,并且映射文件命名为接口全类名的情况(这样不用写接口的实现类)是class方法的简写。
- 属性:name:name属性指定的包下的所有的 dao都会自动的完成配置 但是需要满足上面的前提。
- 子标签:mapper标签:表示的是映射文件的位置
- typeAliases标签:用于指定类型的别名,且不区分大小写。用来设置一些别名来代替 Java 的长类型声明,如 java.lang.String为string等,减少配置编码的冗余。【重点】
- 子标签:typeAlias标签:用于配置别名
- 属性:【两种】1 type属性指定的是实体类的全限定类名 2 alias指定的是别名 当指定了别名就不在区分大小写了,但是如果有很多的实体类需要注册别名 还是很麻烦 于是有了 package
- package:用于指定要配置别名的包 当指定之后,该包下的实体类都会注册 且类名就是别名 不在区分大小写
- 属性:name:用于指定要配置别名的包
- 子标签:typeAlias标签:用于配置别名
- properties:该标签可以引入外部配置的属性,也可以自己配置。该配置标签所在的同一个配置文件中的其他配置均可引用此配置中的属性。(这样配置的好处有两点:方便参数的统一管理 防止硬编码)
- 子标签:property:指定配置文件的信息
- 属性: name 和value value在引用配位文件信息需要使用"${jdbc.driver}"需要和配置文件中的key相同jdbc.driver=com.mysql.jdbc.Driver
- 属性:【两种】resource属性 和 url属性 这两种属性的用法和mapper中的用法一致
- 子标签:property:指定配置文件的信息
- 其他的标签:后三种不常用
- setting:全局配置参数,用来配置一些改变运行时行为的信息,例如是否使用缓存机制,是否使用延迟加载,是否使用错误处理机制等。并且可以设置最大并发请求数量、最大并发事务数量,以及是否启用命令空间等。
- typeHandlers:类型处理器,将 sql 中返回的数据库类型转换为相应 Java 类型的处理器配置。
- objectFactory:对象工厂,实例化目标类的工厂类配置。
- plugins:插件,可以通过插件修改 MyBatis 的核心行为,例如对语句执行的某一点进行拦截调用
- environments标签:数据库环境信息的集合。一个配置文件中能进行配置多个数据库环境的集合。因此在mybatis中能将SQL语句对多个数据库同时进行映射。(和spring框架进行整合之后这个配置就不会再使用了)【现阶段重点】
- configuration标签: 是包裹着所有配置项的标签,是整个配置文件的顶级标签。
-
Mybatis 配置项之间不能颠倒顺序 否则配置会出现问题 配置项的顺序如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties></properties> <typeAliases></typeAliases> <settings></settings> <typeHandlers></typeHandlers> <objectFactory type=""></objectFactory> <plugins></plugins> <environments default=""> <environment id=""> <dataSource type=""></dataSource> <transactionManager type=""></transactionManager> </environment> </environments> <databaseIdProvider type=""></databaseIdProvider> <mappers></mappers> </configuration>
-
-
SqlMapConfig.xml代码示例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--mybaits的主配置文件--> <configuration> <!--注意各个标签之间有顺序--> <!--属性有两种取值 一种就是resource 另一种就是url--> <properties resource="jdbcConfig.properties"></properties> <typeAliases> <!--type只能指定实体类全类名 alias属性指定别名 区分大小写--> <!--<typeAlias type="com.daniel.domain.User" alias="user"></typeAlias>--> <!--现在就不区分大小写了--> <package name="com.daniel.domain"></package> </typeAliases> <!--配置properties 可以在标签内部配置信息 也可以通过外部文件来配置信息 resource 属性: 用于指定配置文件的位置,是按照类路径来写的 URL属性 Uniform Resource Locator 统一资源定位符 可以唯一标志一个资源的位置 写法必须是 协议 主机 端口 URI URL>URI(精准性) URI属性 Uniform Resource Identifier 统一资源标识符 是在应用中可以可以唯一标志一个资源的位置 --> <!-- 2.全局配置参数 --> <settings> <!-- 设置是否启用缓存 --> <setting name="cacheEnabled" value="true"/> <!-- 设置是否启用懒加载 --> <setting name="lazyLoadingEnabled" value="true"/> </settings> <!-- 4.类型转换器 --> <typeHandlers> <!-- 一个简单类型转换器 --> <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/> </typeHandlers> <!-- 5.对象工厂 --> <objectFactory type="org.mybatis.example.ExampleObjectFactory"> <!-- 对象工厂注入的参数 --> <property name="someProperty" value="100"/> </objectFactory> <!-- 6.插件 --> <plugins> <plugin interceptor="org.mybatis.example.ExamplePlugin"> <property name="someProperty" value="100"/> </plugin> </plugins> <!--配置环境--> <environments default="mysql"> <!--配置mysql环境--> <environment id="mysql"> <!--配置事务类型--> <transactionManager type="JDBC"></transactionManager> <!--配置数据源(连接池)--> <dataSource type="POOLED"> <!--配置数据源(连接池)的基本信息--> <!-- <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/>--> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--指定映射配置文件的位置,映射配置文件指的是每个dao配置的文件--> <mappers> <package name="com.daniel.dao"></package> </mappers> </configuration>
-
xxxMapper.xml配置详解
- SQL 映射文件中的几个顶级元素:
- cache – 给定命名空间的缓存配置。
- cache-ref – 其他命名空间缓存配置的引用。
- resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
parameterMap– 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。- sql – 可被其他语句引用的可重用语句块。
- insert – 映射插入语句
- update – 映射更新语句
- delete – 映射删除语句
- select – 映射查询语句
- Javabean的属性值和数据库中列名不一致的问题: 如列名是id而Javabean中的属性值是userId解决方式(两种)
- 起别名: select id as userId from user(不用解析多余的xml文件 resultMap也是需要解析的文件) 好处是 高效 缺点是:需要改动每一个SQL语句
- 配置使用resultMap:好处:提升了开发效率 resultMap只需要定义一次 缺点:resultMap同样是一个xml文件需要解析,使运行的效率降低了。
-
resultMap配置的方式:主键属性是用id标签 非主键属性使用result标签
<resultMap id="userMap" type="com.itheima.domain.User"> <!-- 首先是主键字段的配置 property:javaBean中的属性名 column:列名--> <id property="userId" column="id"></id> <!--非主键字段的配置 注意的是javaBean的属性是严格区分大小写的--> <result property="userName" column="username"></result> <result property="userAddress" column="address"></result> <result property="userSex" column="sex"></result> <result property="userBirthday" column="birthday"></result> <!-- 进行这样的配置就能在不改动SQL语句的情况下进行封装不在是使用resultType 而是使用的是resultMap-->
-
- SQL 映射文件中的几个顶级元素:
-
xxxMapper.xml文件的代码示例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 在创建多级目录的时候不能使用com.itheima.dao创建 而是使用com/itheima/dao来创建 或者是一级级的创建--> <!--namespace 属性表示的是确定该方法所在的那个dao接口中 --> <mapper namespace="com.itheima.dao.UserDao"> <!-- id属性表示的是方法的名称 resultType表示的是封装的结果集的类型--> <!-- 如果Javabean的属性值和数据库中列名不一致 如列名是 id Javabean中的属性值是userId: 如何匹配 两种方式(MySQL中 在window操作系统中 是不区分大小写的) 1 起别名: select id as userId from user(不用解析多余的xml文件 resultMap也是需要解析的文件 高效) 2 进行配置使用的是resultMap(好处就是提升了开发效率(不用改动每一个SQL语句 resultMap只需要定义一次) 但是运行的效率低了) --> <resultMap id="userMap" type="com.itheima.domain.User"> <!-- 首先是主键字段的配置 property:javaBean中的属性名 column:列名--> <id property="userId" column="id"></id> <!--非主键字段的配置 注意的是javaBean的属性是严格区分大小写的--> <result property="userName" column="username"></result> <result property="userAddress" column="address"></result> <result property="userSex" column="sex"></result> <result property="userBirthday" column="birthday"></result> <!-- 进行这样的配置就能在不改动SQL语句的情况下进行封装不在是使用resultType 而是使用的是resultMap--> </resultMap> <!--需要注意的是不是使用 resultType 属性 而是使用resultMap属性 --> <select id="findAll" resultMap="userMap"> <!--sql语句的结尾的分号写不写都行 --> select * from user </select> <!-- 配置的是增加用的户的方法 parameterType 属性是方法中参数的类型 不指定的话就不知道sql语句中?的类型 --> <insert id="saveUser" parameterType="USER"> <!--在插入之后 获取插入的id keyProperty :实体类中的属性 keyColumn表中列字段名称 resultType 封装的结果类型 order:在插入操作之后进行AFTER --> <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER"> select last_insert_id() </selectKey> insert into user (username,address,sex,birthday) values(#{username},#{address},#{sex},#{birthday}) </insert> <update id="updateUser" parameterType="UsEr"> update user set username = #{username},address=#{address},sex=#{sex},birthday=#{birthday} where id= #{id} </update> <delete id="deleteUser" parameterType="java.lang.Integer"> <!-- #{id}表示的是占位符 而不是类型 能随便写 要求是基本类型 或这是基本类型的包装类 且只有一个占位符时--> delete from user where id = #{id} </delete> <!-- 根据id查询一个user对象--> <select id="findOneById" parameterType="java.lang.Integer" resultType="com.itheima.domain.User"> select * from user where id = #{uid} </select> <!-- 根据用户的用户名称来模糊查询user对象 parameterType 只要是能够表示出来类型就行--> <select id="findUserByName" parameterType="java.lang.String" resultType="com.itheima.domain.User"> <!-- 这里没有使用% 需要在方法的调用中传递--> <!--select * from user where username like '$%{value}%' 这样的方式不需要在方法中传递%--> select * from user where username like #{name} </select> <!-- 使用聚合函数来查询所有 --> <select id="findTotal" resultType="Integer"> select count(id) from user </select> </mapper>
-
总结:MyBatis 的配置文件,有些不常用的标签也可以不用死记硬背,熟知常用的即可,不常用的需要用时可查看帮助文档即可。