在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

在Java的MyBatis框架中建立接口进行CRUD操作的方法

2016-7-29 15:41| 发布者: zhangjf| 查看: 635| 评论: 0

摘要: 以接口操作的方式编程 一般来讲,我们建立映射SQL接口的类时通常会这样: public static void testBasicQuery(int id) { SqlSession session = MybatisUtils.getSqlSession(); try { /* * 此处的 ...

以接口操作的方式编程
一般来讲,我们建立映射SQL接口的类时通常会这样:

  1. public static void testBasicQuery(int id) {
  2. SqlSession session = MybatisUtils.getSqlSession();
  3. try {
  4. /*
  5. * 此处的david.mybatis.demo.IVisitorOperation.basicQuery必须和下图中配置里面的namespace对应
  6. */
  7. Visitor visitor = (Visitor) session.selectOne("david.mybatis.demo.IVisitorOperation.basicQuery", id);
  8. MybatisUtils.closeSession(session);
  9. System.out.println(visitor);
  10. } catch (Exception e) {
  11. // TODO: handle exception
  12. }
  13. }
复制代码
  1. <!-- 此处namespace对应的就是你所传的String参数 -->
  2. <mapper namespace="david.mybatis.demo.IVisitorOperation">
  3. <!-- 此处的resultType就是对应刚刚你在typeAlias节点里面规定的别名 -->
  4. <select id="basicQuery" parameterType="int" resultType="Visitor">
  5. select * from visitor where id=#{id} and
  6. Status>0 order by Id
  7. </select>
  8. </mapper>
复制代码

这样其实在真正的开发过程中如果两边的名字一不小心没有对应上,就会出现异常。为了避免这样的情况我们可以采取接口的方式来进行相应的操作,下面我们来修改这段东西。

首先我们在包名为david.mybatis.demo的下面新建一个IVisitOperation类,表示今后将要操作数据库所有方法的接口,如下所示:

  1. package david.mybatis.demo;
  2. import java.util.List;
  3. import david.mybatis.model.PagenateArgs;
  4. import david.mybatis.model.Visitor;
  5. public interface IVisitorOperation {
  6. /*
  7. * 基础查询
  8. */
  9. public Visitor basicQuery(int id);
  10. }
  11. public static void testBasicQueryByInterfaceWay(int id) {
  12. SqlSession session = MybatisUtils.getSqlSession();
  13. try {
  14. IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
  15. Visitor visitor = vOperation.basicQuery(id);
  16. MybatisUtils.closeSession(session);
  17. System.out.println(visitor);
  18. } catch (Exception e) {
  19. // TODO: handle exception
  20. }
  21. }
复制代码

这样就大功告成了,这样我们就不必为手动书写方法名可能导致的不匹配而烦恼了。

CRUD操作
下面将讲解创建基于单表操作的CRUD与GetList操作,为了创建一点测试数据我们先弄个Add方法吧

继续在上次的IVisitorOperation接口类中添加add,delete,update,query与getList接口方法,如下所示:

  1. /*
  2. * 基础查询
  3. */
  4. public Visitor basicQuery(int id);
  5. /*
  6. * 添加访问者
  7. */
  8. public int add(Visitor visitor);
  9. /*
  10. * 删除访问者
  11. */
  12. public int delete(int id);
  13. /*
  14. * 更新访问者
  15. */
  16. public int update(Visitor visitor);
  17. /*
  18. * 查询访问者
  19. */
  20. public Visitor query(int id);
  21. /*
  22. * 查询访问者List
  23. */
  24. public List<Visitor> getList();
复制代码

对于相应的CRUD操作,在VisitorMapper.xml的节点下分别对应insert,update,delete,select节点,具体配置详情参数说明课参照官网 http://mybatis.github.io/mybatis-3/sqlmap-xml.html
这个示例中要的配置如下,传递的参数用#{parameter_name},当然也可直接用${parameter_name},

