02.CRUD 初体验
1.MyBatisUtil 工具类
java
package org.hong.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// SqlSession 提供了在数据库执行 SQL 命令所需的所有方法
public static SqlSession getSqlSession(){
// openSession(): 此方式打开SQL会话, 事务是开启状态
// openSession(true): 此方式打开SQL会话, 事务是关闭状态
return sqlSessionFactory.openSession();
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
2.save
接口方法
java
// 保存
int save(User user);
方法映射
xml
<!--
inserte: 配置insert语句
id: 对应的方法名
parameterType: 指定参数类型为pojo, 可以直接写属性名获得属性值, 优先调用getting方法, 如果没有getting方法则直接从属性中取值
-->
<insert id="save" parameterType="org.hong.pojo.User">
insert into user(name, pwd) values(#{name}, #{pwd})
</insert>
测试用例
java
@Test
public void save(){
// 1.获取sqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 2.获取需要的mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.调用对应的方法执行操作
User user = new User();
user.setName("SAVE");
user.setPwd("123");
int save = mapper.save(user);
System.out.println(save);
System.out.println(user);
// 4.提交事务
sqlSession.commit();
// 5.关闭sqlSession
sqlSession.close();
}
控制台打印
shell
## 发送的sql语句
[main] [org.hong.mapper.UserMapper.save]-[DEBUG] ==> Preparing: insert into user(name, pwd) values(?, ?)
## 预编译放入的参数值, 从传入的pojo对象中取出对应的属性值
[main] [org.hong.mapper.UserMapper.save]-[DEBUG] ==> Parameters: SAVE(String), 123(String)
## 影响行数
[main] [org.hong.mapper.UserMapper.save]-[DEBUG] <== Updates: 1
## 编写的save方法返回的值int类型, 意义是数据库影响行数
1
## 插入后的对象打印, id值并没有回填到对象中, 因为我们没有开启这个功能, 后面会说到
User(id=null, name=SAVE, pwd=123)
3.get
接口方法
java
// 根据id查询
User get(int id);
方法映射
xml
<!-- 方法参数是int类型的, 所以没有写parameterType属性 -->
<select id="get" resultType="org.hong.pojo.User">
<!-- 插入id值 -->
select * from user where id = #{id}
</select>
测试用例
java
@Test
public void get(){
// 1.获取sqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 2.获取需要的mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.调用对应的方法执行操作
User user = mapper.get(1);
System.out.println(user);
// 4.提交事务
sqlSession.commit();
// 5.关闭sqlSession
sqlSession.close();
}
控制台打印
shell
[main] [org.hong.mapper.UserMapper.get]-[DEBUG] ==> Preparing: select * from user where id = ?
[main] [org.hong.mapper.UserMapper.get]-[DEBUG] ==> Parameters: 1(Integer)
[main] [org.hong.mapper.UserMapper.get]-[DEBUG] <== Total: 1
User(id=1, name=hong, pwd=123456)
4.update
接口方法
java
// 修改
int update(User user);
方法映射
xml
<update id="update" parameterType="org.hong.pojo.User">
update user set name = #{name}, pwd = #{pwd} where id = #{id}
</update>
测试用例
java
@Test
public void update(){
// 1.获取sqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 2.获取需要的mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.调用对应的方法执行操作
User user = mapper.get(1);
user.setName("谢禹宏");
int update = mapper.update(user);
System.out.println(user);
// 4.提交事务
sqlSession.commit();
// 5.关闭sqlSession
sqlSession.close();
}
控制台打印
shell
## 查询sql
[main] [org.hong.mapper.UserMapper.get]-[DEBUG] ==> Preparing: select * from user where id = ?
[main] [org.hong.mapper.UserMapper.get]-[DEBUG] ==> Parameters: 1(Integer)
[main] [org.hong.mapper.UserMapper.get]-[DEBUG] <== Total: 1
## 修改sql
[main] [org.hong.mapper.UserMapper.update]-[DEBUG] ==> Preparing: update user set name = ?, pwd = ? where id = ?
[main] [org.hong.mapper.UserMapper.update]-[DEBUG] ==> Parameters: 谢禹宏(String), 123456(String), 1(Integer)
[main] [org.hong.mapper.UserMapper.update]-[DEBUG] <== Updates: 1
User(id=1, name=谢禹宏, pwd=123456)
5.delete
接口方法
java
// 删除
boolean delete(int id);
方法映射
xml
<delete id="delete">
delete from user where id = #{id}
</delete>
测试用例
java
@Test
public void delete(){
// 1.获取sqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 2.获取需要的mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.调用对应的方法执行操作
boolean delete = mapper.delete(10);
System.out.println(delete);
// 4.提交事务
sqlSession.commit();
// 5.关闭sqlSession
sqlSession.close();
}
控制台打印
shell
[main] [org.hong.mapper.UserMapper.delete]-[DEBUG] ==> Preparing: delete from user where id = ?
[main] [org.hong.mapper.UserMapper.delete]-[DEBUG] ==> Parameters: 10(Integer)
[main] [org.hong.mapper.UserMapper.delete]-[DEBUG] <== Updates: 0
## 因为我们删除一个不存在的数据, 影响行数为0, 所以MyBatis返回false
false
6.最终版
6.1 Mapper 接口
java
package org.hong.mapper;
import org.hong.pojo.User;
public interface UserMapper {
// 保存
int save(User user);
// 根据id查询
User get(int id);
// 修改
int update(User user);
// 删除
boolean delete(int id);
}
6.2 Mapper.xml
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="org.hong.mapper.UserMapper">
<!--
inserte: 配置insert语句
id: 对应的方法名
parameterType: 指定参数类型为pojo, 可以直接写属性名获得属性值, 优先调用getting方法, 如果没有getting方法则直接从属性中取值
-->
<insert id="save" parameterType="org.hong.pojo.User">
insert into user(name, pwd) values(#{name}, #{pwd})
</insert>
<!-- 方法参数是int类型的, 所以没有写parameterType属性 -->
<select id="get" resultType="org.hong.pojo.User">
<!-- 插入id值 -->
select * from user where id = #{id}
</select>
<update id="update" parameterType="org.hong.pojo.User">
update user set name = #{name}, pwd = #{pwd} where id = #{id}
</update>
<delete id="delete">
delete from user where id = #{id}
</delete>
</mapper>
6.3 测试用例
java
package org.hong.test;
import org.apache.ibatis.session.SqlSession;
import org.hong.mapper.UserMapper;
import org.hong.pojo.User;
import org.hong.util.MyBatisUtil;
import org.junit.Test;
public class CRUDTest {
@Test
public void save(){
// 1.获取sqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 2.获取需要的mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.调用对应的方法执行操作
User user = new User();
user.setName("SAVE ID");
user.setPwd("123");
int save = mapper.save(user);
System.out.println(save);
System.out.println(user);
// 4.提交事务
sqlSession.commit();
// 5.关闭sqlSession
sqlSession.close();
}
@Test
public void get(){
// 1.获取sqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 2.获取需要的mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.调用对应的方法执行操作
User user = mapper.get(1);
System.out.println(user);
// 4.提交事务
sqlSession.commit();
// 5.关闭sqlSession
sqlSession.close();
}
@Test
public void update(){
// 1.获取sqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 2.获取需要的mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.调用对应的方法执行操作
User user = mapper.get(1);
user.setName("谢禹宏");
int update = mapper.update(user);
System.out.println(user);
// 4.提交事务
sqlSession.commit();
// 5.关闭sqlSession
sqlSession.close();
}
@Test
public void delete(){
// 1.获取sqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 2.获取需要的mapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.调用对应的方法执行操作
boolean delete = mapper.delete(10);
System.out.println(delete);
// 4.提交事务
sqlSession.commit();
// 5.关闭sqlSession
sqlSession.close();
}
}