本篇博客是根据B站up @遇见狂神说 的视频以及 Mybatis官网文档 整理的笔记,里面会有一些视频的代码和官网的概念,以及我个人的注释笔记,代码例子等。
还有很多总结内容,是我自己总结的,只是分享一些个人的看法,仅供参考
全篇博客包括代码均为自己手打,结果截图均为自己运行的结果。
以下是视频链接
https://www.bilibili.com/video/BV1NE411Q7Nx?p=21
Mybatis官网文档链接
https://mybatis.org/mybatis-3/zh/index.html
在之前的博客里面说明了如何搭建一个Mybatis的项目
Mybatis笔记 —— 运行环境的搭建与Mybatis框架的运行过程分析
这篇博客写一下具体的实现增删改查的代码
实体类User,工具类MybatisUtils,配置文件mybatis-config.xml都不需要修改。增加新的需求,只需要在UserMapper接口类里面增加新的抽象方法,然后在UserMapper.xml映射文件中编写响应的sql语句即可
要进行增删改查的表
增删改查CRUD:增加(Create)、检索(Retrieve)、更新(Update)、删除(Delete)
根据id查询用户
public interface UserDao {
//查询全部用户
List<User> getUserList();
//根据id查询用户
User getUserById(int id);
}
<!--UserDao接口方法里面定义了一个参数,这里select查询需要用到参数,参数通过#{}来接收-->
<select id="getUserById" parameterType="int" resultType="com.pojo.User">
select * from mybatis.user where id = #{id};
</select>
这里的 id 和接口类里面的抽象方法一致,parameterType是接口传入参数类型,resultType是接口返回数据类型。传入的参数是id,参数类型是 int 。传出的参数是User类对象,参数类型是User类。
测试方法
@Test
public void getUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
//向查询语句中传入参数 1,按照id=1来查询数据
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
查询id为1的数据,查询成功
增加一个用户
同样的,现在接口中增加一个抽象方法
public interface UserDao {
List<User> getUserList();
User getUserById(int id);
//insert 一个用户
int addUser(User user);
}
这里要注意的是,使用的是int,是因为结果集的不同,查询select语句与插入删除语句的返回的结果不同。插入删除如果成功就会返回一个数字1,因此用 int 来定义。而查询语句查询成功就会返回一个结果集
然后修改UserMapper.xml
<!--这里values后面获取参数时,可以自动从传入的参数user中提取对应属性的值-->
<insert id="addUser" parameterType="com.pojo.User">
insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd});
</insert>
最后是测试方法
注意,所有的增删改查语句都需要提交事务
@Test
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
int res = mapper.addUser(new User(4,"龙王","444444"));
if(res>0){
System.out.println("插入成功");
}
//提交事务
// !!所有的增删改查都需要提交事务,否则数据库不受影响
sqlSession.commit();
sqlSession.close();
}
修改一个用户
接口类
//修改一个用户
int updateUser(User user);
UserMapper.xml
<!-- 同样,只要 #{}里面的参数名与传入参数user里面的属性名对应相同,就可以直接获取值-->
<update id="updateUser" parameterType="com.pojo.User">
update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id};
</update>
测试方法
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
int res = mapper.updateUser(new User(4, "东海龙王", "123123"));
System.out.println(res);
sqlSession.commit();
sqlSession.close();
}
删除一个用户
//删除一个用户
int deleteUser(int id);
UserMapper.xml
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id};
</delete>
测试方法
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
int i = mapper.deleteUser(4);
System.out.println(i);
sqlSession.commit();
sqlSession.close();
}
通过Map修改上面的传参方式
上面在UserMapper.xml里面编写 insert等标签的时候,传入的参数都是一个实体类对象user。这样是将user里面的全部属性变量都传入了,如果只需要部分变量的话,可以使用map
修改接口类,新增一个添加用户的方法,传入的参数是一个map,此时map里面还没有值
public interface UserDao {
//万能的Map
int addUser2(Map<String,Object> map);
}
修改UserMapper.xml文件
这里的sql语句中只写了两个字段,也只接收了map传过来的两个属性值
<!--使用map对象的值来作为参数传递-->
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id,pwd) values (#{userid},#{password});
</insert>
测试方法
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("userid",5);
map.put("username","西海龙王");
map.put("password","555555");
int i = mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
因为UserMapper.xml中并没有接收username的值,所以这里的name是null