mybatis第三天 mapper的四种配置方式,别名,自定义typeHandler

本文详细介绍了在MyBatis配置中通过四种方式引入mapper,包括绝对/相对路径、接口实现类全限定名、包内映射器接口注册,以及别名的使用,包括typeAliases、pojo包下的对象别名和内置Java类型别名。此外,还讲解了自定义typeHandler的重要性及其使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1: 核心配置文件中引入 mapper 的四种方式

   1:   <!-- 绝对路径引入 classpath下  -->
        <!--  <mapper url="file:D:\mapper\userMapper.xml"/>  -->
   2:   <!-- 相对路径引入 classpath下  -->
        <!--  <mapper resource="mapper/userMapper.xml"/>  -->
   3:   <!-- 使用映射器接口实现类的完全限定类名 -->
        在核心配置文件中修改mapper
        <mapper class="org.wl.mapper.UserMapper"/>  
        修改mapper 的namespace 为 UserMapper 的全路径名称
        <mapper namespace="org.wl.mapper.UserMapper">
            <select id="queryUserById" parameterType="java.lang.String" resultType="org.wl.pojo.User">
                select * from t_user where id = #{id}
            </select>
        </mapper>
   4: 编写测试接口和实现,这时候就可以不写Dao层了 Mapper接口会通过动态代理反射和javassist技术
      动态的为Mapper 接口在运行时生产代理对象作为接口实现类执行sql (后续在源码解读的的时候说)
    实现类
    public class UserServiceImpl implements UserService {
    static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
    @Override
    public User queryUserById(String id) {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.queryUserById(id);
        logger.info("user is {}",user);
        return null;
    }
   }

   接口
   public interface UserService {
        User queryUserById(String id);
   } 
   
   测试
    @Test
    public void testQueryUserByIdByMapper(){
        UserService userService = new UserServiceImpl();
        userService.queryUserById("1e9d6465-c9c7-4eed-8a26-b52b1e0101c5");
    }
   5: 第四种方式 将包内的映射器接口实现全部注册为映射器 <package name="org.wl.mapper"/>

2: 别名

   1: 在核心配置文件中添加 别名标签
    <typeAliases>
        <typeAlias alias="User" type="org.wl.pojo.User"/>
    </typeAliases>
    修改mapper映射文件中的resultType 为别名制定的类名称 并且是不区分到小写的
    <mapper namespace="org.wl.mapper.UserMapper">
    <select id="queryUserById" parameterType="java.lang.String" resultType="User">
        select * from t_user where id = #{id}
    </select>
    </mapper>
    也可以是下面的小写
    <mapper namespace="org.wl.mapper.UserMapper">
    <select id="queryUserById" parameterType="java.lang.String" resultType="user">
        select * from t_user where id = #{id}
    </select>
   </mapper>
   2: 配置整个pojo 包下的对象都可以使用别名的方式
     <typeAliases>
      <package name="org.wl.pojo"/>
     </typeAliases>
   3: mybatis 提供的别名,常见的 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  
    验证一下mybatis 给的别名 
    <mapper namespace="org.wl.mapper.UserMapper">
    <select id="queryUserById" parameterType="string" resultType="user">
        select * from t_user where id = #{id}
    </select>
    </mapper>
    
    <mapper namespace="org.wl.mapper.UserMapper">
    <select id="queryUserById" parameterType="String" resultType="user">
        select * from t_user where id = #{id}
    </select>
    </mapper>

