1.增删改标签
1>id:命名空间的唯一标识符,绑定目标方法
2>timeout:由Spring来做
3>statementType:执行SQL语句
4>useGenerateKeys:
5>keyProperty:
实现获取到插入数据后的自增id;
2.单个参数: mybatis不会做特殊处理,直接使用#{参数名}:取出参数值。
多个参数: mybatis会做特殊处理。
多个参数会被封装成一个map,
- key:param1…paramN
- value:传入的值
#{}就是从map中获取指定的key的值
<!--
sql映射文件的sql配置
因为传递了多个参数,所以在使用的时候要记得使用param1。。。。paramN的取值方式进行取值。
-->
<select id="getEmpByIdAndLastName" resultType="dao.Employee">
select * from tbl_employee where id = #{param1} and last_name=#{param2}
</select>
命名参数: 明确指定封装参数时map的key;@Param(“id”)
多个参数会被封装成一个map,
- key:使用@Param注解指定的值
- value:参数值
#{指定的key}取出对应的参数值
/接口函数
public Employee getEmpByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastName);
<!--
sql映射文件的sql配置
因为传递了多个参数,并且使用了命名参数的规则,所以可以使用#{指定的key}取出对应的参数值的方式取值
-->
<select id="getEmpByIdAndLastName" resultType="dao.Employee">
select * from tbl_employee where id = #{id} and last_name=#{lastName}
</select>
POJO: 如果多个参数正好是我们业务逻辑的数据类型,我们就可以直接传入pojo;(使用对象传递的方式进行传递数据)
#{属性名}:取出传入pojo的值
//接口函数
public void updataEmp(Employee employee);
<!--
sql映射文件的sql配置
因为传递的是对象类型的数据,所以在取数据的时候就是用#{属性名}的方式进行取值
并获取到修改数据的主键值
-->
<!--修改函数-->
<update id="updataEmp" useGeneratedKeys="true" keyProperty="id">
update tbl_employee
set last_name=#{lastName},email=#{email},gender=#{gender}
where id=#{id}
</update>
Map: 如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入map。
#{key}:取出map中对应的值
//接口函数
public Employee getEmpByMap(Map<String,Object> map);
<!--
sql映射文件的sql配置
因为传递的是一个map集合的对象,所以在获取数据的时候要使用#{key}取出map中对应的值
-->
<select id="getEmpByMap" resultType="dao.Employee">
select * from tbl_employee where id = #{id} and last_name=#{lastName}
</select>
@Test
public void test5() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//获取到的sqlSession不会自动提交
SqlSession openSession = sqlSessionFactory.openSession();
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Map<String,Object> map=new HashMap<String, Object>();
map.put("id",1);
map.put("lastName","tom");
Employee employee = mapper.getEmpByMap(map);
System.out.println(employee);
openSession.close();
}
#{}:是以预编译的形势,将参数设置到sql语句中;与PreparedStatement;防止sql注入
${}:取出的值直接拼接在sql语句中;会有安全问题
大多数情况下,我们去参数的值都应该去使用#{};
原生jdbc不支持占位符的地方我们就可以使用${}进行取值
比如分表、排序。。;按照年份分表拆分
当想要从未知的表中查询信息时,就可以使用select * from ${xxx} where id=? (from后不支持预编译)
4.返回数据
对于简单数据类型,例如查询总记录数、查询某一个用户名这一类返回值是一个基本数据类型的,直接写Java中的基本类型即可。
如果返回的是一个对象或者集合,并且对象中的属性和查询的字段名是一一对应的,那么resultType也可以直接写一个对象。
2>ResultMap
resultMap只要用来解决属性名和字段名不一致以及一对多、一对一查询等问题,字段名不一致时,首先可以通过别名解决。
4.自定义结果集(resultMap):自定义每一列数据和javaBean的映射规则
<?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="dao.EmployeeMapper">
<!--type属性的值为封装的JavaBean的全类名,id用于唯一标识该resultMap-->
<resultMap type="bean.Employee" id="MyEmp">
<!--
id:指定主键的封装规则,使用id标签定义主键底层会有优化
column:指定数据库中表的字段名
property:指定对应的javabean的属性
-->
<id column="id" property="id"/>
<!-- result标签定义普通列封装规则 -->
<result column="last_name" property="lastName"/>
<!-- 其他列可以不指定,不指定的列会自动封装,但是推荐只要指定resultMap就把全部的映射规则都写上 -->
<result column="email" property="email"/>
<result column="gender" property="gender"/>
</resultMap>
<!-- 这里resultMap属性的值为前面定义的resultMap的id -->
<select id="getEmpById" resultMap="MyEmp">
select * from tbl_employee where id = #{id}
</select>
</mapper>
在全局配置文件mybatis-config.xml中不开启驼峰命名,进行下面的测试,查看能否将数据库中的last_name字段的值封装进 JavaBean 的 lastName 成员变量
public class MyBatisTest {
// 获取SqlSessionfactory对象的方法
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpById(1);
System.out.println(employee);
} finally {
openSession.close();
}
}
}
由此可见,通过使用 resultMap 标签来自定义封装的规则,在不开启驼峰命名的时候也可以将 last_name字段的值封装进 JavaBean 的 lastName 变量中;
resultMap 标签就是用于定义 数据库表的字段名 与 JavaBean实体类的成员变量 的对应关系
(resultMap的更大作用应该是在于其内部的association标签和collection标签,这两个标签主要用于多表联合查询,以及discriminator鉴别器)