1.Mapper配置文件详解
1)mapper中nameSpace属性
<mapper>标签是SQL映射文件中根目录标签.在这个标签中只有输一个属性
<mapper namesapce=””>
在MyBatis中,Mapper中的namespace用于绑定Dao接口的,即面向接口编程。
它的好处在于当使用了namespace之后就可以不用写接口实现类,业务逻辑会直接通过这个绑定寻找到相对应的SQL语 句进行对应的数据处理
namespace属性赋值规则
(1)规则1: 短名称(比如“selectAllThings”)如果全局唯一也可以作为一个单独的引用
<!--配置在核心配置文件中-->
<typeAliases>
<typeAlias alias="user" type="com.czh.dao.UserDao"/>
</typeAliases>
<mapper配置文件引用别名>
<mapper namespace="user"><mapper/>
(2)规则2:接口完全限定名
<mapper配置文件引用当前工程中一个接口完整路径>
<mapper namespace="com.czh.dao.UserDao"><mapper/>
2.parameterType属性 将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器推断出具体传入语句的参数,默认值为未设置(unset)
参数(#{参数名}):#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符
如果当前sql语句中只有一个参数,此时参数名称可以随意定义
但是,如果当前sql语句有多个参数,此时参数名称应该是与当前表关联[实体类的属性名]
基本类型和String我们可以直接写类型名称,也可以使用包名.类名的方式,例如:java.lang.String。 实体类类型,目前我们只能使用全限定类名。 究其原因,是mybaits在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。
3.#{}和${}区别
#{} : 采用预编译方式,可以防止SQL注入
${}: 采用直接赋值方式,无法阻止SQL注入攻击
在大多数情况下,我们都是采用#{}读取参数内容.但是在一些特殊的情况下,我们还是需要使用${}读取参数的
<!--比如 有两张表,分别是user_2017 和 user_2018 .如果需要在查询语句中动态指定表名,就只能使用${}-->
<select>
select * from user_${year}
<select>
<!--比如 需要动态的指定查询中的排序字段,此时也只能使用${}-->
<select>
select * from user order by ${name}
</select>
简单来说,在JDBC不支持使用占位符的地方,都可以使用${}
4.resultType属性 从这条语句中返回的期望类型的类的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包 含的类型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同时使用
resultType属性可以指定结果集的类型,它支持基本类型和实体类类型。 需要注意的是,它和parameterType一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。
5.resultMap结果类型 resultMap标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。 在select标签中使用resultMap属性指定引用即可。同时resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
<resultMap id="userMap" type="com.czh.entity.User">
<id property="id" column="id" />
<result property="name" column="user_name"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
</resultMap>
<select id="selectUser" resultMap="userMap" parameterType="com.czh.entity.User">
select * from user where id=#{id}
</select>
6.sql标签 这个元素可以被用来定义可重用的 SQL 代码段,这些 SQL 代码可以被包含在其他语句中。它可以(在加载的时候)被静态地设置参数。 在不同的包含语句中可以设置不同的值到参数占位符上
<sql id="selectuser">
select * from user
</sql>
<select id="selectid" resultMap="userMap" parameterType="com.czh.entity.User">
<include refid="selectuser"></include>
where id=#{id}
</select>
<select id="selectname" resultMap="userMap" parameterType="com.czh.entity.User">
<include refid="selectuser"></include>
where name=#{name}
</select>