前者的方式,Mybatis会把它转化为参数化的形式例如 insert into table (name) values (#{name}) => insert into table (name) values ( ? ) (Mysql情况下)

后者的方式,Mybatis会原封不动的不做任何操作把参数传过来,例如 insert into table (name) values (${name}) => insert into table (name) values ( [你所传的值] ),传aa,这里就是aa,传'aa'这里就是'aa'。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="david.mybatis.demo.IVisitorOperation">
  6. <!--
  7. useGeneratedKeys="true"代表是否使用自增长序列,
  8. keyProperty="Id"指定自增长列是哪一列,
  9. parameterType="Visitor"指定IVisitorOperation接口类中定义中所传的相应类型
  10. resultType 表示返回的类型,例如query中的visitor
  11. resultMap 自定义的返回类型,是返回复杂类型是的最佳首选,也是mybatis里最强大的武器
  12. -->
  13. <insert id="add" parameterType="Visitor" useGeneratedKeys="true"
  14. keyProperty="Id">
  15. insert into Visitor (Name, Email, Status, CreateTime)
  16. values (#{name}, #{email}, #{status}, #{createTime})
  17. </insert>
  18. <delete id="delete" parameterType="int">
  19. delete from Visitor where
  20. status>0 and id = #{id}
  21. </delete>
  22. <update id="update" parameterType="Visitor">
  23. update Visitor set Name =
  24. #{name}, Email=#{email}, Status=#{status} where id=#{id} and Status>0;
  25. </update>
  26. <select id="query" parameterType="int" resultType="Visitor">
  27. select Id,
  28. Name, Email, Status, CreateTime from visitor where id=#{id} and
  29. Status>0 order by Id
  30. </select>
  31. <select id="basicQuery" parameterType="int" resultType="Visitor">
  32. select * from visitor where id=#{id} and
  33. Status>0 order by Id
  34. </select>
  35. <select id="getList" resultMap="visitorRs">
  36. <include refid="getListSql" />
  37. </select>
  38. <resultMap type="Visitor" id="visitorRs">
  39. <id column="Id" property="id" />
  40. <result column="Name" property="name" />
  41. <result column="Email" property="email" />
  42. <result column="Status" property="status" />
  43. <result column="CreateTime" property="createTime" />
  44. </resultMap>
  45. <sql id="getListSql">
  46. select * from Visitor where
  47. status>0
  48. </sql>
  49. </mapper>
复制代码

此处注意的一点是:操作节点中的ID要对应接口定义中的接口名字,参数类型也要相应对应,例如接口里是add(Visitor visitor),那么在配置insert节点的时候id="add",parameterType="Visitor"

否则会报相应的异常,例如id节点不对应接口名称会出现如下异常:

201646145316272.png (1228×153)

大家可以注意到在VisitorMapper.xml这个配置文件中在获取list的时候,使用的是resultMap,使用resultMap的情况下你可以指定你自己的sql语句与哪些字段相映射,因为有时候你可以不需要那么多列,那你在配置映射的时候也不需要配置那么多映射,或者说你的列有起过别名,那么就不能直接使用resultType="Visitor"的方式进行映射,因为Mybatis默认映射方式是通过Javabean的属性名与表的字段是否一致来匹配的,也可以通过配置节点下的属性值来控制是否映射的时候以Javabean中的驼峰命名方式配置如下。

  1. <settings>
  2. <setting name="mapUnderscoreToCamelCase" value="false" />
  3. </settings>
复制代码

具体其他修改Mapper的其他配置可以通过 http://mybatis.github.io/mybatis-3/configuration.html#settings 查看。
对于Visitor的Mapper类如下:

  1. <mapper namespace="david.mybatis.demo.IVisitorOperation">
  2. <sql id="getListSql">
  3. select id as visitor_id, name, email, status, createtime from Visitor where
  4. status>0
  5. </sql>
  6. <select id="getList" resultMap="visitorRs">
  7. <include refid="getListSql" />
  8. </select>
  9. <!--
  10. 这里指的注意的地方是property属性,里面的字段一定要和你在实体里面定义的属性一样,此处区分大小写
  11. 否则会出现默认setter为属性赋值的时候找不到相应属性的异常,大家可以试下
  12. column属性对应于查询语句返回结果集的名字,如果有为相应字段起过别名例如吧id变为了visitor_id
  13. 那么相应的column名字也要对应上
  14. -->
  15. <resultMap type="Visitor" id="visitorRs">
  16. <id column="visitor_id" property="id" />
  17. <result column="Name" property="name" />
  18. <result column="Email" property="email" />
  19. <result column="Status" property="status" />
  20. <result column="CreateTime" property="createTime" />
  21. </resultMap>
  22. </mapper>
复制代码

这里要大家还会注意到有一个节点节点,这个的用处就是提取公用的sql语句或者说字段,以便其他地方复用,其他详细说明用法可以参照 http://mybatis.github.io/mybatis-3/sqlmap-xml.html。
剩下的就是和刚刚一样的操作了,大家可以在demo程序里建立一个DemoRun的类存放各类测试方法,如下:

  1. package david.mybatis.demo;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import org.apache.ibatis.session.SqlSession;
  5. import david.mybatis.model.BasicQueryArgs;
  6. import david.mybatis.model.CRUD_Enum;
  7. import david.mybatis.model.Channel;
  8. import david.mybatis.model.PagenateArgs;
  9. import david.mybatis.model.Visitor;
  10. import david.mybatis.model.Website;
  11. public class DemoRun {
  12. public static void testBasicQuery(int id) {
  13. SqlSession session = MybatisUtils.getSqlSession();
  14. try {
  15. /*
  16. * 此处的david.mybatis.demo.IVisitorOperation.basicQuery必须和下图中配置里面的namespace对应
  17. */
  18. Visitor visitor = (Visitor) session.selectOne("david.mybatis.demo.IVisitorOperation.basicQuery", id);
  19. MybatisUtils.closeSession(session);
  20. System.out.println(visitor);
  21. } catch (Exception e) {
  22. // TODO: handle exception
  23. e.printStackTrace();
  24. }
  25. }
  26. public static void testBasicQueryByInterfaceWay(int id) {
  27. SqlSession session = MybatisUtils.getSqlSession();
  28. try {
  29. IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
  30. Visitor visitor = vOperation.basicQuery(id);
  31. MybatisUtils.closeSession(session);
  32. System.out.println(visitor);
  33. } catch (Exception e) {
  34. // TODO: handle exception
  35. e.printStackTrace();
  36. }
  37. }
  38. /*
  39. * 批量添加访问者记录
  40. */
  41. public static void addVisitors() {
  42. SqlSession session = MybatisUtils.getSqlSession();
  43. List<Visitor> visitors = Arrays.asList(new Visitor[] { new Visitor("mongodb", "mongodb@gmail.com"),
  44. new Visitor("redis", "redis@gmail.com"), new Visitor("memcached", "memcached@gmail.com"),
  45. new Visitor("CouchDB", "CouchDB@gmail.com"), new Visitor("HBase", "HBase@gmail.com"),
  46. new Visitor("Bigtable", "Bigtable@gmail.com"), new Visitor("Hive", "Hive@gmail.com"),
  47. new Visitor("MapReduce", "MapReduce@gmail.com"), });
  48. for (Visitor visitor : visitors) {
  49. addVisitor(visitor, session);
  50. }
  51. MybatisUtils.closeSession(session);
  52. MybatisUtils.showMessages(CRUD_Enum.List, visitors.size());
  53. }
  54. /*
  55. * 添加访问者信息
  56. */
  57. @SuppressWarnings("unused")
  58. private static void addVisitor(Visitor visitor, SqlSession session) {
  59. if (session == null)
  60. session = MybatisUtils.getSqlSession();
  61. IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
  62. int recordCount = vOperation.add(visitor);
  63. session.commit();
  64. if (session == null)
  65. MybatisUtils.closeSession(session);
  66. MybatisUtils.showMessages(CRUD_Enum.Add, recordCount);
  67. }
  68. /*
  69. * 重载添加访问者
  70. */
  71. public static void addVisitor(Visitor visitor) {
  72. addVisitor(visitor, null);
  73. }
  74. /*
  75. * 删除访问者信息
  76. */
  77. public static void deleteVisitor(int id) {
  78. SqlSession session = MybatisUtils.getSqlSession();
  79. IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
  80. int recordCount = vOperation.delete(id);
  81. session.commit();
  82. MybatisUtils.closeSession(session);
  83. MybatisUtils.showMessages(CRUD_Enum.Delete, recordCount);
  84. }
  85. /*
  86. * 更新访问者信息
  87. */
  88. public static void updateVisitor(int id) {
  89. SqlSession session = MybatisUtils.getSqlSession();
  90. IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
  91. Visitor visitor = vOperation.query(id);
  92. System.out.println("原始对象:" + visitor);
  93. String name = visitor.getName();
  94. if (name.contains("updated")) {
  95. visitor.setName(name.substring(0, name.indexOf("updated")));
  96. } else {
  97. visitor.setName(name + "updated");
  98. }
  99. int recordCount = vOperation.update(visitor);
  100. session.commit();
  101. MybatisUtils.closeSession(session);
  102. MybatisUtils.showMessages(CRUD_Enum.Update, recordCount);
  103. System.out.println("更新后对象:" + visitor);
  104. }
  105. /*
  106. * 查询访问者信息
  107. */
  108. public static void queryVisitor(int id) {
  109. SqlSession session = MybatisUtils.getSqlSession();
  110. IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
  111. Visitor visitor = vOperation.query(id);
  112. MybatisUtils.closeSession(session);
  113. MybatisUtils.showMessages(CRUD_Enum.Query, 1);
  114. System.out.println(visitor);
  115. }
  116. /*
  117. * 查询访问者列表
  118. */
  119. public static void queryVisitorList() {
  120. SqlSession session = MybatisUtils.getSqlSession();
  121. IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
  122. List<Visitor> visitors = vOperation.getList();
  123. for (Visitor visitor : visitors) {
  124. System.out.println(visitor);
  125. }
  126. MybatisUtils.closeSession(session);
  127. MybatisUtils.showMessages(CRUD_Enum.List, visitors.size());
  128. }
  129. }
复制代码

DemoRun类
运行一下后一个简单的基于单表CRUD,DEMO就完成啦

201646145447423.png (741×644)

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-5-6 09:24

Copyright 2015-2025 djqfx

返回顶部