欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis系列(二)Mybatis增删改查,这一篇足以

程序员文章站 2022-05-13 14:59:38
...

微信搜索《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));
}

最后结果如下:

Mybatis系列(二)Mybatis增删改查,这一篇足以

需要注意的是,在增删改之后,需要执行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进行更深入的讲解。