Mybatis配置文件和Mapper文件用法

Mybatis配置文件

properties 属性(数据库连接等配置)

使用property 子元素将数据库连接的相关配置进行改写
jdbc.properties

database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/ssm
database.username=root
database.password=123456
<configuration>
<properties resource= ” jdbc.properties " />
<typeAliases><!--别名-->
<typeAlias alias="role" type="com.learn.ssm.chapter3.pojo.Role"/>
</typeAliases>
<!--数据库环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${database.driver}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</dataSource>
</environment>
</environments>
<!--映射文件-->
<mappers>
<mapper resource="com/learn/ssm/chapter3/mapper/RoleMapper.xml"/>
</mappers>
< /configuration>





settings 设置(与映射相关配置)

—个配置完整的settings元素的示例如下:

<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" 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="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

typeAliases类型命名(节省mapper文件的resultType名称)

<typeAliases>
  <typeAlias alias="user" type="cn.itcast.pojo.User"/>
</typeAliases>

在mapper.xml中用resultType的时候可以使用user

<select id="loadUserById" parameterType="integer" resultType="user">
      select * from user where id = #{id}
</select>

https://www.cnblogs.com/kingxiaozi/p/5991108.html
在这里插入图片描述

typeHandlers类型处理器(mapper文件中自定义类型转换,将date类型格式化成时间,格式转换)

https://www.cnblogs.com/wangjiuyong/articles/6685376.html

在这里插入图片描述
在这里插入图片描述

objectFactory 对象工厂(执行mapper文件方法过程有关,执行mapper方法的时候,修改执行顺序)

在这里插入图片描述
https://www.cnblogs.com/wangjiuyong/articles/6685376.html

plugins 插件

environments 环境

参考spring+MyBatis中environments 环境
在这里插入图片描述

<environments default="mysql">
	<!-- 环境配置,即连接的数据库。 -->
    <environment id="mysql">
    <!--  指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
      <transactionManager type="JDBC"/>
      <!--  dataSource指数据源配置,POOLED是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>
poolMaximumActiveConnections 是在任意时间都存在的活动( 也就是正在使用)连
接数量,默认值为10 。
• poolMaximurnldleConnections 是任意时间可能存在的空闲连接数。
• poolMaximumCheckoutTime 在被强制返回之前,池中连接被检出( checked out )的
时间,默认值为2 0 000 毫秒( 即20 秒)。
• poolTimeToWait 是一个底层设置,如果获取连接花费相当长的时间,它会给连接池
打印状态日志, 并重新尝试获取一个连接(避免在误配置的情况下一直失败) , 默
认值为20 000 毫秒(即20 秒)。
• poolPingQuery 为发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序
中, 并准备接受请求。默认是“ NO PING QUERY SET ”,这会导致多数数据库驱动
失败时带有一个恰当的错误消息。
• poolPingEnabled 为是否启用侦测查询。若开启,也必须使用一个可执行的SQL 语
、句设置poo!PingQuery 属性(最好是一个非常快的SQL) ,默认值为false 。
• poo!PingConnectionsNotUsedFor 为配置poo!PingQuery 的使用频度。这可以被设置成
匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值为0 (即所有连接
每一时刻都被侦测一一仅当poo!PingEnabled 为true 时适用)。

mappers映射器(读取相关mapper文件)

