第3天学习打卡(Mybatis:CURD)

本文详细介绍了如何在MyBatis中实现CRUD操作,包括UserMapper接口的设计、mapper.xml中的SQL编写,以及如何在测试类中进行调用。特别关注了命名空间设置、事务提交和参数类型映射,适合初学者和进阶者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.CURD

namespace:

Mapper.xml中使用的namespace中分包名,要和Dao/Mapper接口中的包名一致。

过程:

完成MyBatis的实现后,操作数据库:

  1. 所有的操作只和“接口”和“配置文件”有关
  2. 实体类、工具类、mybatis.config.xml不在需要改变
  3. mapper.xml只需要去mybatis.config.xml中配置一次,mapper.xml中只需要有一个<mapper>

dao层:

UserMapper接口(从UserDao改名为UserMapper)

UserMapper配置文件(相当于实体类UserMapperImpl)

Mapper.xml元素概念

  • id: 就是对应的nsmespace中的方法名
  • resultType: Sql语句执行的返回值
  • parameterType: 参数类型

步骤:

3.1编写接口

在UserMapper中

public interface UserMapper {
    
    //根据id查询用户
    User getUserById(int id);

    //insert用户
    int insertUser(User user);

    //修改用户
    int updateUser(User user);

    //删除用户
    int deleteUserById(int id);

}

3.2编写对应的mapper.xml中的sql语句

在UserMapper.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">


<!--namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.kuang.dao.UserMapper">
    <!--根据id查询用户-->
    <select id="getUserById" parameterType="int" resultType="com.kuang.pojo.User">
        select * from `user` where `id`=#{id};
    </select>

    <!--Insert用户-->
    <insert id="insertUser" parameterType="com.kuang.pojo.User">
        insert into `user`(`name`,`pwd`) values ('zhaoliu','zhao123456');
    </insert>

    <!--修改用户-->
    <update id="updateUser" parameterType="com.kuang.pojo.User">
        update `user` set `name`=#{name},`pwd`=#{pwd} where id=#{id};
    </update>

    <!--根据id删除用户-->
    <delete id="deleteUserById" parameterType="int">
        delete from `user` where id=#{id};
    </delete>
</mapper>

3.3测试

在UserMapperTest中

public class UserMapperTest {

    //根据id查找用户
    @Test
    public void getUserById() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class); //相当于获得实现类对象
        User user = mapper.getUserById(1);

        System.out.println(user);

        sqlSession.close();

    }
    
    //插入用户
    @Test
    public void insertUser(){
        SqlSession sqlSession=MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        int i = mapper.insertUser(new User(0, "liu", "liu123"));
        if(i>0){
            System.out.println("插入成功");
        }

        //【关键】Mybatis中增删改查,需要提交事务才能生效
        sqlSession.commit();

        sqlSession.close();
    }

    //修改用户
    @Test
    public void updateUser(){
        SqlSession sqlSession=MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        int i = mapper.updateUser(new User(1, "liu", "liu123"));
        if(i>0){
            System.out.println("修改成功");
        }

        //【关键】Mybatis中增删改查,需要提交事务才能生效
        sqlSession.commit();

        sqlSession.close();
    }

    //删除用户
    @Test
    public void deleteUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        int i = mapper.deleteUserById(4);
        if(i>0){
            System.out.println("删除成功");
        }

        //【关键】Mybatis中增删改查,需要提交事务才能生效
        sqlSession.commit();

        sqlSession.close();
    }
}

在Mapper.xml中,对象中的属性,可以直接取出来,与实体类对应

Mybatis增删改必须提交事务才能生效

注意SqlSession对象使用完后关闭

