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进行更深入的讲解。