一、占位符和拼接符(#{}和${})
1,#{} 占位符:如果传入的是基本数据类型(int,double...)那么#{}中的的变量名可以随便写,
如果传入的是pojo类型,那么变量名必须是pojo对应的属性名。
eg:
insert into user (username,birthday) values(#{username},#{birthday})
2,${}拼接符: 如果传入的是基本数据类型(int,double...)那么${}中的变量名必须是value,
如果传入的是pojo类型那么${}中的变量名必须是pojo对应的属性名。
二、insert语句自增主键返回值
insert id="insertUser" parameterType="com.itcast.pojo.User">
<!--
select LAST_INSERT_ID() 执行该函数,返回数据库刚刚插入表中数据自增的主键的ID
keyProperty:将返回的主键传入pojo属性Id进行保存
order:相对于insert语句的执行顺序(before inset语句执行之前插入;after :insert执行之后插入),
resultType:id的类型(对应传入参数user id属性)也就是keyProperty的返回值类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user (username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
注意:如果mysql使用uuid自增主键这里order是“BEFORE”
三、Mapper动态代理开发方式
Mapper接口开发需要遵循以下规范:
- Mapper.xml文件中的namespace与mapper接口的类路径名相同。
- Mapper接口方法名和Mapper.xml中定义的每个crud语句的id相同。
- Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType输入参数类型相同。
- Mapper接口方法的输出类型必须和mapper.xml中定义的每个sql的resultType输出参数类型相同。
eg:(1)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="cn.mybatis.mapper.UserMapper">
<!-- 根据id获取用户信息 -->
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
select * from user where id = #{id}
</select>
</mapper>
(2)mapper.java
/**
* 用户管理mapper
*/
Public interface UserMapper {
//根据用户id查询用户信息
public User findUserById(int id) throws Exception;
}
(3)加载Mapper.xml文件
修改SqlMapConfig.xml文件:
<!-- 加载映射文件 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
(4)测试
Public class MapperTest extends TestCase {
private SqlSessionFactory sqlSessionFactory;
@Before
protected void setUp() throws Exception {
//mybatis配置文件
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//使用SqlSessionFactoryBuilder创建sessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
Public void testFindUserById() throws Exception {
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获取mapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//调用代理对象方法
User user = userMapper.findUserById(1);
System.out.println(user);
//关闭session
session.close();
}
}
四、Mapper映射器(有三种)
(1)使用路径资源(如果有多个资源,需要一个个添加资源路径)
<mapper resource="sqlmap/User.xml" />
(2)使用Mapper类路径(如果有多个类,需要一个个添加类路径)
注意:这种方法要求mapper接口名称和mapper.xml映射文件名相同,并且在相同目录。
(3)使用包扫描的方式(扫描指定包名下的所有mapper文件)
<package name="cn.mybatis.mapper"/>
注意:这种方法要求mapper接口和mapper.xml映射文件名相同,并且在相同目录。
五、源码