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>