使用Mybatis实现基本操作CRUD
1、基于上篇内容的扩展 还是使用上次的数据库 上次创建的user表
2、创建maven工程 并且导入相应的jar包的坐标
3、创建user类 并且将属性和数据库中的各个相应列名对应 并且提供它的setter和getter方法 以及toString方法
4、编写dao接口 在里面提供相应的抽象方法
5、编写IUserDao.xml配置文件 该文件放置resources目录下的相应文件夹下 文件夹与main/java中的文件夹相对应
6、编写主配置文件 里面配置数据库的相关信息 配置映射文件的相关信息
7、编写测试类 进行测试
本章所有的内容都是基于这个步骤 其中1 2 3 都是相同的不再做任何赘述
一、查询
(1)在dao接口中提供这样一个抽象方法
/*
* 根据id查询用户
* */
public User findById(Integer id);
(2)根据用户id实现查询的操作 在IUserDao.xml中添加如下配置
这里的parameterType表示的是参数的类型 这里是整数类型 所以可以写int java.lang.Integer等都行 另外resultType表示返回值类型 这里返回的是User类型
另外解释以下#{} 这个代表的是占位符 相当于原来的? 这里的数据类型是基本类型 所以{}里面的内容可以随便写
(3)主配置文件中还是基于上篇文章中的配置
(4)编写测试类
public void testFindById() throws Exception {
//1、读取配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建sqlsessionFatory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(inputStream);
//3、生产sqlsession对象
SqlSession session = sessionFactory.openSession();
//4、创建接口代理类对象
IUserDao mapper = session.getMapper(IUserDao.class);
System.out.println(mapper);
//5、调用方法
User user = mapper.findById(42);
System.out.println(user);
//6、关闭资源
inputStream.close();
session.close();
}
测试结果输出:
User{id=42, username='大王', birthday=Fri Mar 02 15:09:37 CST 2018, sex='女', address='上海'}
二、插入
新增一个用户
1、在dao接口类中添加一个新的方法
/*
* 添加新的用户
* */
public void saveUser(User user);
2、在映射文件中进行配置
<insert id="saveUser" parameterType="com.itheima.domain.User">
INSERT INTO user(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address});
</insert>
这里因为操作的是一个对象 所以这里我们使用ognl表达式 所以这里的占位符要写对象中的属性名 另外这里指明了参数的类型是User类型 所以我们不用写#{user.username}这种形式 只需要进行简写#{username}
3、进行测试
public void testSaveUser() throws Exception {
//1、读取配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建sqlsessionFatory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(inputStream);
//3、生产sqlsession对象
SqlSession session = sessionFactory.openSession();
//4、创建接口代理类对象
IUserDao mapper = session.getMapper(IUserDao.class);
System.out.println(mapper);
User user = new User();
user.setUsername("申公豹");
user.setSex("男");
user.setBirthday(new Date());
user.setAddress("封神榜");
//5、调用方法
mapper.saveUser(user);
//6、关闭资源
inputStream.close();
session.close();
}
测试完成之后:刷新数据库 发现没有 插入进去
看到控制台上有这句话 Setting autocommit to false on JDBC Connection 这是将自动提交事务改变成了手动提交事务 所以在进行增删改的操作的时候 我们必须进行手动提交事务
所以我们在测试类中资源释放之前加上session.commit()这句话就可以提交事务了
修改完后测试的结果:刷新数据库
三、更新用户
(1)在接口中加入相应得抽象方法
/*
* 更新用户
* */
public void updateUser(User user);
(2)添加映射配置文件
<insert id="updateUser" parameterType="com.itheima.domain.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} WHERE id=#{id}
</insert>
(3)添加测试方法
@Test
public void testUpdateUser() throws Exception {
//1、读取配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建sqlsessionFatory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(inputStream);
//3、生产sqlsession对象
SqlSession session = sessionFactory.openSession();
//4、创建接口代理类对象
IUserDao mapper = session.getMapper(IUserDao.class);
System.out.println(mapper);
User user = mapper.findById(42);
user.setAddress("大黑洞");
mapper.updateUser(user);
session.commit();
//6、关闭资源
inputStream.close();
session.close();
}
测试结果 刷新数据库
四、删除
(1)在接口中添加方法
/*
* 根据id删除用户
* */
public void deleteUser(Integer id);
(2)配置映射文件
<delete id="deleteUser" parameterType="int">
delete from user WHERE id=#{id};
</delete>
(3)测试
@Test
public void testDeleteUser() throws Exception {
//1、读取配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建sqlsessionFatory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(inputStream);
//3、生产sqlsession对象
SqlSession session = sessionFactory.openSession();
//4、创建接口代理类对象
IUserDao mapper = session.getMapper(IUserDao.class);
System.out.println(mapper);
mapper.deleteUser(42);
session.commit();
//6、关闭资源
inputStream.close();
session.close();
}
测试结果:数据库中没有那条数据了