MyBatis需要开发者自己写SQL语句,mapper映射器正是告诉MyBatis到哪里去找映射
文件,进而找到这些SQL语句。实际开发中可以使用相对于类路径的资源引用或完全限定资
源定位符(包括file:///的URL),以及类名和包名等。例如:

<!--使 用 类 路 径 査 找 资 源 文 件-->
<mappers>
<mapper resource="org/fkit/mapper/UserMapper.xml"/>
</mappers>
<!--使 用 本 地 文 件-->
<mappers>
<mapper url="file:///C:/mapper/UserMapper.xml"/>
</mappers>
<!-- 使 用 接 口 类-->
<mappers>
<mapper class="org.fkit.mapper.UserMapper"/> 
</mappers>
<!-- 使 用 包 名-->
<mappers>
<package name="org.fkit.mapper"/> 
</mappers>

mapper映射器会告诉MyBatis去哪里找映射文件,剩下的细节就是每个SQL映射文件了,
也就是接下来我们要重点讨论的。

深入mapper映射文件

select。映射査询语句。

<!-- select操作 
  resultType="map"表示返回的是一个Map对象
  使用列名做key,值做value -->
  <select id="selectUser" resultType="map">
  	SELECT * FROM TB_USER
  </select>

select完整配置

<select
id="selectUaer"
parameterType="int"
resultType="hashmap"
resultMap="userResultMap"
flushCache="false"
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED"
resultSetType=”FORWARD_ONLY">

在这里插入图片描述
在这里插入图片描述

insert。映射插入语句。

<!-- insert操,
	parameterType="user"表示该插入语句需要一个user对象作为参数
	useGeneratedKeys="true"表示使用自动增长的主键 -->
  <insert id="saveUser" parameterType="user" 
  useGeneratedKeys="true" keyProperty="id">
  	INSERT INTO TB_USER(name,sex,age) 
  	VALUES(#{name},#{sex},#{age})
  </insert>

首先,如果数据库支持自动生成主键的字段(比如MySQL和SQLServer) , 那 么 可 以 设
置useGeneratediCeys=“true”,然后再把keyProperty设置到目标属性上就可以了(一般会设置
到id属性上)。例如,如果上面的TB_USER表己经对id使用了自动生成的列类型,那么语
句可以修改为:

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> 
insert into TB_USER (username,password,email,address} 
values (#{username},#{password},#{email},#{address})
</insert>

对于不支持自动生成类型的数据库(比如Oracle)或可能不支持自动生成主键的JDBC驱
动来说,MyBatis有另外一种方法来生成主键。

<insert id="insertUser">
<selectKey keyProperty="id" resultType="int" order="BEFORE"> 
select SEQUENCE_TB_USER.nextval as id from dual 
</selectKey> 
insert into TB_USER
(id, usernamer, password, email,address) 
values
(#{id} , #{username}, #(password),#{email}, #{address})
</insert>

update。映射更新语句。

<!-- update操作 
  parameterType="user"表示该更新语句需要一个user对象作为参数-->
  <update id="modifyUser" parameterType="user">
  	UPDATE TB_USER 
  	SET name = #{name},sex = #{sex},age = #{age}
  	WHERE id = #{id}
  </update>

delete。映射删除语句。

<!-- delete操作 parameterType="int"表示该查询语句需要一个int类型的参数-->
  <delete id="removeUser" parameterType="int">
  	DELETE FROM TB_USER WHERE id = #{id}
  </delete>

sql。可被其他语句引用的可重用语句块。

<select id="selectUsers" resultType"map"> 
select
<include refid="userColumns"><property name="alias" value="tl" /></include> 
from some table t1
</select>

cache。给定命名空间的缓存配置。

cache-ref。其他命名空间缓存配置的引用。

resultMap。最复杂也是最强大的元素,用来描述如何从数据库结果集中加载对象。

方式一:

package org.fkit.test;

import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.fkit.factory.FKSqlSessionFactory;

public class SelectMapTest {

	public static void main(String[] args) throws Exception {
		// 获得Session实例
		SqlSession session = FKSqlSessionFactory.getSqlSession();
		// 查询TB_USER表所有数据返回List集合,集合中的每个元素都是一个Map
		List<Map<String,Object>> list 
			= session.selectList("org.fkit.mapper.UserMapper.selectUser");
		// 遍历List集合,打印每一个Map对象
		for(Map<String,Object> row : list){
			System.out.println(row);
		}
		// 提交事务
		session.commit();
		// 关闭Session
		session.close();
	}

}

<!-- select操作 
  resultType="map"表示返回的是一个Map对象
  使用列名做key,值做value -->
  <select id="selectUser" resultType="map">
  	SELECT * FROM TB_USER
  </select>

在这里插入图片描述
方式二:

package org.fkit.test;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.fkit.domain.User;
import org.fkit.factory.FKSqlSessionFactory;

public class ResultMapTest {

	public static void main(String[] args) {
		// 获得Session实例
		SqlSession session = FKSqlSessionFactory.getSqlSession();
		// 查询TB_USER表所有数据返回List集合,集合中的每个元素都是一个Map
		List<User> user_list 
			= session.selectList("org.fkit.mapper.UserMapper.selectUser2");
		// 遍历List集合,打印每一个Map对象
		for(User user : user_list){
			System.out.println(user);
		}
		// 提交事务
		session.commit();
		// 关闭Session
		session.close();

	}

}

<resultMap id="userResultMap" type="org.fkit.domain.User">
	  <id property="id" column="user_id" />
	  <result property="name" column="user_name"/>
	  <result property="sex" column="user_sex"/>
	  <result property="age" column="user_age"/>
	</resultMap>
  
   <select id="selectUser2" resultMap="userResultMap">
  	SELECT * FROM TB_USER2
  </select>

在这里插入图片描述

方式三:关联映射

package org.fkit.domain;

import java.util.List;

public class Clazz {
	
	private Integer id;
	private String code;
	private List<Student> students;
	省略getter和setter

<!-- 映射学生对象的resultMap -->
  <resultMap id="studentResultMap" type="org.fkit.domain.Student">
	  <id property="id" column="id" />
	  <result property="name" column="name"/>
	  <result property="sex" column="sex"/>
	  <result property="age" column="age"/>
	  <!-- 关联映射 -->
	  <association property="clazz" column="clazz_id" 
	  javaType="org.fkit.domain.Clazz"
	  select="selectClazzWithId"/>
	</resultMap>
	
  <!-- 根据班级id查询班级 -->
  <select id="selectClazzWithId" resultType="org.fkit.domain.Clazz">
  	SELECT * FROM TB_CLAZZ where id = #{id}
  </select>

在这里插入图片描述
方式四:

package org.fkit.domain;

import java.util.List;

public class Clazz {
	
	private Integer id;
	private String code;
	private List<Student> students;
	
	

}
<!-- 映射班级对象的resultMap -->
  <resultMap id="clazzResultMap" type="org.fkit.domain.Clazz">
	  <id property="id" column="id" />
	  <result property="code" column="code"/>
	  <!-- 班级的学生属性,因为一个班级有多个学生,所以该属性是一个集合 -->
	  <collection property="students" javaType="ArrayList"
	  column="id" ofType="org.fkit.domain.Student" 
	  select="selectStudentWithId"/>
	</resultMap>
	
	<!-- 根据班级id查询学生 -->
	<select id="selectStudentWithId" resultType="org.fkit.domain.Student">
  		SELECT * FROM TB_STUDENT where clazz_id = #{id}
  	</select>
  	
	<!-- 查询所有班级信息 -->
  <select id="selectClazz" resultMap="clazzResultMap">
  	SELECT * FROM TB_CLAZZ
  </select>
package org.fkit.test;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.fkit.domain.Clazz;
import org.fkit.domain.Student;
import org.fkit.factory.FKSqlSessionFactory;

public class SelectClazzTest {

	public static void main(String[] args) throws Exception {
		// 获得Session实例
		SqlSession session = FKSqlSessionFactory.getSqlSession();
		// 查询TB_CLAZZ表所有数据返回List集合,集合中的每个元素都是一个Clazz对象
		List<Clazz> clazz_list 
			= session.selectList("org.fkit.mapper.UserMapper.selectClazz");
		// 遍历List集合,打印每一个Clazz对象和该Clazz关联的所有Student对象
		for(Clazz clazz : clazz_list){
			System.out.println(clazz);
			List<Student> student_list = clazz.getStudents();
			for(Student stu : student_list){
				System.out.println(stu.getId() + " " + stu.getName() + " " + stu.getSex() + " " + stu.getAge());
			}
		}
		// 提交事务
		session.commit();
		// 关闭Session
		session.close();
	}

}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_32754539/article/details/89876139