Mybatis 42_Mybatis自动映射

发布时间:2024年01月18日

自动映射

自动映射:其实就是前面介绍“同名映射”规则。
即使你使用<resultMap…/>指定映射时,autoMapping="true"属性默认为true,控制默认开启自动映射
自动映射依然是起作用的!
【经验:】即使用<resultMap…/>定义映射规则时,其实你只需要指定哪些不能自动映射的列

MyBatis支持以下三种自动映射策略:

  • NONE:不使用自动映射。
  • PARTIAL:部分自动映射,只映射没有定义嵌套结果集映射的结果集。默认值。
  • FULL:完全自动映射,总是自动映射任意复杂的结果集。
    通过在mybatis-config.xml文件中<settings…/>元素中通过配置<setting…/>来改变默认行为

mapUnderscoreToCamelCase 设置

如果你将该设置开启(默认是关闭的),MyBatis可以自动完成下划线列名与驼峰写法的属性名之间的映射。
可将数据库表字段 user_name,自动映射成java属性 userName

项目0505自动映射非注解

主配置文件

<?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>
	<settings>
		<!-- 设置打开将下划线写法列名与驼峰写法的属性名之间的自动映射 -->
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>

 	<typeAliases>
 		<!-- 为指定包下所有类指定别名 -->
 		<package name="org.itcheng.app.domain"/>
 	</typeAliases>
 	
	<!-- 用于配置多个数据库环境 -->
	<environments default="mysql">
		<!-- environment配置一个数据库环境 -->
		<environment id="mysql">
			<!-- 配置事务类型:JDBC或Managed,此时的JDBC等都是实现类的缩写 -->
			<transactionManager type="JDBC" />
			<!-- 配置数据库连接池,POOLED也是一个实现类的缩写  -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- mapper文件负责管理MyBatis的SQL语句 -->
		<mapper resource="org/itcheng/app/dao/NewsMapper.xml" />
	</mappers>


</configuration>

映射文件

<?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">
<!-- 根元素是mapper,该元素的namespace属性值相当于该mapper的唯一标识 -->	
<mapper namespace="org.itcheng.app.dao.NewsMapper">

	<!-- SQL的id需要与Mapper接口的方法名相同  -->
	<insert id="saveNews">
		insert into news_inf values (null, #{title}, #{content})
	</insert>
	
	<!-- 定义SQL语句 -->
	<update id="updateNews">
		update news_inf set news_title = #{title}, news_content = #{content}
		where news_id=#{id}
	</update>
	
	<!-- SQL的id需要与Mapper接口的方法名相同  -->
	<delete id="deleteNews">
		delete from news_inf where news_id = #{xyz} 
	</delete>
	

	<select id="findNews" resultMap="newsMap">
		select * from news_inf where news_id > #{id}		
	</select>
	
	<!-- autoMapping属性默认就是true
	这意味着能同名映射(自动映射)你可以忽略,不需要显式定义
	由于news类的id属性未遵守映射规则,所以需要单独指定
	 -->
	<resultMap type="news" id="newsMap" autoMapping="true">
		<id column="news_id" property="id" />
	</resultMap>
	
</mapper>

项目0506自动映射使用注解

主配置文件

<?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>
	<settings>
		<!-- 设置打开将下划线写法列名与驼峰写法的属性名之间的自动映射 -->
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>

 	<typeAliases>
 		<!-- 为指定包下所有类指定别名 -->
 		<package name="org.itcheng.app.domain"/>
 	</typeAliases>
 	
	<!-- 用于配置多个数据库环境 -->
	<environments default="mysql">
		<!-- environment配置一个数据库环境 -->
		<environment id="mysql">
			<!-- 配置事务类型:JDBC或Managed,此时的JDBC等都是实现类的缩写 -->
			<transactionManager type="JDBC" />
			<!-- 配置数据库连接池,POOLED也是一个实现类的缩写  -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<package name="org.itcheng.app.dao"/>
	</mappers>


</configuration>

接口文件

package org.itcheng.app.dao;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.itcheng.app.domain.News;

// Mapper组件相当于DAO组件
public interface NewsMapper
{
	@Insert("insert into news_inf values (null, #{title}, #{content})")
	int saveNews(News news);
	
	@Update("update news_inf set news_title = #{title}, news_content = #{content}\r\n" + 
		"where news_id=#{id}")
	int updateNews(News news);
	
	@Delete("delete from news_inf where news_id = #{xyz}")
	void deleteNews(Integer id);
	
	@Select("select * from news_inf where news_id > #{id}")
	@Results({
		// 只定义了news_id和id属性之间的映射
		// 其他列使用自动映射
		@Result(column = "news_id", property = "id", id = true)
	})
	List<News> findNews(Integer id);

}

文章来源:https://blog.csdn.net/weixin_39289095/article/details/134661424
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。