mybatis实现CRUD★★★
声明
本文为其他博主文章总结,仅用作个人学习,特此声明
参考文章链接
(3条消息) 狂神说 | Mybatis完整版笔记_小七rrrrr的博客-CSDN博客_狂神说mybatis笔记
CRUD(增删改查)
1. 几个注意点
1.namespace中的包名要和Dao/mapper接口的包名一致,示例如下
2.语句参数:
-
id:就是对应namespace中的方法名
-
resultType:sql语句执行的返回值
-
prameterType:参数类型
2. 具体步骤
-
编写接口
package com.xy.dao; import com.xy.pojo.User; import java.util.List; public interface UserMapper { //可以避免JDBC代码和手动设置参数 //获取全部用户 List<User> getUserList(); //根据ID查询用户 User getUserById(int id); //insert用户 int addUser(User user); //修改用户 int updateUser(User user); //删除一个用户 int deleteUser(int id); }
-
编写mapper对应的sql语句
<?xml version="1.0" encoding="GBK" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--namespace=绑定一个对应的Dao/Mapper接口--> <mapper namespace="com.xy.dao.UserMapper"> <!--select查询语句--> <!--id相当于重写方法的名字,这里是重写方法,当实现一个接口的时候以前是需要重写方法的--> <!--resultType是返回类型--> <select id="getUserList" resultType="com.xy.pojo.User"> select * from mybatis.users </select> <select id = "getUserById" resultType="com.xy.pojo.User"> select * from mybatis.users where id = #{id} </select> <!--对象中的属性可以直接取出来--> <insert id="addUser" parameterType="com.xy.pojo.User" > insert into mybatis.users (id,name,pwd) values (#{id},#{name},#{pwd}) </insert> <update id="updateUser" parameterType="com.xy.pojo.User"> update mybatis.users set name = #{name}, pwd = #{pwd} where id = #{id} </update> <delete id="deleteUser" parameterType="com.xy.pojo.User"> delete from mybatis.users where id = #{id} </delete> </mapper>
-
编写测试代码
package com.xy.dao; import com.xy.pojo.User; import com.xy.utils.MyBatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class UserDaoTest { @Test public void getUserList(){ //第一步获取SqlSession对象 SqlSession sqlSession = MyBatisUtils.getSqlSession(); //方式一:执行sql getMapper UserMapper userDao = sqlSession.getMapper(UserMapper.class);//这里是反射,实现了一个接口,并且创建了实现类的实例 List<User> userList = userDao.getUserList(); for (User user : userList){ System.out.println(user); } sqlSession.close(); } @Test public void getUserById(){ SqlSession sqlSession1 = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession1.getMapper(UserMapper.class); User userById = mapper.getUserById(1); System.out.println(userById); sqlSession1.close(); } @Test //增删改需要提交事务 public void addUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); int res =userMapper.addUser(new User(4,"za","123456")); if (res > 0){ System.out.println("插入成功"); } //提交事务 sqlSession.commit(); sqlSession.close(); } @Test public void updateUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.updateUser(new User(1,"xyy","123456789")); sqlSession.commit(); sqlSession.close(); } @Test public void deleteUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.deleteUser(4); sqlSession.commit(); sqlSession.close(); } }
3. 程序测试
需要注意的是增删改需要提交事务
-
查询全部成员
-
单个查询
-
插入新数据
-
更新数据
-
删除数据
4. 常见错误分析(我反正没遇到)
- 标签要一一对应
- resources绑定mapper,需要使用路径
- 程序配置文件必须符合规范
- NullPointerException,没有注册到资源
- 输出的xml中有乱码,需要修改UTF-8
- maven资源没有导出
5. 万能的 map
使用Map传递参数:方便,灵活
假设我们的实体类,或者数据库中的表,字段或者参数过多,我们应该考虑使用map!
举个例子:addUser2方法
int addUser2(Map<String,Object> map);
<insert id="addUser2" parameterType="map">
insert into mybatis.users (id,name,pwd) values (#{userid},#{username},#{password});
</insert>
@Test
public void addUser2(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("userid",5);
map.put("username","hh");
map.put("password","123456");
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
测试结果如下图:
再举个例子:查询map代码块
User getUserById2(Map<String,Object> map);
<select id="getUserById2" resultType="com.xy.pojo.User">
select * from mybatis.users where id = #{id}
</select>
@Test
public void getUserById2(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("id",5);
User userById2 = mapper.getUserById2(map);
System.out.println(userById2);
sqlSession.commit();
sqlSession.close();
}
Map传递参数,直接在sql中取出key即可! parameterType=“map”
对象传递参数,直接在sql中取对象的属性即可 parameterType=“Object”
只有一个参数的情况下,可以直接在sql中取到
多个参数用map或者注解
6. 怎么写模糊查询?
java代码执行的时候,传递通配符:%
为了避免sql注入(例如用户输入 id=1 or 1=1),所以在sql拼接中使用通配符
//模糊查询
List<User> getUserLike(String value);
<select id="getUserLike" resultType="com.xy.pojo.User">
select * from mybatis.users where name like #{value}"%"
</select>
@Test
public void getUserLike(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userLike = mapper.getUserLike("xyz");
for (User user : userLike){
System.out.println(user);
}
sqlSession.close();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix