mybatis实现CRUD★★★

声明

本文为其他博主文章总结,仅用作个人学习,特此声明

参考文章链接

(3条消息) 狂神说 | Mybatis完整版笔记_小七rrrrr的博客-CSDN博客_狂神说mybatis笔记

CRUD(增删改查)

1. 几个注意点

1.namespace中的包名要和Dao/mapper接口的包名一致,示例如下

2.语句参数:

  • id:就是对应namespace中的方法名

  • resultType:sql语句执行的返回值

  • prameterType:参数类型


2. 具体步骤

  1. 编写接口

    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);
    }
    

  1. 编写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>
    

  1. 编写测试代码

    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拼接中使用通配符

image-20220606215842244
//模糊查询
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();
}

posted @   无关风月7707  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示