• MyBatis下的CRUD


    CRUD

            Create(增加)、Retrieve(检索)、Update(更新)、Delete(删除)

    select

            1.编写接口(在dao/mapper.java接口文件下)

    1. //根据id查询用户
    2. User getUserById(int id);

            2.编写接口对应的mapper中的语句(在dao/mapper.xml文件下)

    1. <select id="getUserById" parameterType="int" resultType="com.yuan.pojo.User">
    2. select * from mybatis.user where id = #{id}
    3. select>

            3.测试

    1. @Test
    2. public void getUserById(){
    3. SqlSession sqlSession = MybatisUtils.getSqlSession();
    4. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    5. User user = mapper.getUserById(1);
    6. System.out.println(user);
    7. sqlSession.close();
    8. }

    Select 元素的属性

    属性描述
    id在命名空间中唯一的标识符,可以被用来引用这条语句。
    parameterType将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。
    resultType期望从这条语句中返回结果的类全限定名或别名。 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。
    resultMap对外部 resultMap 的命名引用。结果映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂的映射问题都能迎刃而解。 resultType 和 resultMap 之间只能同时使用一个。
    flushCache将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false。
    useCache将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。
    timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
    fetchSize这是一个给驱动的建议值,尝试让驱动程序每次批量返回的结果行数等于这个设置值。 默认值为未设置(unset)(依赖驱动)。
    statementType可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
    resultSetTypeFORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖数据库驱动)。
    databaseId如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。
    resultOrdered这个设置仅针对嵌套结果 select 语句:如果为 true,则假设结果集以正确顺序(排序后)执行映射,当返回新的主结果行时,将不再发生对以前结果行的引用。 这样可以减少内存消耗。默认值:false
    resultSets这个设置仅适用于多结果集的情况。它将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔。

    insert

            1.编写接口(在dao/mapper.java接口文件下)

    1. //插入一个用户
    2. int addUser(User user);

            2.编写接口对应的mapper中的语句(在dao/mapper.xml文件下)

    1. <insert id="addUser" parameterType="com.yuan.pojo.User">
    2. insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd});
    3. insert>

            3.测试

    1. @Test
    2. public void addUser(){
    3. SqlSession sqlSession = MybatisUtils.getSqlSession();
    4. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    5. int num = userMapper.addUser(new User(4,"牛六","123321"));
    6. if (num > 0) {
    7. System.out.println("插入成功");
    8. }
    9. sqlSession.commit();
    10. sqlSession.close();
    11. }

    update

            1.编写接口(在dao/mapper.java接口文件下)

    1. //修改一个用户
    2. int updateUser(User user);

            2.编写接口对应的mapper中的语句(在dao/mapper.xml文件下)

    1. <update id="updateUser" parameterType="com.yuan.pojo.User">
    2. update mybatis.user
    3. set name = #{name} , pwd = #{pwd}
    4. where id = #{id};
    5. update>

            3.测试

    1. @Test
    2. public void updateUser(){
    3. SqlSession sqlSession = MybatisUtils.getSqlSession();
    4. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    5. int num = mapper.updateUser(new User(4,"小明","123123"));
    6. if (num > 0){
    7. System.out.println("修改成功");
    8. }
    9. sqlSession.commit();
    10. sqlSession.close();
    11. }

    delete

            1.编写接口(在dao/mapper.java接口文件下)

    1. //删除一个用户
    2. int deleteUser(int id);

            2.编写接口对应的mapper中的语句(在dao/mapper.xml文件下)

    1. <delete id="deleteUser" parameterType="int">
    2. delete from mybatis.user
    3. where id = #{id};
    4. delete>

            3.测试

    1. @Test
    2. public void deleteUser(){
    3. SqlSession sqlSession = MybatisUtils.getSqlSession();
    4. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    5. int num = mapper.deleteUser(4);
    6. if (num > 0){
    7. System.out.println("删除成功");
    8. }
    9. sqlSession.commit();
    10. sqlSession.close();
    11. }

    在编写中遇到的错误:

            在mybatis中出现java.lang.IllegalArgumentException: Parameter Maps collection does not contain value for com.yuan.dao.UserMapper.int 报错,是因为parameterMap属性而这个属性已经早废弃了且应该使用parameterType

    小结

            1.在mapper.xml文件中namespace中的包名要和dao/mapper接口的包名一致

            2.id :就是对应的namespace中的方法;resultType:sql语句执行的返回值;parameterType:参数类型

            3.增删改需要提交事务才会生效(即sqlSession.commit();)

     

    易出现错误

    • 标签不要匹配错
    • resource绑定mapper,需要使用路径
    • 程序配置文件必须符合规范
    • NullPointerException,没有注册到资源
    • 输出的xml文件中存在中文乱码问题
    • maven资源没有导出问题

  • 相关阅读:
    JVM 垃圾回收器分类
    导入sklearn报错:No module named ‘threadpoolctl‘
    WF100DPZ 1BG S6 DT数字压力传感器
    SpringBoot基础(一)-- 使用idea(2022版)创建一个Springboot项目(联网开发)
    GIT 常用指令
    CentOS7.9.2009离线安装yum命令
    SpringMVC中文件的上传与下载
    Python 合并两张图片
    计算机网络 | 02.[HTTP篇] 请求方式
    华为OD机试 - 根据某条件聚类最少交换次数 - 滑动窗口(Java 2023 B卷 100分)
  • 原文地址:https://blog.csdn.net/weixin_48426115/article/details/126480124