一、xml方式
需要 mapper.java(接口文件)和 mapper.xml(配置文件),SQL写在 mapper.xml 文件中
使用select标签
查询操作
<!--
select标签:查询操作
id属性(必须要):statement的id,用于表示定义的SQL,
在同一个命名空间中id是不允许重复的,对应接口文件中的方法名
#{XXX}:输入参数的占位符,避免SQL注入
parameterType/parameterMap:输入参数类型
parameterType:基本数据类型、自定义类型
parameterMap:Map类型(key value)
resultType/resultMap:指定结果集类型
-->
<select id="selectStudentById" parameterType="int" resultType="student" >
select * from Student where SID = #{id}
</select>
- 返回结果集可以使用 resultType 和 resultMap 两种
(1) 数据库表的列名 和 java映射类的属性名如果一致时,可以使用resultType和resultMap处理都可以。
(2) 表列名 和 类属性名 存在不一致时,需要使用 resultMap来手动实现映射过程。
<!--
resultMap标签是自定义返回结果,当返回结果集指定为resultMap时使用该标签
id:取名字 select操作是结果集通过resultMap属性指定时使用该id属性
type属性:要映射的Java类的全路径
id/result:对结果的自定义映射
id标签:主键使用该标签,结果集中只能设定一个id标签
result:处理非主键标签
-->
<resultMap id="studentResult" type="student">
<id property="" column=""/>
<!--
id/result标签的属性介绍
property:指定Java类中的属性名
column:(必须)指定数据库中列名
JavaType:(可省略)指定Java属性类型
jdbcType:(可省略)指定数据库中列名属性
typeHandler:(可省略)指定类型转换器
-->
<result property="" column="" javaType="" jdbcType="" typeHandler=""/>
</resultMap>
<select id="selectStudentById" parameterType="int" resultMap="studentResult" >
select * from Student where SID = #{id}
</select>
- 不管对于单个对应的映射还是多个对象的映射,resultType 和 resultMap 只关注映射的对象类型,查询操作会根据是单个对象则选取 selectOne 方法执行,返回 多个对象 则使用 selectList 方法来执行。
- 插入对象的写法
<insert id="addStudent" parameterType="student">
insert into Student (SID,Sname,Sage,Ssex) values
(#{id},#{Sname},#{Sage},#{Ssex} )
</insert>
- 多参数传递接口:
public int updateNameById(String name,Integer id);
- 通过参数传递的name是不能被mybatis识别的,mybatis中多参数提供的有0,1,parm1和parm2作为参数,为了解决这种多参数传递可以使用 @Param 注解来对参数进行绑定:
public int updateNameById(@Param("name") String name,@Param("id") Integer id);
这种实现是通过参数形式,底层是通过map的实现方式进行参数传递,其中map的key即为注解中的名称,value即为名称对应的值。
基于xml形式需要遵循一定的规则:
- xml配置文件中的命名空间和指向接口文件的地址(全路径)
- mapper.java接口文件中的方法名和mapper.xml中Statement的 id 保持一致
- mapper.java接口中方法参数和mapper.xml中Statement的 parameterType 或 parameterMap 的类型一致
- mapper.java接口中方法返回值类型和mapper.xml中mapper.xml文件中Statement的 resultType 或 resultMap 类型一致
二、注解方式
创建表对应的pojo类型
- 给定mapper.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,命令空间:保证命名空间唯一,一般是对应的mapper.java的包全路径-->
<mapper namespace="mapper.CourseMapper">
</mapper>
- 全局配置文件中引入mapper.xml
<mappers>
<!--resource:配置单个映射文件,
mapper.java接口文件和mapper.xml文件可以不在同一路径下且名称可以不同
-->
<mapper resource="mapper/CourseMapper.xml"/><!--相对路径-->
</mappers>
- 接口文件,SQL都在注解上,且注解存在mapper.java文件
public interface CourseMapper {
/**
* @Select 注解即xml配置文件中的select标签
*
* @Results注解和xml 配置文件中ResultMap标签使用类似
*/
@Results(id = "CourseResult",
value = {
@Result(column = "CID" ,property = "CID"),
@Result(column = "Cname",property = "cname"),
@Result(column = "TID", property = "TID")
})
@Select("select * from Course where CID = #{CID}")
public Course selectCourseById(Integer CID);
@Insert("insert Course (Cname,TID) values(#{Cname},#{TID})")
public int addCourse(Course course);
}
#{} 和 ${} 的区别?
使用
- #{}
select * from Course where CID = #{CID}
接口方法:
public Course selectCourseById(Integer CID);
通过日志可知,在执行过程中,占位符 #{XX} 被替换为 ?,且SQL和参数分别传递,类似于JDBC中的PraperteStatement使用。
- ${}
方法参数的传递是通过 ognl 表达式进行解析的,需要调用参数的 getter 方法,因此参数必须有getter存在的。使用 ${}打印日志如下:
参数直接拼接在SQL上,和JDBC中的Statement类似。 - 安全性:
使用 #{} 是 可以防止SQL注入问题
使用 ${} 是 不能解决SQL注入问题