MyBatis
提供了XML配置和注解配置两种方式。今天就来搞搞这两种方式是如何实现的。
MyBatis
的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的JDBC
代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis
致力于减少使用成本,让用户能更专注于SQL
代码。
来自官网。
Mybatis
映射九个顶级元素:
-
mapper:映射文件的根节点,只有一个属性namespace(命名空间),作用如下:
-
-
用于区分不同的mapper,全局唯一。
-
绑定
DAO
接口,即面向接口编程,当绑定一个接口,就不用写此接口的实现类,会通过接口的完全限定名找到对应的mapper配置来执行SQL
语句,所以,namespace
的命名必须要写接口的完全限定名。
-
-
cache:配置给定命名空间的缓存。
-
cache-ref:从其他命名空间引用缓存配置。
-
resultMap
:用来描述数据库结果集和对象的对应关系。 -
sql
:可以重用的SQL
块,也可以被其他语句引用。通常时存放一些公用性的SQL
。 -
insert:映射插入语句。
-
update:更新映射语句。
-
delete:删除映射语句。
-
select:映射查询语句。
xml方式
九个顶级映射元素对应标签:
-
<mapper namespace="com.tian.mybatis.mapper.UserMapper">
-
<resultMap id="" type=""></resultMap>
-
<sql id=""></sql>
-
<cache blocking="" ></cache>
-
<cache-ref namespace=""></cache-ref>
-
<select id="selectUserById"></select>
-
<insert id="insert" ></insert>
-
<update id=""></update>
-
<delete id=""></delete>
-
</mapper>
select详解
可以看得出,后面可选项还是蛮多的。下面是官网对每项的解释。
select使用案例
-
<?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="com.tian.mybatis.mapper.UserMapper">
-
<select id="selectUserById" resultType="com.tian.mybatis.entity.User" parameterType="int" >
-
select * from m_user where id = #{id}
-
</select>
-
</mapper>
-
id必须在这个Mapper中是唯一的,可以被用来引用这条语句 ,这个id必须与只对应的是
XxxMapper.java
中的方法,必须是一一对应。 -
返回类型:User类型,
resultType
:查询语句返回结果类型的完全限定名或别名。别名使用方式和parameterType
是一样的。 -
参数:整形,表示查询语句传入参数的类型和完全限定名或别名。支持基础数据类型和复杂数据类型。
#{参数名}:告诉MyBatis
生成的PreparedStatement
参数,相对于JDBC中
,改参数被标识为‘?’。
别名与参数映射类型如下:
返回类型中别名的使用,注意:
如果是我们的entity类,那么resultType
是无法使用别名的,只能使用resultMap
才可以使用别名。
-
<?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="com.tian.mybatis.mapper.UserMapper">
-
<resultMap id="User" type="com.tian.mybatis.entity.User"/>
-
<select id="selectUserById" resultMap="User" parameterType="int" >
-
select * from m_user where id = #{id}
-
</select>
-
</mapper>
但是如果使用的上面映射表里,也可以直接使用别名。
数据库里有两条数据:
UserMapper.xml
-
<?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="com.tian.mybatis.mapper.UserMapper">
-
<select id="countUser" resultType="int">
-
select count(1) from m_user
-
</select>
-
</mapper>
UserMapper.java
-
import com.tian.mybatis.entity.User;
-
public interface UserMapper {
-
int countUser();
-
}
测试类:
-
public class MybatisApplication {
-
public static final String URL = "jdbc:mysql://localhost.com:3306/mblog?useUnicode=true";
-
public static final String USER = "root";
-
public static final String PASSWORD = "123456";
-
public static void main(String[] args) {
-
String resource = "mybatis-config.xml";
-
InputStream inputStream = null;
-
SqlSession sqlSession = null;
-
try {
-
inputStream = Resources.getResourceAsStream(resource);
-
//工厂模式
-
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
-
//获取sql操作会话
-
sqlSession = sqlSessionFactory.openSession();
-
//构造对象(这里比较特殊,这里构造对象的方式后面会专门分享)
-
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
-
//查询统计
-
System.out.println(userMapper.countUser());
-
} catch (Exception e) {
-
e.printStackTrace();
-
} finally {
-
try {
-
inputStream.close();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
sqlSession.close();
-
}
-
}
-
}
输出:2
当数据库表中的字段名和我们entity中的字段名不一致,怎么处理?
在实际开发中,这种常见是在所难免。我们可以使用下面的这种方式解决。
。。。。。。。。。。。。。。。。。
版权原因,完整文章,请参考如下:Mybatis 中xml和注解映射,so easy啦