3.4遇到的问题

  • Mapper.xml的curd标签不要匹配错

  • Mapper.xml需要到resource中的mybatis-config.xml中注册,路径要用‘/’,前面的命名空间使用的是包名 ‘.’

    <mappers>
        <mapper resource="com/kuang/dao/UserMapper.xml"/>
    </mappers>
    
  • 程序配置文件mybatis-config.xml必须符合规范

  • NullPointerException,没有注册到资源,MybatisUtils中提升作用域内外定义变量sqlSessionFactory

    public class MybatisUtils {
        private static SqlSessionFactory sqlSessionFactory;//提升作用域
    
        static {
            //使用Mybatis的第一步:获取SqlSessionFactory对象
            try {
                String resource = "mybatis-config.xml";
                InputStream inputStream =Resources.getResourceAsStream(resource);
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //有了SqlSessionFactory以后,我们可以从中获得SqlSession的实例
        //SqlSession提供了在数据库执行 SQL命令 所需的所有方法。
        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
    }
    
  • 输出的xml文件如果存在乱码,删除即可

  • maven资源导出问题,pom.xml中加<build>

3.5万能的Map

  1. Mapper.xml中参数类型如果为实体类,在测试时需要初始化所有字段,传递整个实体类对象;如果sql操作只需要少量字段,则不合适;
    实体类中的字段名和参数中字段名必须一致

在接口方法中,参数直接传递实体类User;

//insert用户
int insertUser(User user);

编写sql语句的时候,需要传递参数类型,参数类型为实体类"com.kuang.pojo.User"

<!--Insert用户-->
<!--使用实体类:test中传入的“对象中的属性”必须和“数据库表中字段名”对应-->
<insert id="insertUser" parameterType="com.kuang.pojo.User">
    insert into `user`(`name`,`pwd`) values (#{name},#{pwd});
</insert>

在使用方法的时候,需要创建实体类User对象,赋值所有属性

使用实体类:test中传入的“对象中的属性”必须和“数据库表中字段名”对应

//插入用户
@Test
public void insertUser(){
    SqlSession sqlSession=MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    int i = mapper.insertUser(new User(0, "田七1", "tian123456"));
    if(i>0){
        System.out.println("插入成功");
    }

    //【关键】Mybatis中增删改查,需要提交事务才能生效
    sqlSession.commit();

    sqlSession.close();
}
  1. 考虑用map作为参数map中的key值也可以自定义,只需要在测试类中定义相应的key值。

在接口方法中,参数直接传递Map;

//insert用户
int insertUser(User user);

编写sql语句的时候,需要传递参数类型,参数类型为Map

<!--Insert用户-->
<!--使用万能的Map:test中传入的“map的key值”可以自定义,无需和“数据库表中字段名”对应-->
<insert id="insertUser2" parameterType="map">
    insert into `user`(`name`,`pwd`) values (#{username},#{password});
</insert>

在使用方法的时候,需要创建实体类User对象,赋值所有属性

使用万能的Map:test中传入的“map的key值”可以自定义,无需和“数据库表中字段名”对应

//插入用户
@Test
public void insertUser2(){
    SqlSession sqlSession=MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    Map<String,Object> map=new HashMap<>();
    map.put("username","田七");
    map.put("password","tian123456");
    int i = mapper.insertUser2(map);
    if(i>0){
        System.out.println("插入成功");
    }

    //【关键】Mybatis中增删改查,需要提交事务才能生效
    sqlSession.commit();

    sqlSession.close();
}

传递参数类型:

  • 对象传递参数:直接在sql中取出对象的属性(实体类定义时属性和数据库表字段名一一对应)【parameterType=“Object”】
  • Map传递参数:直接在sql中取出key即可,map的key值无需和数据库表字段名一致,【parameterType=“map”】
  • 传递参数类型只有一个,且为基本类型,如int,可省略不写,直接在sql中取到。

多个参数用map,或者注解

返回结果类型:当为实体类对象时需要写,当为int时可省略。

3.6模糊查询

1.test中传递的字符串采用拼接,传递通配符%

容易造成sql注入,用户传入的值一般我们要求只能为值,不能拼接字符串

 List<User> userList = mapper.getUserLike("%李%");

2.在Mapper.xml的sql中拼接,使用通配符,推荐

select * from `user` where name like "%"#{name}"%"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值