MyBatis的CRUD操作
步骤:
- 修改Dao接口.
- 在Mapper中对应Dao接口的完整namespace+id写SQL语句.
- 方法有返回类型的需要有 resultType 有传参的类型需要写 parameterType.
- insert into user(…) values(#{a},#{b});
- 增删改需要进行commit,因为Setting autocommit to false. 需要手动commit,否则进行了回滚.
- 模糊查询 where username like #{name}. 然后传参 “%X%”; 用的是prepareStatement.
- 当写为 where username like ‘%${value}%’ 时,直接传参"X".用的是Statement.
- 数据库主键包括自增和非自增,有时候新增一条数据不仅仅知道成功就行了,后边的逻辑可能还需要这个新增的主键,这时候再查询数据库就有点耗时耗力,我们可以采用selectKey来帮助我们获取新增的主键.
<selectKey keyproperty="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
keyproperty 对应实体类的属性名称.
Mybatis参数
OGNL表达式
- Object Graphic Navigation Language(对象导航图语言).Mybatis使用ognl表达式解析对象字段的值.#{}或者${}括号中的值为pojo属性名称.
- 通过对象的取值方法来获取数据,在写法上吧get省略了.
- 比如:类中的写法: user.getUsername();
OGNL表达式写法:user.username
Mybatis中为什么不用user. 而可以直接写username呢?
答:因为在parameterType中已经提供了属性所属的类.
- 比如:类中的写法: user.getUsername();
POJO对象
P.S. POJO与Javabean的区别.
POJO全称是Plain Ordinary Java Object.普通Java类,具有一部分getter/setter方法的那种类就可以称作POJO.通常情况下,由于 Java Bean 是被容器所创建(如 Tomcat) 的,所以 Java Bean 应具有一个无参的构造器,另外,通常 Java Bean 还要实现 Serializable 接口用于实现 Bean 的持久性。 Java Bean 是不能被跨进程访问的。JavaBean是一种组件技术.简而言之,当一个Pojo可序列化,有一个无参的构造函数,使用getter和setter方法来访问属性时,他就是一个JavaBean。
查询条件对象(POJO包装对象)
- 将查询条件参数传递进去. 比如QueryVo.
- 用user.username 是因为OGNL表达式的用法.QueryVo只有属性user.所以要先找到user再查user属性.
- pojo属性名称一定和参数里面对应的属性名相同,要不会报错,查不到该属性.
- domain/user里面的属性值与MySQL数据库的属性名要一致,否则数据封装不进去(Windows不区分大小写.但Linux系统会区分大小写.).
- 上述不对应问题,在SQL语句中用 id as userID 取别名的方式是可以的.
- Mybatis提供了配置表的列名和实体类的属性名对应关系的解决方法.
<resultMap id="随便,用于标识该resultMap 如:userMap" type="要封装的类 ...domain.user">
<!--主键字段的对应 -->
<id property="userId" column="id"></id>
<!--非主键字段的对应 property对应java属性,严格区分大小写.-->
<result property="userName" column="username"></result>
</resultMap>
<!--现在标签里面不再是resultType 而是 resultMap="userMap"-->
<!--这种方法没有取别名快,但是能够复用,其他SQL语句,只要修改为resultMap就全部可以使用了-->