自动映射:其实就是前面介绍“同名映射”规则。
即使你使用<resultMap…/>指定映射时,autoMapping="true"属性默认为true,控制默认开启自动映射
自动映射依然是起作用的!
【经验:】即使用<resultMap…/>定义映射规则时,其实你只需要指定哪些不能自动映射的列
如果你将该设置开启(默认是关闭的),MyBatis可以自动完成下划线列名与驼峰写法的属性名之间的映射。
可将数据库表字段 user_name,自动映射成java属性 userName
主配置文件
<?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>
主配置文件
<?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);
}