二、Mybatis实现CRUD注意点及resultMap

首先要注意的是持久层中mapper标签的namespace必须为持节层接口的全限名。接下来的就是CRUD需要注意的一些东西,代码网上有很多,入门的基本都差不多。

1、select属性详解

<select id="findAllById" resultType="com.chen.domain.User" parameterType="int">
        select * from user where id = #{id}
</select>
    id:在命名空间中唯一的标识符,可以被用来引用这条语句。接口的方法需于该id一致 parameterType:该属性的取值可以是基本类型也可以是引用类型类型,或者是实体类型POJO类,其中基本类型与String我们可以直接写类型名称,甚至基本类型可以不用写。但其他,我们只能使用全限定名称。究其原因是因为 mybaits 在加载时已经把常用的数据类型注册了别名。具体可以查看 Mybatis中文文档:类型别名(typeAliases)这一块内容。 resultType:为指定结果集的类型。如果该类型是实体类型,则需要将数据库的表名与实体类的属性名保持一致,否则将会出现null值。假若数据库的id列名字为userId,而实体类为id,则在sql语句中输入userId as id。当然一般不推荐该种类型,一般均使用resultMap结果类型实现封装。 关于# {}与$ {}的区别:#{}相当于JDBC中的 ?,而${}会直接替换。 User user = mapper.findByName("3"); #{}: <select id="findByName" resultType="com.chen.domain.User" parameterType="String"> select * from user where user_name like #{name} </select> 该类型的输出语句为select * from user where user_name like ? ${} <select id="findByName" resultType="com.chen.domain.User" parameterType="String"> select * from user where user_name like %${name}% </select> 该类型的输出语句为select * from user where user_name like ‘%3%’

2、insert, update 和 delete

    需要注意的是当参数类型为实体类时:
<insert id="saveUser" parameterType="com.chen.domain.User">
        insert into user(id,name,password)values (#{id},#{name},#{password})
</insert>

此外后期使用还需注意以下三个属性名

    useGeneratedKeys:MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键。项目上均使用uuid。之后配置会描述 keyProperty:指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值 keyColumn:设置生成键值在表中的列名,在某些数据库中,当主键列不是表中的第一列的时候,是必须设置的

3、resultMap

    resultType:期望从这条语句中返回结果的类全限定名或别名,且如果返回的是集合,也是需要设置集合包含的类型。而非集合本身 resultMap:在数据库列名与实体类属性名不一致时,使用该映射。且resultType与resultMap不能同时存在。 <resultMap id="UserMap" type="User"> <id column="user_id" property="id"/> <id column="user_name" property="name"/> <id column="user_password" property="password"/> </resultMap> 需要注意的是,此处的id即为resultMap中需填的值。type为对应的实体类;column为数据库的表的列名;property为对应实体类的属性名
经验分享 程序员 微信小程序 职场和发展