Mybatis 中xml和注解映射,分分钟搞定( 二 )

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中的字段名不一致,怎么处理?在实际开发中,这种常见是在所难免 。我们可以使用下面的这种方式解决 。
实体类User
public class User {private Integer id;private String userName;private Integer age;//set get toString方法这里就不贴了}UserMapper.xml文件内容:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//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"><id column="id" property="id"/><result column="name" property="userName"/></resultMap><select id="selectUserById"resultMap="User" parameterType="int" >select * from m_user where id = #{id}</select></mapper> 

Mybatis 中xml和注解映射,分分钟搞定

文章插图
 
  • type:对应的是我们的实体类,全路径名 。
  • id:可以理解为别名 。
 
Mybatis 中xml和注解映射,分分钟搞定

文章插图
 
  • id:唯一标识,此id值用于select元素resultMap属性的引用 。
  • column:对应我们数据库表中的字段名称 。
  • property:对应我们的实体类的属性,比如:User中的属性userName,要和数据库表m_user中的name对应 。
  • result:标识一些简单属性,其中column属性代表数据库的字段名,property代表查询出来的字段名映射到实体类的某个属性 。
继续使用我们前面的测试类进行测试:
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);System.out.println(userMapper.selectUserById(1));输出:User{id=1, userName='tian', age=22}
注意:实体类的get set 和toString()方法这里给省略,希望大家在使用的使用,使用快捷键很简单的就搞定了 。
上面提到过resultType和resultMap,那么他们两到底有什么区别呢?
resultType和resultMap 有什么区别?
  • resultType:直接表示返回类型,包括基本数据类型和复杂数据类型 。
  • resultMap:外部resultMap定义的引用,通过对应的外部resultMap的id,表示结果映射到哪个resultMap上,一般用于字段名和属性名不一致的情况,或者需要做复杂的联合查询以便自由控制映射结果 。
两者的关联
当进行查询时,查询出来的每个字段都会放在一个Map里,当查询元素返回属性是resultType的时候,会将键值对取出赋所指定的属性 。其实MyBatis的每个查询映射的返回类型都是resultMap,只是当我们使用resultType的时候,会自动把对应的值赋给所指定的对象属性,当使用resultMap时候,因为map不是很好的表示领域,我们就进一步的转化为对应的实体对象 。resultMap主要作用于复杂的联合查询上 。
resultMap的自动映射级别:默认级别为PARTIAL,也可以在settings更改值 。
注意:resultType和resultMap本质是一样的,都是Map数据结构,但是二者不能同时存在 。
增删改案例insert
Mybatis 中xml和注解映射,分分钟搞定

文章插图
 
从这里可以知道,关于增加insert是没有返回值类型可以让我们指定的 。默认返回int类型 。
<insert id="insert" parameterType="com.tian.mybatis.entity.User">INSERT INTO m_user(`name`,age) VALUES ( #{userName},#{age})</insert>


推荐阅读