Mybatis 框架学习(二)—— 简单CRUD的实现

Mybatis 框架学习(二)—— 简单CRUD的实现

一、Mybatis CRUD


以上面建立的user表为例,我们来实现使用mybatis操作数据库的增删改查操作

通过这个CRUD的操作,我们能很明确的感觉到mybatis操作数据库比 JDBC操作数据库的简洁明了


1.接口中定义方法

在上面的查询功能完成之后,在UserMapper 接口中定义增删改的方法

package com.bit.mapper;

import com.bit.pojo.User;

import java.util.List;

public interface UserMapper {
    // 查询所有用户
    List<User> getUserList();

    // 查询一个指定id的用户
    User getUserbyId(int id);

    // 增加一个用户
    int insertUser(User user);

    // 根据id删除一个用户
    int deleteUser(int id);

    //修改一个用户的所有信息
    int UpdateUser(User user);
}

2.xml 实现方法


在UserMapper定义了方法之后,就需要在 UserMappper.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="com.bit.mapper.UserMapper">


<!--    -->
    <select id="getUserList" resultType="com.bit.pojo.User">
        select * from mybatis.user
    </select>

<!--  对应UserMapper接口中的getUserById方法,返回类型是 user全限定名,参数类型parameterType为 int-->
    <select id="getUserbyId" resultType="com.bit.pojo.User" parameterType="int">
        select * from user where id=#{id}
    </select>

<!-- 对应UserMapper接口中的insertUser方法,参数类型是parameterType为 User全限定名   -->
    <insert id="insertUser" parameterType="com.bit.pojo.User">
        insert into user values(#{id},#{name},#{pwd})
    </insert>

<!--对应UserMapper接口中的deleteUser方法,参数parameterType设置成int    -->
    <delete id="deleteUser" parameterType="int" >
        delete from user where id =#{id}
    </delete>


<!--    对应UserMapper接口中的 UpdateUser方法,参数parameterType使用全限定名-->
    <update id="UpdateUser" parameterType="com.bit.pojo.User">
        update user set name=#{name},pwd=#{pwd} where id=#{id}
    </update>
</mapper>

3.#{} 的使用


#{} ,{}里面对应的是我们传入的参数,所以写到里面的时候要和形参保持一致,顺序一致,名字一致。


接口定义方法,xml文件实现方法。


4.测试接口


我们都写完之后,在上一个过程中我们已经把mapper.xml注册到 mybatis-config.xml 核心配置文件中了,所以可以直接测试各个接口的功能是否正常

测试的过程很重要,因为我们刚开始学,会犯各种低级的错误,sql编写错误,接口写错了,返回类型写错了,参数类型写错了等等等,所以没写完一个接口之后,一定要到Test目录下,进行test测试

测试过程说一下

安装junit依赖,在test目录下建立一样的文件结构,然后建一个类,在这个类中编写测试方法,加上@Test注解,然后就可以运行了。

package com.bit.mapper;

import com.bit.pojo.User;
import com.bit.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.*;
import java.util.List;

public class UserMapperTest {

    @Test
    public void selectAll(){

        SqlSession sqlSession = MybatisUtil.getSqlSession();
  
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        
        List<User> user = userMapper.getUserList();
        for (User user1:user) {
            System.out.println(user1);
        }
        // 记得关闭 资源
        sqlSession.close();
    }

    @Test
    public void getUserbyId(){
    
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        
        User user = userMapper.getUserbyId(1);
        
        System.out.println(user);
        sqlSession.close();
    }

    @Test
    public void insertUser(){
        SqlSession sqlSession =  MybatisUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        userMapper.insertUser(new User(0,"唐三藏","1111"));

        // 增删改都要手动提交事务,JDBC是默认自动提交实务的,或者在创建sqlSession设置参数为true就可以自动提交事务了
//        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void deleteUser(){
        SqlSession sqlSession =MybatisUtil.getSqlSession();
        UserMapper userMapper  = sqlSession.getMapper(UserMapper.class);
        userMapper.deleteUser(1);
        sqlSession.close();
    }

    @Test
    public void updateUser(){
        // 先拿到sqlSession对象
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        userMapper.UpdateUser(new User(2,"java","0000000"));

        sqlSession.close();
    }


}


5.提交事务


1.sqlSession.commit()


还有一点非常重要,增删改都需要提交事务才能正常的在数据库中执行命令,mybatis建立sqlSession时默认没有开启自动提交事务,所以我们可以手动的提交事务

在执行了UserMapper接口的方法之后,调用SqlSession.commit() 提交事务

sqlSession.commit()

提交完事务之后记得关闭 sqlSession 资源


2.在建立sqlSession的时候写入参数true,开启自动提交事务

SqlSession sqlSession = SqlSessionFactory.openSession(true);

二、万能Map


在上面的CRUD中传参,还有另外一种方式,用map传参

map传参,我们不需要按照传入对象的属性名字 实现方法了

  <insert id="insertUser" parameterType="com.bit.pojo.User">
        insert into user values(#{id},#{name},#{pwd})
    </insert>

这里传入的是user类型的参数,所以具体的参数只能和User对象中的属性对应,名字得一致

但是使用map就无所谓了,我们可以自定义参数的名字

还是拿insert举例子,我们用map进行传参


1.接口中的 insert2 传入 map参数


 int insertUser2(Map<String,Object> map);

2.在测试方法里面自定义map的键值对

    @Test
    public void insertUser2(){
        SqlSession sqlSession =  MybatisUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        Map<String ,Object> map = new HashMap<String, Object>();
        map.put("userid",0);
        map.put("username","孙悟空");
        map.put("password",27451314);

        userMapper.insertUser2(map);
        sqlSession.close();

    }

给这个map 传入 键值对,键可以自定义名称,值也是填入对应的值

然后将map传入到 方法里


3.xml 配置方法参数


xml对应的标签里面,根据传入的map,参数填map的键名称(自定义的),最后就相当于传入的是 对应的值。

这就和user对象的属性名字不一样了,可以自定义参数的名字

   <insert id="insertUser2" parameterType="map">
        insert into user values(#{userid},#{username},#{password})
    </insert>

4.执行测试方法


执行test方法,查看操作数据库是否成功。

map在工作当中还是很常用的,所以要好好掌握。


5.传参总结


如果对象传递参数,那么sql 取的是 对象的属性

如果map传递参数,那么sql取的是 map的key


三、Mybatis 模糊查询


1.Java代码在传参的时候就把 通配符 % 给传递进去

  List<Student> list = studentMappper.getStudentLike("%陈%");

2.在xml文件中的sql语句中拼接通配符

  List<Student> list = studentMappper.getStudentLike("陈");
  
  <select id="getStudentLike" resultType="pojo.Student">
        select * from student where name like "%"#{value}"%"
    </select>                                                     
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RAIN 7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值