Mybatis从小白到小黑(二)Mybatis增删改查,这一篇足以

微信搜索《Java鱼仔》,每天一个技术难点不错过

在前面一章中我们对mybatis的基本环境进行了配置,并实现了最简单的select语句查询,在这一章中,我将对Mybatis实现更多复杂查询以及优化进行讲解。

(一)xml结构分析

通过下面这个例子先对mapper.xml结构进行讲解

<mapper namespace="com.javayz.mapper.UserMapper">
    <select id="getUserById" resultType="com.javayz.pojo.User" parameterType="int">
        select * from user where id=#{id};
    </select>
</mapper>

namespace:在XXXmapper.xml中,我们首先需要通过namespace定位接口,这里要填的是这个xml所对应的接口全限定名。

id:id对应于namespace接口下的方法名

resultType:resultType对应于返回值类型,这里返回的是User,就需要写上User的全限定名。

parameterType:参数类型,这里我们通过id查询,所以参数填写的是int
另外还有一个面试题中会出现的问题,#{}和${}有什么区别:

1、#{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值;

2、${ }是字符串替换, MyBatis在处理${ }时,它会将sql中的${ }替换为变量的值。

更多关于xml映射的内容可以参考官方中文文档对这部分的解释,十分详细。
https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

(二)Mybatis基本增删改查

Mybatis实现增删改查很简单,在前面一篇博客中已经把mybatis的环境搭建完成,这里就直接进行增删改查:

首先在UserMapper下新建四个接口实现增删改查:

public interface UserMapper {
    //根据id查询用户
    User getUserById(int id);
    //插入一个用户
    int insertUser(User user);
    //更新用户名
    int updateUser(User user);
    //删除该用户
    int deleteUser(int id);
}

在对应的UserMapper.xml中编写sql

<mapper namespace="com.javayz.mapper.UserMapper">
    <select id="getUserById" resultType="com.javayz.pojo.User" parameterType="int">
        select * from user where id=#{id};
    </select>
    <insert id="insertUser" parameterType="com.javayz.pojo.User">
        insert into user(id,name) values(#{id},#{name});
    </insert>
    <update id="updateUser" parameterType="com.javayz.pojo.User">
        update user set name = #{name} where id = #{id};
    </update>
    <delete id="deleteUser" parameterType="int">
        delete from user where id = #{id};
    </delete>
</mapper>

最后编写测试类

@Test
public void testAll(){
    //获取SqlSession
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    //执行Sql
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
    //测试查询
    User user=mapper.getUserById(1);
    System.out.println(user);
    //测试新增
    User user2=new User(3,"javayz2");
    mapper.insertUser(user2);
    //注意增删改之后需要调用commit方法
    sqlSession.commit();
    System.out.println(mapper.getUserById(3));

    //测试修改
    User user3 =new User(3,"javayz3");
    mapper.updateUser(user3);
    sqlSession.commit();
    System.out.println(mapper.getUserById(3));

    //测试删除
    mapper.deleteUser(3);
    sqlSession.commit();
    System.out.println(mapper.getUserById(3));
}

最后结果如下:

在这里插入图片描述

需要注意的是,在增删改之后,需要执行sqlSession.commit();提交事务。

(三)使用Map传入更多参数

在前面基本增删改查中,我们传入的parameterType都是一种类型,比如int,或者是User,但是更多时候我们传入sql中的参数不会这样简单,所以Map很完美的解决了这个问题。

新建一个传入map新建用户的接口方法:

//使用map插入一个用户
int insertUserByMap(Map<String,Object> map);

在对应的xml中编写sql语句,注意将parameterType替换为map

<insert id="insertUserByMap" parameterType="map">
    insert into user(id,name) values(#{id},#{name});
</insert>

这里传入的值就是map里定义的键值对,map传递数据,只需要取出对应的key就可以了,测试一下:

@Test
public void testInsertByMap(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map<String,Object> map=new HashMap<String, Object>();
    map.put("id",4);
    map.put("name","javayz4");
    mapper.insertUserByMap(map);
    sqlSession.commit();
}

(四)基于注解的开发实现

基于注解的开发可以让代码逻辑变得很简单,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪,因此如何选择,需要考虑业务场景:

4.1 配置文件中引入接口类

<mappers>
    <mapper class="com.javayz.mapper.UserMapper"/>
</mappers>

4.2 使用注解实现sql语句

public interface UserMapper {
    //根据id查询用户
    @Select("select * from user where id=#{id}")
    User getUserById(int id);
}

4.3 测试

@Test
public void testSelect(){
    //获取SqlSession
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    //执行Sql
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user=mapper.getUserById(4);
    System.out.println(user);
    sqlSession.close();
}

增删改查示例:

//根据id查询用户
@Select("select * from user where id=#{id}")
User getUserById(int id);
//新增用户
@Insert("insert into user values(#{id},#{name})")
int insertUser(@Param("id")int id,@Param("name")String name);
//更新数据
@Update("update user set name='java6' where id=#{id}")
int updateUserById(int id);
//删除数据
@Delete("delete from user where id=#{id}")
int deleteUserById(int id);

在新增用户中,我们这里使用到了@Param注解:当有两个或两个以上参数的时候,必须要加上@Param注解

(五)总结

到这里为止,你已经可以用Mybatis进行增删改查,如果只是做业务,这些就足够了,但是我们怎么只能满足于此,下面开始对Mybatis进行更深入的讲解。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页