JavaWeb进阶之路:MyBatis-CURD(增删改查)

1. 回顾

上篇文章 JavaWeb进阶之路:MyBatis初体验 带大家对 Mybatis 进行了简单的上手,接下来的这篇文章会带着大家继续学习 Mybatis 常用的功能!

2. XML映射器

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。

XML映射器就是我们写 sql 语句的xml文件,一般命名为 xxxMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xxx.xxx.xxx.mapper.xxxMapper"><cache></cache><cache-ref></cache-ref><resultMap></resultMap><parameterMap></parameterMap><sql></sql><insert></insert><update></update><delete></delete><select></select>
</mapper>

SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):

元素 介绍
cache 该命名空间的缓存配置。
cache-ref 引用其它命名空间的缓存配置。
resultMap 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
parameterMap 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。
sql 可被其它语句引用的可重用语句块。
insert 映射插入语句。
update 映射更新语句。
delete 映射删除语句。
select 映射查询语句。

3. SELECT(查询)

select 标签是 MyBatis 中最常用元素之一。

一个简单查询的 select 元素是非常简单的,如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lmx.demo.mapper.UserMapper"><select id="selectUserById" parameterType="int" resultType="com.lmx.demo.pojo.User">select * from user where id = #{id};</select>
</mapper>

对应的 UserMapper.java 文件:

pulic interface UserMapper {User selectUserById(int id);
}

测试类:

public class UserMapperTest {@Testpublic void selectUserById() {SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 查询ID为3的用户User user = userMapper.selectUserById(3);System.out.println(user);sqlSession.close();}}

运行结果:

这个语句名为 selectUserById , 它可以接受一个 int 类型的参数, 并返回一个 User 类型的对象。

语句中的 #{id} 相当于 JDBC 中预处理语句(PreparedStatement)中的 ? 占位参数。

select 标签中有很多属性可以详细的配置每一条 SQL 语句:

  • id - 在命名空间中唯一的标识符,可以被用来引用这条语句。 对应的是命名空间所映射的对象里的方法名。
  • parameterType - 传入 SQL 语句的参数的类全限定名或别名。这个属性是可选的,Mybatis 会自动判断出具体传入语句的参数,默认值为未设置(unset)。
  • parameterMap - 用于引用外部 parameterMap 的属性,目前已被废弃。请使用行内参数映射和 parameterType 属性。
  • resultType - 查询结果返回的类全限定名或别名。注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。
  • resultMap - 对外部 resultMap 的命名引用。结果映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂的映射问题都能迎刃而解。 resultType 和 resultMap 之间只能同时使用一个。
  • flushCache - 将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false。
  • useCache - 将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。
  • timeout - 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
  • fetchSize - 这是一个给驱动的建议值,尝试让驱动程序每次批量返回的结果行数等于这个设置值。 默认值为未设置(unset)(依赖驱动)。
  • statementType - 可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
  • resultSetType - FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖数据库驱动)。
  • databaseId - 如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。
  • resultOrdered - 这个设置仅针对嵌套结果 select 语句:如果为 true,将会假设包含了嵌套结果集或是分组,当返回一个主结果行时,就不会产生对前面结果集的引用。 这就使得在获取嵌套结果集的时候不至于内存不够用。默认值:false
  • resultSets - 这个设置仅适用于多结果集的情况。它将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔。

思考:如果需要根据名字和密码去查询某个用户,该如何查询?

思路一:

通过注解 @param(value) 在接口参数标识 SQL 语句中的占位标识名。

