MyBatis实现CRUD操作(映射文件的方式)
前面着重介绍了MyBatis的配置以及语句执行的内部逻辑,现在着眼MyBatis的使用上.
增
在dao接口中添加对应的接口方法
dao接口
/**
* 保存用户信息
* @param user
*/
void saveUser(User user);
xml文件
<!--保存用户-->
<insert id="saveUser" parameterType="org.zjb.domain.User">
insert into user (username, address, sex, birthday)
values (#{username}, #{address}, #{sex}, #{birthday});
</insert>
注意:由于增删改都涉及表内容的改变,所以执行完这个方法后需要提交事务
提交事务的方法为 sqlSession.commit();
parameterType属性的介绍
- parameterType这个属性代表传递过来参数的类型,即saveUser(User user)中的 User
- 如果是自定义类一般需要给全限定名,如果是简单类(八大基本类型和对应的包装类以及String)可以直接使用类名,如传递的参数是Integer,该属性的值可以为int,INT,INTEGER,integer,java.lang.Integer
- 当参数有多个时,需要确保xml文件中大括号中的属性名和传递参数中的属性名一一对应
- 当只有一个参数时,这个参数名称可以随意取
新增数据后获取自增id
由于数据库表中的主键id为自增主键,在进行插入操作时不会传入这个参数,但是可能某些情况下需要在新增后得到这个id,可以使用<selectKey这个标签>
dao中的方法我们不需要改变
我们只需要改变配置文件中的内容即可
<!--保存用户-->
<insert id="saveUser" parameterType="org.zjb.domain.User">
<!--插入操作后获取插入数据的id-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user (username, address, sex, birthday)
values (#{username}, #{address}, #{sex}, #{birthday});
</insert>
可以看见我们新增加了<selectKey这个标签>
对于标签的属性我们给出解释:
- KeyProperty : 代表domain对象中需要获取的属性,即user中的id属性
- KeyColumn :代表数据库表中需要获得的列名,即数据库表中的id列
- resultType : 返回的类型,即需要返回的user的id属性的类型为integer
- order : 代表标签内部的sql语句执行的时机,为下方的主sql执行完毕之后执行
执行完毕之后的值去哪了?
由于上方KeyProperty的指定,所以框架可以将id拿回来后填充回user对象对应的属性之中了
@Test
public void testSave() throws IOException {
User user = new User();
user.setAddress("北京市");
user.setBirthday(new Date());
user.setSex("男");
user.setUsername("王守玉");
System.out.println("保存前的user" + user);
init(); // 这个方法是自己封装的各种对象的创建方法
userDao.saveUser(user);
// 提交事务
session.commit();
destroy(); // 这个方法是自己封装的资源的释放方法
System.out.println("保存后的user" + user);
}
程序运行的结果为:
删
dao中
/**
* 根据id删除用户
* @param userId
*/
void deleteUser(Integer userId);
<!--根据id删除用户信息-->
<delete id="deleteUser" parameterType="Integer">
delete from user where id=#{uid};
</delete>
删除用户由于只有一个参数,所以这个参数可以随便写,但是还是建议对应,比较方便代码阅读.
查
前面介绍过查询所有用户信息,下面介绍一些别的.
根据id查询用户信息
/**
* 根据id查询用户信息
* @param userId
* @return
*/
User findById(Integer userId);
<!--根据id查询用户信息-->
<select id="findById" parameterType="Integer" resultType="org.zjb.domain.User">
select * from user where id=#{id};
</select>
根据姓名模糊查找
/**
* 根据名称模糊查询
* @param name
* @return
*/
List<User> findByName(String name);
<!--根据名称模糊查询-->
<select id="findByName" parameterType="String" resultType="org.zjb.domain.User">
<!--select * from user where username like #{username};-->
select * from user where username like '%${username}%';
</select>
模糊查找可以使用 #{username} 的方式,也可以使用 ‘%${username}%’ 的方式
- #和 $的区别在于前者为预编译的,后者是单纯的字符串拼接.
- 当使用前者的方式,需要在方法的调用过程中指定%为模糊词
- 使用后者的方式,可以在sql语句编写阶段就完成模糊词的插入
查找用户总数
直接在sql中使用聚合函数即可
/**
* 查询总用户数
* @return
*/
int findTotal();
<!--查询用户的总记录条数,使用聚合函数-->
<select id="findTotal" resultType="INT">
select count(id) from user;
</select>
改
没什么好说的,直接上代码
/**
* 更新用户信息
* @param user
*/
void updateUser(User user);
<!--查询用户的总记录条数,使用聚合函数-->
<select id="findTotal" resultType="INT">
select count(id) from user;
</select>