3: resultMap 的使用

   <resultMap id="userMap" type="user">
        <id property="id" column="id" javaType="string" jdbcType="VARCHAR"/>
        <result property="name" column="name"  javaType="string" jdbcType="VARCHAR"/>
        <result property="age"  column="age"    javaType="int" jdbcType="INTEGER"/>
        <result property="userAddress" column="user_address" javaType="string" jdbcType="VARCHAR"/>
    </resultMap>
    
    <select id="queryUserById2" parameterType="String" resultMap="userMap">
        select * from t_user where id = #{id}
    </select>
    MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型
    类型处理器	Java 类型	JDBC 类型
    BooleanTypeHandler	java.lang.Boolean, boolean	数据库兼容的 BOOLEAN
    ByteTypeHandler	java.lang.Byte, byte	数据库兼容的 NUMERIC 或 BYTE
    ShortTypeHandler	java.lang.Short, short	数据库兼容的 NUMERIC 或 SMALLINT
    IntegerTypeHandler	java.lang.Integer, int	数据库兼容的 NUMERIC 或 INTEGER
    LongTypeHandler	java.lang.Long, long	数据库兼容的 NUMERIC 或 BIGINT
    FloatTypeHandler	java.lang.Float, float	数据库兼容的 NUMERIC 或 FLOAT
    DoubleTypeHandler	java.lang.Double, double	数据库兼容的 NUMERIC 或 DOUBLE
    BigDecimalTypeHandler	java.math.BigDecimal	数据库兼容的 NUMERIC 或 DECIMAL
    StringTypeHandler	java.lang.String	CHAR, VARCHAR
    ClobReaderTypeHandler	java.io.Reader	-
    ClobTypeHandler	java.lang.String	CLOB, LONGVARCHAR
    NStringTypeHandler	java.lang.String	NVARCHAR, NCHAR
    NClobTypeHandler	java.lang.String	NCLOB
    BlobInputStreamTypeHandler	java.io.InputStream	-
    ByteArrayTypeHandler	byte[]	数据库兼容的字节流类型
    BlobTypeHandler	byte[]	BLOB, LONGVARBINARY
    DateTypeHandler	java.util.Date	TIMESTAMP
    DateOnlyTypeHandler	java.util.Date	DATE
    TimeOnlyTypeHandler	java.util.Date	TIME
    SqlTimestampTypeHandler	java.sql.Timestamp	TIMESTAMP
    SqlDateTypeHandler	java.sql.Date	DATE
    SqlTimeTypeHandler	java.sql.Time	TIME
    ObjectTypeHandler	Any	OTHER 或未指定类型
    EnumTypeHandler	Enumeration Type	VARCHAR 或任何兼容的字符串类型,用来存储枚举的名称(而不是索引序数值)
    EnumOrdinalTypeHandler	Enumeration Type	任何兼容的 NUMERIC 或 DOUBLE 类型,用来存储枚举的序数值(而不是名称)。
    SqlxmlTypeHandler	java.lang.String	SQLXML
    InstantTypeHandler	java.time.Instant	TIMESTAMP
    LocalDateTimeTypeHandler	java.time.LocalDateTime	TIMESTAMP
    LocalDateTypeHandler	java.time.LocalDate	DATE
    LocalTimeTypeHandler	java.time.LocalTime	TIME
    OffsetDateTimeTypeHandler	java.time.OffsetDateTime	TIMESTAMP
    OffsetTimeTypeHandler	java.time.OffsetTime	TIME
    ZonedDateTimeTypeHandler	java.time.ZonedDateTime	TIMESTAMP
    YearTypeHandler	java.time.Year	INTEGER
    MonthTypeHandler	java.time.Month	INTEGER
    YearMonthTypeHandler	java.time.YearMonth	VARCHAR 或 LONGVARCHAR
    JapaneseDateTypeHandler	java.time.chrono.JapaneseDate	DATE
    

4: 自定义 typeHandler

Mybatis在执行SQL语句之前和完成之后都将要处理JDBC类型与Java类型之间的转换
你可以重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 
具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口,
或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler,
并且可以(可选地)将它映射到一个 JDBC 类型
   
package org.wl.handler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ExampleTypeHandler extends BaseTypeHandler<String> {
    static final Logger logger = LoggerFactory.getLogger(ExampleTypeHandler.class);
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        logger.info("ExampleTypeHandler---->setNonNullParameter");
        ps.setString(i, parameter);
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        logger.info("ExampleTypeHandler---->getNullableResult");
        return rs.getString(columnName);
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        logger.info("ExampleTypeHandler---->getNullableResult2");
        return rs.getString(columnIndex);
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        logger.info("ExampleTypeHandler---->getNullableResult3");
        return cs.getString(columnIndex);
    }
}

    在核心配置文件中添加
    <typeHandlers>
        <typeHandler handler="org.wl.mapper.ExampleTypeHandler" javaType="java.lang.String" jdbcType="VARCHAR"/>
    </typeHandlers>
    
    <resultMap type="user" id="userMap2">
        <id property="id" column="id" typeHandler="org.wl.mapper.ExampleTypeHandler"/>
        <result property="name" column="name"  typeHandler="org.wl.mapper.ExampleTypeHandler"/>
        <result property="age"  column="age"    javaType="int" jdbcType="INTEGER"/>
        <result property="userAddress" column="user_address" typeHandler="org.wl.mapper.ExampleTypeHandler"/>
     </resultMap>
    <select id="queryUserById3" parameterType="String" resultMap="userMap2">
        select * from t_user where id = #{id}
    </select>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值