pulic interface UserMapper {/*** 按名称和密码查询用户* @param name 名字,这里的注解 @param(value) 里的 value 对应的是sql参数的占位标识* @param password 密码* @return 查询到的用户*/User selectUserByNameAndPassword(@Param("name") String name, @Param("password") String password);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lmx.demo.mapper.UserMapper"><!-- 思路一 --><select id="selectUserByNameAndPassword" resultType="com.lmx.demo.pojo.User">select * from user where name = #{name} and password = #{password} ;</select>
</mapper>

测试类:

public class UserMapperTest {@Testpublic void selectUserByNameAndPassword() {SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.selectUserByNameAndPassword("张三", "654321");System.out.println(user);sqlSession.close();}}

运行结果:

思路二:

通过 Map 键值对的方式传参。

pulic interface UserMapper {/*** 按名称和密码查询用户* @param param 参数,这里用键值对的方式传递。*              key 表示 sql 语句中参数的占位标识*              value 参数的值*              map 传递参数无顺序要求的* @return 查询到的用户*/User selectUserByNameAndPassword(Map<String, Object> param);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lmx.demo.mapper.UserMapper"><!-- 思路二 --><select id="selectUserByNameAndPassword" parameterType="map" resultType="com.lmx.demo.pojo.User">select * from user where name = #{name} and password = #{password} ;</select>
</mapper>

测试类:

public class UserMapperTest {@Testpublic void selectUserByNameAndPassword() {SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);HashMap<String, Object> param = new HashMap<>();param.put("name", "张三");param.put("password", "654321");User user = userMapper.selectUserByNameAndPassword(param);System.out.println(user);sqlSession.close();}}

运行结果:

从上面两种思路可以看出如果要传递的参数比较多的时候,我们可以采用 map 的方式传递,参数比较少时可以选择用注解 @param 的方式传递。

4. INSERT(插入)

光查询数据库肯定是不够的,如果我们想对数据库进行数据的插入,我们可以使用 insert 标签。它和 select 标签的属性是差不多的。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lmx.demo.mapper.UserMapper"><insertid=""parameterType=""flushCache="true"statementType="PREPARED"keyProperty=""keyColumn=""useGeneratedKeys="false"timeout="20"></insert>
</mapper>

从上面可以看出, insert 标签的属性有 3 个新增加的属性,也是仅适用于 insertupdate 标签。

  • useGeneratedKeys - (仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。
  • keyProperty - (仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。
  • keyColumn - (仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。

insert 标签的用法也是非常简单的:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lmx.demo.mapper.UserMapper"><insert id="addUser" parameterType="com.lmx.demo.pojo.User">insert into user (name, password) VALUES (#{name}, #{password});</insert>
</mapper>
public interface UserMapper {int addUser(User user);}

测试类:

public class UserMapperTest {@Testpublic void addUser() {SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = new User();user.setName("王五");user.setPassword("123123");int result = userMapper.addUser(user);System.out.println(result > 0 ? "添加成功!" : "添加失败!");// insert、update和delete都是需要开启事务提交的。sqlSession.commit();sqlSession.close();}}

运行结果:

注意:Mybatis 的 insert , updatedelete 的操作是需要手动提交事务的,否则是不会提交数据到数据库的。这和 JDBC 中是一样的,不过无需调用 setAutoCommit() 方法。

5. UPDATE(更新)

update 标签的用法也是差不多的,也是需要提交事务的,不然不会提交数据到数据库的

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lmx.demo.mapper.UserMapper"><insert id="addUser" parameterType="com.lmx.demo.pojo.User">insert into user (name, password) VALUES (#{name}, #{password});</insert>
</mapper>
public interface UserMapper {int modifyUserById(User user);}

测试类:

public class UserMapperTest {@Testpublic void modifyUserById() {SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = new User(7, "王小五", "654321");int result = userMapper.modifyUserById(user);System.out.println(result > 0 ? "修改成功!" : "修改失败!");sqlSession.commit();sqlSession.close();}}

运行结果:

6. DELETE(删除)

相信通过上面三次操作,对 delete 标签的使用也应该知道了吧?用法也都是一样的。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lmx.demo.mapper.UserMapper"><delete id="deleteUserById" parameterType="int">delete from user where id = #{id};</delete>
</mapper>
public interface UserMapper {int deleteUserById(int id);}

测试类:

public class UserMapperTest {@Testpublic void deleteUserById() {SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);int result = userMapper.deleteUserById(7);System.out.println(result > 0 ? "删除成功!" : "删除失败!");sqlSession.commit();sqlSession.close();}}

运行结果:

7. 注意事项

相信通过上面的4个标签的使用,对 Mybatis 的增删改查都有一点的了解。但在我们日常使用的过程中难免会因为一些疏忽照成代码运行时报错。那在我们写代码的时候就需要注意以下几点:

  1. 所有的增删改查的操作都是需要提交事务的!
  2. 接口所有的普通参数,尽量都写上 @Param 参数,尤其是多个参数时,必须写上!
  3. 为了规范操作,在 SQL 的配置文件中,我们尽量将 parameterType 参数和 resultType 都写上!

参考资料:

  • 【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂 - p3
  • Mybatis 参考文档

JavaWeb进阶之路:MyBatis-CURD(增删改查)相关推荐

  1. mybatis实现增删改查xml配置和后端Java编程完整教程

    mybatis实现增删改查xml配置和后端编程教程 SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8&quo ...

  2. mybatis完整增删改查入门实例

    mybatis完整增删改查入门实例 编程步骤 ①创建Java工程. ②导入jar包. ③创建sqlMapConfig.xml配置文件,这是mybatis的入口. ④创建数据库,数据库表user_c,插 ...

  3. idea使用mybatis写增删改查

    idea应用mybatis写增删改查 entity层 private Integer id;private String userCode;private String userName;privat ...

  4. Spring+SpringMVC+Mybatis实现增删改查--(五)SSM修改员工页面搭建

    Spring+SpringMVC+Mybatis实现增删改查--(五)SSM修改员工页面搭建 修改员工: 1.在index.jsp页面点击"编辑"弹出编辑对话框 2.去数据库查询部 ...

  5. MyBatis的增删改查操作

    MyBatis的增删改查操作 简单实现一下MyBatis的增删改查,并且在控制台输出结果. 文章目录 MyBatis的增删改查操作 MyBatis的简单入门 一.查询操作 二.增加操作 三.修改操作 ...

  6. MyBatis实现增删改查功能(总)

    文章目录 MyBatis实现增删改查功能(总) 一.创建数据库.表.数据 二.MyBatis的Maven项目创建 三.MyBatis的Maven模块创建 四.配置jar包pom.xml 五.MyBat ...

  7. Mybatis实现增删改查

    文章目录 Mybatis实现增删改查 一.mybatis的配置 1.1 添加相应的jar包 1.2 配置mybatis.xml文件 1.3 创建数据库 1.4 创建实体类 1.5 创建接口实现的方法 ...

  8. springboot+springm vc+mybatis实现增删改查案例!

    大家好,我是雄雄,欢迎关注微信公众号[雄雄的小课堂]. 前言 最近这几天都在看关于springboot的内容,每天新会获得点新收获,并且都总结发在公众号中:最后经过不懈努力,不断查找相关网页,解决各种 ...

  9. (Mybatis)增删改查实现

    文章目录 namespace 增删改查 1. Select 2. Insert 3. Update 4. Delete 万能Map 模糊查询 namespace namespace一定要与mapper ...

  10. 8、mybatis之增删改查

    文章目录 1.EmployeeMapper.xml 2.测试增删改查 1.EmployeeMapper.xml <?xml version="1.0" encoding=&q ...

最新文章

  1. 年终总结,程序员票选最喜欢的编程语言花落谁家?
  2. IT-标准化-系列-0.课程-V1.0
  3. linux下查看cpu,内存,硬盘等硬件信息的方法
  4. 继Science发文后,Nature也发文评论曹雪涛“误用图片”调查结果
  5. 信息采集-火车采集器
  6. 遍历数组的两种for循环方式以及一种Arrays方式
  7. python 查找excel标红的数据_excel表格如何快速给数据标红-如何将查找出的excel内容批量标记为红色?...
  8. 【Kafka】Cancelled fetchMetadata request with correlation id due to node -1 being disconnected
  9. Jib快速打包Docker镜像
  10. Win10电脑浏览器连不上网
  11. 【Practical】积分第一中值定理
  12. 检查DNT.config中Dbtype节点数据库类型是否正确,例如:SqlServer、Access、MySql
  13. 使用Shell脚本对Oracle元数据进行动态版本控制
  14. Server Disconnect
  15. 软考有很多70后的人,是什么原因会参加考试呢?
  16. 你会查杀病毒吗?反病毒技巧! 比较长。
  17. [离散数学]集合论基础P_3:集合的基本运算
  18. 模型预测控制的缺点_华北电力大学 刘英培等:适用于风电并网的VSCHVDC系统模型预测控制...
  19. 单片机:11.UART串口通信
  20. BUUCTF Misc wp大合集(3)

热门文章

  1. ISP错误、ISV错误
  2. python3 的 md5加密
  3. Python搭建SVM
  4. 为什么现在很多人特别排斥用微信打电话
  5. 中行安全控件可致 Win8 笔记本键盘失灵
  6. 为什么很多人不喜欢做程序员?甚至讨厌程序员?
  7. 【JAVA】8.继承(图形面积问题)
  8. X265-Android
  9. 怎么在网易云或者QQ音乐上上传自己翻唱的歌
  10. 常见问题:try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候执行?