上一篇文章:Java入门——maven项目中mybatis环境搭建
讲述了mybatis的环境搭建基本使用方法,这一篇文章在原先的基础上介绍一下mybatis的增删改查功能,这里需要改动的文件为java.com.baz.dao.IUserDao
,resource.com.baz.dao.IUserDaol.xml
,最后测试在java.com.baz.test.MybatisTest
中编写测试类(文档结构不清楚可以参考上一篇文章Java入门——maven项目中mybatis环境搭建)
增
新增用户:
此处修改三处文件:
接口:IUserDao.java
映射:IUserDao.xml
测试类
IUserDao.java增加处理新增方法
int saveUser(User user);
IUserDao.xml
<insert id="saveUser" parameterType="com.baz.domain.User">
insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
</insert>
测试类
@Test
public void testSave(){
User user = new User();
user.setUsername("modify User property");
user.setAddress("北京市顺义区");
user.setSex("男");
user.setBirthday(new Date());
System.out.println("保存操作之前:"+user);
//5.执行保存方法
userDao.saveUser(user);
System.out.println("保存操作之后:"+user);
}
注意:我们在实现增删改时一定要去控制事务的提交,mybatis通过session.commit()
来提交事务
新增用户的id返回值
修改IUserDao.xml
<insert id="saveUser" parameterType="USER">
<!-- 配置保存时获取插入的 id -->
<selectKey keyColumn="id" keyProperty="id" resultType="int">
select last_insert_id();
</selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
删
IUserDao.java
int deleteUser(Integer userId);
IUserDao.xml
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id = #{uid}
</delete>
测试类
@Test
public void testDeleteUser() throws Exception {
//6.执行操作
int res = userDao.deleteUser(52);
System.out.println(res);
}
改
IUserDao.java接口修改
int updateUser(User user);
IUserDao.xml映射文件修改
<update id="updateUser" parameterType="com.baz.domain.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},
address=#{address} where id=#{id}
</update>
查
根据id查询
在原先的项目基础上需要改动的文件包括:
接口:IUserDao.java
映射文件:IUserDao.xml
测试类
首先接口定义好查询方法,查询参数,返回值
User findById(Integer userId);
在映射文件中做如下修改
<select id="findById" resultType="com.baz.domain.User" parameterType="int">
select * from user where id=#{uid}
</select>
细节:
resultType属性:用于指定结果集的类型(返回值类型)
parameterType属性:用于指定传入参数的类型
sql语句中使用#{}字符:它代表占位符,相当于jdbc中的?,都是用于执行语句时替换实际的数据。具体的数据是由#{}里面的内容决定的。
#{}中的写法:由于数据类型是基本类型,所以此处可以随便写。
测试类修改:
@Test
public void testFindOne() {
//6.执行操作
User user = userDao.findById(41);
System.out.println(user);
}
查询所有
条件查询
IUserDao.java接口修改
List<User> findByName(String username);
IUserDao.xml映射文件修改
<select id="findByName" resultType="com.baz.domain.User" parameterType="String">
select * from user where username like #{username}
</select>
模糊查询
方式一:
测试类
//5.执行查询一个方法
List<User> users = userDao.findByName("%王%");
方式二:
<!-- 根据名称模糊查询 -->
<select id="findByName" parameterType="string" resultType="com.itheima.domain.User">
select * from user where username like '%${value}%'
</select>
我们在上面将原来的#{}占位符,改成了${value}。注意如果用模糊查询的这种写法,那么${value}
的写
法就是固定的,不能写成其它名字。
聚合函数
int findTotal();
<select id="findTotal" resultType="int">
select count(*) from user;
</select>
附:测试类
public class MybastisCRUDTest {
private InputStream in ;
private SqlSessionFactory factory;
private SqlSession session;
private IUserDao userDao;
@Test
public void testFindOne() {
//6.执行操作
……
}
@Before//在测试方法执行之前执行
public void init()throws Exception {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.创建 SqlSession 工厂对象
factory = builder.build(in);
//4.创建 SqlSession 对象
session = factory.openSession();
//5.创建 Dao 的代理对象
userDao = session.getMapper(IUserDao.class);
}
@After//在测试方法执行完成之后执行
public void destroy() throws Exception{
session.commit();
//7.释放资源
session.close();
in.close();
}
}