MyBatis 常用工具类

瑞星  金牌会员 | 2023-7-23 15:00:42 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 851|帖子 851|积分 2553

SQL 类

MyBatis 提供了一个 SQL 工具类,使用这个工具类,我们可以很方便在 Java 代码动态构建 SQL 语句
  1. String newSql = new SQL() ({
  2. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  3.   <property name="someProperty" value="10"/>
  4. </objectfactory>SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL NAME");
  5. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  6.   <property name="someProperty" value="10"/>
  7. </objectfactory>SELECT("P.LAST NAME, P.CREATED ON, P.UPDATED ON");
  8. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  9.   <property name="someProperty" value="10"/>
  10. </objectfactory>FROM("PERSON P");
  11. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  12.   <property name="someProperty" value="10"/>
  13. </objectfactory>FROM("ACCOUNT A");
  14. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  15.   <property name="someProperty" value="10"/>
  16. </objectfactory>INNER JOIN("DEPARTMENT D ON DID=P.DEPARTMENT ID");
  17. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  18.   <property name="someProperty" value="10"/>
  19. </objectfactory>INNER JOIN("COMPANY C On D.COMPANY ID=C.ID");
  20. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  21.   <property name="someProperty" value="10"/>
  22. </objectfactory>WHERE("P.ID = A.ID");
  23. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  24.   <property name="someProperty" value="10"/>
  25. </objectfactory>WHERE("P.FIRST NAME like ?");
  26. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  27.   <property name="someProperty" value="10"/>
  28. </objectfactory>OR();
  29. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  30.   <property name="someProperty" value="10"/>
  31. </objectfactory>WHERE("P.LAST NAME like ?");
  32. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  33.   <property name="someProperty" value="10"/>
  34. </objectfactory>GROUP BY("P.ID");
  35. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  36.   <property name="someProperty" value="10"/>
  37. </objectfactory>HAVING("P.LAST_NAME like ?");
  38. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  39.   <property name="someProperty" value="10"/>
  40. </objectfactory>OR();
  41. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  42.   <property name="someProperty" value="10"/>
  43. </objectfactory>HAVING("P.FIRST NAME like ?");
  44. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  45.   <property name="someProperty" value="10"/>
  46. </objectfactory>ORDER BY("P.ID");
  47. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  48.   <property name="someProperty" value="10"/>
  49. </objectfactory>ORDER BY("P.FULL NAME");
  50. }}.tostring();
复制代码
如上面的代码所示,创建了一个匿名的 SQL 类的子类,在匿名子类的初始化代码块中,调用 SELECT()、FROM() 等方法构建 SQL 语句,这种方式能够很好地避免字符串拼接过程中缺少空格或者偶然间重复出现的 AND 关键字导致的 SOL 语句不正确
除了 SELECT 语句外,SQL 工具类也可以用作构建 UPDATE、INSERT 等语句
  1. @Test
  2. public void testInsertSql() {
  3. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  4.   <property name="someProperty" value="10"/>
  5. </objectfactory>String insertSql = new SQL().
  6. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  7.   <property name="someProperty" value="10"/>
  8. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  9.   <property name="someProperty" value="10"/>
  10. </objectfactory>INSERT INTO("PERSON").
  11. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  12.   <property name="someProperty" value="10"/>
  13. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  14.   <property name="someProperty" value="10"/>
  15. </objectfactory>VALUES("ID, FIRST NAME","#{id}, #{firstName}").
  16. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  17.   <property name="someProperty" value="10"/>
  18. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  19.   <property name="someProperty" value="10"/>
  20. </objectfactory>VALUES("LAST NAME","#(lastName}").toString();
  21. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  22.   <property name="someProperty" value="10"/>
  23. </objectfactory>System.out.println(insertSal);
  24. }
  25. @Test
  26. public void testDeleteSql() {
  27. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  28.   <property name="someProperty" value="10"/>
  29. </objectfactory>String deleteSql= new SQL() {{
  30. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  31.   <property name="someProperty" value="10"/>
  32. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  33.   <property name="someProperty" value="10"/>
  34. </objectfactory>DELETE FROM("PERSON");
  35. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  36.   <property name="someProperty" value="10"/>
  37. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  38.   <property name="someProperty" value="10"/>
  39. </objectfactory>WHERE("ID = #{id)");
  40. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  41.   <property name="someProperty" value="10"/>
  42. </objectfactory>}}.toString();
  43. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  44.   <property name="someProperty" value="10"/>
  45. </objectfactory>System.out.println(deleteql);
  46. }
  47. @Test
  48. public void testUpdateSql() {
  49. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  50.   <property name="someProperty" value="10"/>
  51. </objectfactory>String updateSql= new SQL() {{
  52. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  53.   <property name="someProperty" value="10"/>
  54. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  55.   <property name="someProperty" value="10"/>
  56. </objectfactory>UPDATE("PERSON");
  57. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  58.   <property name="someProperty" value="10"/>
  59. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  60.   <property name="someProperty" value="10"/>
  61. </objectfactory>SET("FIRST NAME = #{firstName}");
  62. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  63.   <property name="someProperty" value="10"/>
  64. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  65.   <property name="someProperty" value="10"/>
  66. </objectfactory>WHERE("ID = #{id}");
  67. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  68.   <property name="someProperty" value="10"/>
  69. </objectfactory>}}.toString();
  70. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  71.   <property name="someProperty" value="10"/>
  72. </objectfactory>System.out.println(updateSql);
  73. }
复制代码
使用 SQL 工具类的另一个好处是可以很方便地在 Java 代码中根据条件动态地拼接 SQL 语句
  1. public String selectPerson(final String id, final String firstName, final String lastName) {
  2. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  3.   <property name="someProperty" value="10"/>
  4. </objectfactory>return new SQL() {{
  5. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  6.   <property name="someProperty" value="10"/>
  7. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  8.   <property name="someProperty" value="10"/>
  9. </objectfactory>SELECT("P.ID, P.USERNAME, P.PASSWORD");
  10. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  11.   <property name="someProperty" value="10"/>
  12. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  13.   <property name="someProperty" value="10"/>
  14. </objectfactory>SELECT("P.FIRST_NAME, P.LAST NAME");
  15. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  16.   <property name="someProperty" value="10"/>
  17. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  18.   <property name="someProperty" value="10"/>
  19. </objectfactory>FROM("PERSON P");
  20. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  21.   <property name="someProperty" value="10"/>
  22. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  23.   <property name="someProperty" value="10"/>
  24. </objectfactory>if (id != null) {
  25. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  26.   <property name="someProperty" value="10"/>
  27. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  28.   <property name="someProperty" value="10"/>
  29. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  30.   <property name="someProperty" value="10"/>
  31. </objectfactory>WHERE("P.ID=#{id}");
  32. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  33.   <property name="someProperty" value="10"/>
  34. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  35.   <property name="someProperty" value="10"/>
  36. </objectfactory>}
  37. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  38.   <property name="someProperty" value="10"/>
  39. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  40.   <property name="someProperty" value="10"/>
  41. </objectfactory>if (firstName != null) {
  42. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  43.   <property name="someProperty" value="10"/>
  44. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  45.   <property name="someProperty" value="10"/>
  46. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  47.   <property name="someProperty" value="10"/>
  48. </objectfactory>WHERE("P.FIRST_NAME=#{firstName}");
  49. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  50.   <property name="someProperty" value="10"/>
  51. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  52.   <property name="someProperty" value="10"/>
  53. </objectfactory>}
  54. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  55.   <property name="someProperty" value="10"/>
  56. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  57.   <property name="someProperty" value="10"/>
  58. </objectfactory>if (lastName != null) {
  59. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  60.   <property name="someProperty" value="10"/>
  61. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  62.   <property name="someProperty" value="10"/>
  63. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  64.   <property name="someProperty" value="10"/>
  65. </objectfactory>WHERE("P.LAST_NAME=#{lastName}");
  66. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  67.   <property name="someProperty" value="10"/>
  68. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  69.   <property name="someProperty" value="10"/>
  70. </objectfactory>}
  71. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  72.   <property name="someProperty" value="10"/>
  73. </objectfactory>}}.toString();
  74. }
复制代码
ScriptRunner

该工具类用于读取脚本文件中的 SQL 语句并执行
  1. public void testscriptRunner() {
  2. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  3.   <property name="someProperty" value="10"/>
  4. </objectfactory>try<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  5.   <property name="someProperty" value="10"/>
  6. </objectfactory>{
  7. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  8.   <property name="someProperty" value="10"/>
  9. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  10.   <property name="someProperty" value="10"/>
  11. </objectfactory>Connection connection=DriverManager.getConnection("jdbc:hsqldb:mem:mybatis","sa","");
  12. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  13.   <property name="someProperty" value="10"/>
  14. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  15.   <property name="someProperty" value="10"/>
  16. </objectfactory>Scriptrunner scriptRunnermnew ScriptRunner(connection):
  17. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  18.   <property name="someProperty" value="10"/>
  19. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  20.   <property name="someProperty" value="10"/>
  21. </objectfactory>scriptrunner.runScript(Resources.getResourceAsReader("create-table.sql"))
  22. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  23.   <property name="someProperty" value="10"/>
  24. </objectfactory>} catch (Exception e) {
  25. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  26.   <property name="someProperty" value="10"/>
  27. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  28.   <property name="someProperty" value="10"/>
  29. </objectfactory>e.printstackTrace();
  30. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  31.   <property name="someProperty" value="10"/>
  32. </objectfactory>}
  33. }
复制代码
如上面的代码所示,ScriptRunner 工具类的构造方法需要一个 java.sql.Connection 对象作为参数。创建 ScriptRunner 对象后,调用该对象的 runScript 方法即可,该方法接收一个读取 SQL 脚本文件的 Reader 对象作为参数
ScriptRunner 工具类中提供了一些属性,用于控制执行 SQL 脚本的一些行为,代码如下;
  1. public class ScriptRunner{
  2. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  3.   <property name="someProperty" value="10"/>
  4. </objectfactory>// SQL异常是否中断程序执行
  5. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  6.   <property name="someProperty" value="10"/>
  7. </objectfactory>private boolean stopOnError;
  8. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  9.   <property name="someProperty" value="10"/>
  10. </objectfactory>// 是否抛出 SQLWarning 警告
  11. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  12.   <property name="someProperty" value="10"/>
  13. </objectfactory>private boolean throwWarning;
  14. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  15.   <property name="someProperty" value="10"/>
  16. </objectfactory>//是否自动提交
  17. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  18.   <property name="someProperty" value="10"/>
  19. </objectfactory>private boolean autoCommit;
  20. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  21.   <property name="someProperty" value="10"/>
  22. </objectfactory>// 属性为 true 时,批量执行文件中的 SQL 语句
  23. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  24.   <property name="someProperty" value="10"/>
  25. </objectfactory>//为false时逐条执行 sQL 语句,默认情况下,SQL语句以分号分割
  26. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  27.   <property name="someProperty" value="10"/>
  28. </objectfactory>private boolean sendfullScript;
  29. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  30.   <property name="someProperty" value="10"/>
  31. </objectfactory>//是否去除Windows系统换行符中的\r
  32. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  33.   <property name="someProperty" value="10"/>
  34. </objectfactory>private boolean removecrs;
  35. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  36.   <property name="someProperty" value="10"/>
  37. </objectfactory>//设置statement属性是否支持转义处理
  38. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  39.   <property name="someProperty" value="10"/>
  40. </objectfactory>private boolean escapeProcessing=true;
  41. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  42.   <property name="someProperty" value="10"/>
  43. </objectfactory>// 日志输出位置,默认标准输入输出,即控制台
  44. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  45.   <property name="someProperty" value="10"/>
  46. </objectfactory>private PrintWriter logWriter=new PrintWriter(System.out);
  47. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  48.   <property name="someProperty" value="10"/>
  49. </objectfactory>// 错误日志输出位置,默认控制台
  50. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  51.   <property name="someProperty" value="10"/>
  52. </objectfactory>private PrintWriter errorLoqWriter =new PrintWriter(System.err);
  53. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  54.   <property name="someProperty" value="10"/>
  55. </objectfactory>// 脚本文件中 SOL 语句的分隔符,默认为分号
  56. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  57.   <property name="someProperty" value="10"/>
  58. </objectfactory>private String delimiter= DEFAULT_DELIMITER;
  59. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  60.   <property name="someProperty" value="10"/>
  61. </objectfactory>// 是否支持 SOL 语句分割符,单独占一行
  62. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  63.   <property name="someProperty" value="10"/>
  64. </objectfactory>private boolean fullLineDelimiter;
  65. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  66.   <property name="someProperty" value="10"/>
  67. </objectfactory>...
  68. }
复制代码
我们可以直接调用这些属性对应的 Setter 方法来控制 ScriptRunner 工具类执行 SQL 脚本的行为

SqlRunner

MyBatis 提供了一个非常实用的、用于操作数据库的 SqlRunner 工具类,该类对 JDBC 做了很好的封装,结合 SQL 工具类,能够很方便地通过 Java 代码执行 SQL 语句并检索 SQL 执行结果
SglRunner 类提供了几个操作数据库的方法,分别说明如下:

  • SqlRunner#closeConnection: 用于关闭 Connection 对象
  • SqlRunner#selectOne(String sql, Object… args):执行 SELECT 语句,SQL 语句中可以使用占位符,如果 SOL 中包含占位符,则可变参数用于为参数占位符赋值,该方法只返回一条记录,若查询结果行数不等于一,则会抛出 SQLException 异常
  • SqlRunner#selectAll(String sql,Object… args):该方法和 selectOne 方法的作用相同,只不过该方法可以返回多条记录,方法返回值是一个 List 对象,List 中包含多个 Map 对象,每个 Map 对象对应数据库中的一行记录
  • SqlRunner#insert(String sql,Object… args):执行一条 INSERT 语句,插入一条记录
  • SqlRunner#update(String sql,Object… args):更新若干条记录
  • SqlRunner#delete(String sql,Object… args):删除若干条记录
  • SqlRunner#run(String sql):执行任意一条 SQL 语句,最好为 DDL 语句
接下来我们来看一下 SqlRunner 工具类的使用案例,代码如下:
  1. @Test
  2. public void testselectOne() throws SQLException {
  3. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  4.   <property name="someProperty" value="10"/>
  5. </objectfactory>SqlRunner sqlRunner=new SqlRunner(connection)
  6. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  7.   <property name="someProperty" value="10"/>
  8. </objectfactory>String gryUserSql = new SQL() {{
  9. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  10.   <property name="someProperty" value="10"/>
  11. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  12.   <property name="someProperty" value="10"/>
  13. </objectfactory>SELECT("*");
  14. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  15.   <property name="someProperty" value="10"/>
  16. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  17.   <property name="someProperty" value="10"/>
  18. </objectfactory>FROM("user");
  19. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  20.   <property name="someProperty" value="10"/>
  21. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  22.   <property name="someProperty" value="10"/>
  23. </objectfactory>WHERE("id=?");
  24. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  25.   <property name="someProperty" value="10"/>
  26. </objectfactory>}}.toString();
  27. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  28.   <property name="someProperty" value="10"/>
  29. </objectfactory>Map<String, Object> resultMap = sqlRunner.selectOne(qryUserSql, Integer.valueOf(1));
  30. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  31.   <property name="someProperty" value="10"/>
  32. </objectfactory>System.out.println(JSON.toJSONString(resultMap));
  33. }
  34. @Test
  35. public void testDelete() throws SQLException {
  36. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  37.   <property name="someProperty" value="10"/>
  38. </objectfactory>SqlRunner sqlRunner=new SqlRunner(connection);
  39. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  40.   <property name="someProperty" value="10"/>
  41. </objectfactory>String deleteUserSql = new SQL() {{
  42. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  43.   <property name="someProperty" value="10"/>
  44. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  45.   <property name="someProperty" value="10"/>
  46. </objectfactory>DELETE FROM("user");
  47. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  48.   <property name="someProperty" value="10"/>
  49. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  50.   <property name="someProperty" value="10"/>
  51. </objectfactory>WHERE("id = ?");
  52. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  53.   <property name="someProperty" value="10"/>
  54. </objectfactory>}}.toString();
  55. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  56.   <property name="someProperty" value="10"/>
  57. </objectfactory>sqlRunner.delete(deleteUserSql,Integer.valueOf(1));
  58. }
  59. @Test
  60. public void testUpdate() throws SQLException {
  61. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  62.   <property name="someProperty" value="10"/>
  63. </objectfactory>SqlRunner sqlRunner=new SqlRunner(connection);
  64. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  65.   <property name="someProperty" value="10"/>
  66. </objectfactory>String updateUserSql = new SQL() {{
  67. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  68.   <property name="someProperty" value="10"/>
  69. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  70.   <property name="someProperty" value="10"/>
  71. </objectfactory>UPDATE("user");
  72. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  73.   <property name="someProperty" value="10"/>
  74. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  75.   <property name="someProperty" value="10"/>
  76. </objectfactory>SET("nick_name = ?");
  77. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  78.   <property name="someProperty" value="10"/>
  79. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  80.   <property name="someProperty" value="10"/>
  81. </objectfactory>WHERE("id = ?");
  82. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  83.   <property name="someProperty" value="10"/>
  84. </objectfactory>}}.toString();
  85. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  86.   <property name="someProperty" value="10"/>
  87. </objectfactory>sqlRunner.update(updateUserSql,"Jane",Integer.valueOf(1));
  88. }
  89. @Test
  90. public void testInsert() throws SQLException {
  91. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  92.   <property name="someProperty" value="10"/>
  93. </objectfactory>SqlRunner sqlRunner=new SqlRunner(connection);
  94. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  95.   <property name="someProperty" value="10"/>
  96. </objectfactory>String insertUserSql = new SQL() {{
  97. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  98.   <property name="someProperty" value="10"/>
  99. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  100.   <property name="someProperty" value="10"/>
  101. </objectfactory>INSERT INTO("user");
  102. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  103.   <property name="someProperty" value="10"/>
  104. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  105.   <property name="someProperty" value="10"/>
  106. </objectfactory>INTO COLUMNS("create_time, name, password, phone, nick_name");
  107. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  108.   <property name="someProperty" value="10"/>
  109. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  110.   <property name="someProperty" value="10"/>
  111. </objectfactory>INTO VALUES("?,?,?,?,?");
  112. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  113.   <property name="someProperty" value="10"/>
  114. </objectfactory>}}.toString();
  115. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  116.   <property name="someProperty" value="10"/>
  117. </objectfactory>sqlRunner.insert(insertUserSql,createTime,"Jane","test","18700000000" "J");
  118. }
复制代码
MetaObject

MetaObject 是 MyBatis 中的反射工具类,该工具类在 MyBati s源码中出现的频率非常高。使用 MetaObject 工具类,我们可以很优雅地获取和设置对象的属性值
使用 MetaObject 工具类获取 User 对象的属性信息,案例代码如下:
  1. @Test
  2. public void testMetaObject() {
  3. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  4.   <property name="someProperty" value="10"/>
  5. </objectfactory>List<order> orders= new ArrayList()(
  6. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  7.   <property name="someProperty" value="10"/>
  8. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  9.   <property name="someProperty" value="10"/>
  10. </objectfactory>add(new Order("order20171024010246","《MyBatis源码深度解析》图书"));
  11. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  12.   <property name="someProperty" value="10"/>
  13. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  14.   <property name="someProperty" value="10"/>
  15. </objectfactory>add(new Order("order20171024010248","《AngularJs入门与进阶》图书"));
  16. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  17.   <property name="someProperty" value="10"/>
  18. </objectfactory>};
  19. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  20.   <property name="someProperty" value="10"/>
  21. </objectfactory>User user = new User(orders,"江荣波",3);
  22. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  23.   <property name="someProperty" value="10"/>
  24. </objectfactory>MetaObject metaObject = SystemMetaObject.forObject(user);
  25. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  26.   <property name="someProperty" value="10"/>
  27. </objectfactory>// 获取第一笔订单的商品名称
  28. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  29.   <property name="someProperty" value="10"/>
  30. </objectfactory>System.out.println(metaObject.getValue("orders[0].goodsName"));
  31. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  32.   <property name="someProperty" value="10"/>
  33. </objectfactory>// 获取第二笔订单的商品名称
  34. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  35.   <property name="someProperty" value="10"/>
  36. </objectfactory>System.out.println(metaObject.getvalue("orders[1].goodsName"));
  37. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  38.   <property name="someProperty" value="10"/>
  39. </objectfactory>// 为属性设置值
  40. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  41.   <property name="someProperty" value="10"/>
  42. </objectfactory>metaObject.setValue("orders[1].orderNo","order20181113010139");
  43. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  44.   <property name="someProperty" value="10"/>
  45. </objectfactory>// 判断 User 对象是否有 orderNo 属性
  46. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  47.   <property name="someProperty" value="10"/>
  48. </objectfactory>System.out.println("是否有orderNo属性且orderNo属性有对应的Getter方法:" + metaObject.hasGetter("orderNo"));
  49. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  50.   <property name="someProperty" value="10"/>
  51. </objectfactory>// 判断 User 对象是否有 name 属性
  52. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  53.   <property name="someProperty" value="10"/>
  54. </objectfactory>System.out.println("是否有name属性且name 属性有对应的Getter方法:" + metaObject.hasGetter("name"));
  55. }
复制代码
MetaClass

MetaClass 是 MyBatis 中的反射工具类,与 MetaOjbect 不同的是,MetaObject 用于获取和设置对象的属性值,而 MetaClass 则用于获取类相关的信息
  1. @Test
  2. public void testMetaClass() {
  3. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  4.   <property name="someProperty" value="10"/>
  5. </objectfactory>MetaClass metaClass =MetaClass.forClass(Orderclass,newDefaultReflectorFactory());
  6. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  7.   <property name="someProperty" value="10"/>
  8. </objectfactory>// 获取所有有 Getter 方法的属性名
  9. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  10.   <property name="someProperty" value="10"/>
  11. </objectfactory>String[] getterNames = metaClass.getGetterNames();
  12. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  13.   <property name="someProperty" value="10"/>
  14. </objectfactory>System.out.println(JSON.toJSONString(getterNames));
  15. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  16.   <property name="someProperty" value="10"/>
  17. </objectfactory>// 是否有默认构造方法
  18. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  19.   <property name="someProperty" value="10"/>
  20. </objectfactory>System.out.println("是否有默认构造方法:" + metaClass.hasDefaultConstructor());
  21. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  22.   <property name="someProperty" value="10"/>
  23. </objectfactory>// 某属性是否有对应的Getter/Setter方法
  24. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  25.   <property name="someProperty" value="10"/>
  26. </objectfactory>System.out.printIn("orderNo属性是否有对应的Getter 方法:" + metaClass.hasGetter("orderNo"));
  27. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  28.   <property name="someProperty" value="10"/>
  29. </objectfactory>System.out.println("orderNo属性是否有对应的Setter方法:" + metaClass.hasSetter("orderNo"));
  30. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  31.   <property name="someProperty" value="10"/>
  32. </objectfactory>System.out.println("orderNo属性类型:" + metaClass.getGetterType("orderNo"));
  33. }
复制代码
ObjectFactory

ObjectFactory 是 MyBatis 中的对象工厂,MyBatis 每次创建 Mapper 映射结果对象的新实例时,都会使用一个对象工厂实例来完成。ObjectFactory 接口只有一个默认的实现,即 DefaultObjectFactory,默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化
  1. public class ObjectFactoryExample {
  2. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  3.   <property name="someProperty" value="10"/>
  4. </objectfactory>@Test
  5. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  6.   <property name="someProperty" value="10"/>
  7. </objectfactory>public void testObjectFactory() {
  8. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  9.   <property name="someProperty" value="10"/>
  10. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  11.   <property name="someProperty" value="10"/>
  12. </objectfactory>ObjectFactory objectFactory = new DefaultObjectFactory();
  13. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  14.   <property name="someProperty" value="10"/>
  15. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  16.   <property name="someProperty" value="10"/>
  17. </objectfactory>List<Integer> list = objectFactory.create(List.class);
  18. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  19.   <property name="someProperty" value="10"/>
  20. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  21.   <property name="someProperty" value="10"/>
  22. </objectfactory>Map<String, String> map = objectFactory.create(Map.class);
  23. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  24.   <property name="someProperty" value="10"/>
  25. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  26.   <property name="someProperty" value="10"/>
  27. </objectfactory>list.addAll(Arrays.asList(1. 23));
  28. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  29.   <property name="someProperty" value="10"/>
  30. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  31.   <property name="someProperty" value="10"/>
  32. </objectfactory>map.put("test","test");
  33. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  34.   <property name="someProperty" value="10"/>
  35. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  36.   <property name="someProperty" value="10"/>
  37. </objectfactory>System.out.printin(list);
  38. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  39.   <property name="someProperty" value="10"/>
  40. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  41.   <property name="someProperty" value="10"/>
  42. </objectfactory>System.out.println(map);
  43. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  44.   <property name="someProperty" value="10"/>
  45. </objectfactory>}
  46. }
复制代码
MyBatis 中使用 ObjectFactory 实例创建 Mapper 映射结果对象的目的是什么呢?实际上,这是 MyBatis 提供的一种扩展机制。有些情况下,在得到映射结果之前我们需要处理一些逻辑,或者在执行该类的有参构造方法时,在传入参数之前,要对参数进行一些处理,这时我们可以通过自定义 ObjectFactory 来实现。下面是一个自定义 ObjectFactory 的案例,代码如下:
  1. public class CustomObjectfactory extends Defaultobjectfactory{
  2. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  3.   <property name="someProperty" value="10"/>
  4. </objectfactory>
  5. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  6.   <property name="someProperty" value="10"/>
  7. </objectfactory>@Override
  8. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  9.   <property name="someProperty" value="10"/>
  10. </objectfactory>public object create(Class type){
  11. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  12.   <property name="someProperty" value="10"/>
  13. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  14.   <property name="someProperty" value="10"/>
  15. </objectfactory>if(type.equals(User.class)) {
  16. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  17.   <property name="someProperty" value="10"/>
  18. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  19.   <property name="someProperty" value="10"/>
  20. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  21.   <property name="someProperty" value="10"/>
  22. </objectfactory>//实例化User类
  23. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  24.   <property name="someProperty" value="10"/>
  25. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  26.   <property name="someProperty" value="10"/>
  27. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  28.   <property name="someProperty" value="10"/>
  29. </objectfactory>User user=(User)super.create(type);
  30. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  31.   <property name="someProperty" value="10"/>
  32. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  33.   <property name="someProperty" value="10"/>
  34. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  35.   <property name="someProperty" value="10"/>
  36. </objectfactory>user.setUuid(UUID.randomUUID().toString());
  37. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  38.   <property name="someProperty" value="10"/>
  39. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  40.   <property name="someProperty" value="10"/>
  41. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  42.   <property name="someProperty" value="10"/>
  43. </objectfactory>return user;
  44. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  45.   <property name="someProperty" value="10"/>
  46. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  47.   <property name="someProperty" value="10"/>
  48. </objectfactory>}
  49. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  50.   <property name="someProperty" value="10"/>
  51. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  52.   <property name="someProperty" value="10"/>
  53. </objectfactory>return super.create(type);
  54. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  55.   <property name="someProperty" value="10"/>
  56. </objectfactory>}
  57. }
复制代码
如上面的代码所示,自定义一个 ObjectFactory 非常简单,我们可以继承 DefaultObjectFactory,然后重写 create 方法即可。自定义 ObjectFactory 后,还需要在MyBatis 主配置文件中通过<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  <property name="someProperty" value="10"/>
</objectfactory>标签配置自定义的 ObjectFactory,具体如下:
  1. <objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  2.   <property name="someProperty" value="10"/>
  3. </objectfactory>
复制代码
ProxyFactory

ProxyFactory 是 MyBatis 的代理工厂,主要用于创建动态代理对象,ProxyFactory接口有两个不同的实现,分别为 CglibProxyFactory 和 JavassistProxyFactory。从实现类的名称可以看出,MyBatis 支持两种动态代理策略,分别为 Cglib 和 Javassist 动态代理。ProxyFactory主要用于实现 MyBatis 的懒加载功能。当开启懒加载后,MyBatis 创建 Mapper 映射结果对象后,会通过 ProxyFactory 创建映射结果对象的代理对象。当我们调用代理对象的 Getter 方法获取数据时,会执行 CglibProxyFactory 或 JavassistProxyFactory 中定义的拦截逻辑,然后执行一次额外的查询
下面是使用 JavassistProxyFactory 创建动态代理对象的案例,代码如下:
  1. public class ProxyFactoryExample {<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  2.   <property name="someProperty" value="10"/>
  3. </objectfactory>@Data<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  4.   <property name="someProperty" value="10"/>
  5. </objectfactory>@AllArgsConstructor<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  6.   <property name="someProperty" value="10"/>
  7. </objectfactory>private static class Order {<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  8.   <property name="someProperty" value="10"/>
  9. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  10.   <property name="someProperty" value="10"/>
  11. </objectfactory>private String orderNo;<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  12.   <property name="someProperty" value="10"/>
  13. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  14.   <property name="someProperty" value="10"/>
  15. </objectfactory>private String goodsName;<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  16.   <property name="someProperty" value="10"/>
  17. </objectfactory>}<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  18.   <property name="someProperty" value="10"/>
  19. </objectfactory>@Test<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  20.   <property name="someProperty" value="10"/>
  21. </objectfactory>public void testProxyFactory() {<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  22.   <property name="someProperty" value="10"/>
  23. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  24.   <property name="someProperty" value="10"/>
  25. </objectfactory>// 创建 ProxyFactory对象<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  26.   <property name="someProperty" value="10"/>
  27. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  28.   <property name="someProperty" value="10"/>
  29. </objectfactory>ProxyFactory proxyFactory =new JavassistProxyFactory();<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  30.   <property name="someProperty" value="10"/>
  31. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  32.   <property name="someProperty" value="10"/>
  33. </objectfactory>Order order = new Order("gn20170123","《MyBatis源码深度解析》图书");<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  34.   <property name="someProperty" value="10"/>
  35. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  36.   <property name="someProperty" value="10"/>
  37. </objectfactory>ObjectFactory objectFactory=new DefaultObjectFactory();<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  38.   <property name="someProperty" value="10"/>
  39. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  40.   <property name="someProperty" value="10"/>
  41. </objectfactory>//调用ProxyFactory对象的createProxy()方法创建代理对象<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  42.   <property name="someProperty" value="10"/>
  43. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  44.   <property name="someProperty" value="10"/>
  45. </objectfactory>Object proxyOrder=proxyFactory.createProxy(order,<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  46.   <property name="someProperty" value="10"/>
  47. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  48.   <property name="someProperty" value="10"/>
  49. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  50.   <property name="someProperty" value="10"/>
  51. </objectfactory>mock(ResultLoaderMap.class),<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  52.   <property name="someProperty" value="10"/>
  53. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  54.   <property name="someProperty" value="10"/>
  55. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  56.   <property name="someProperty" value="10"/>
  57. </objectfactory>mock(Configuration.class),<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  58.   <property name="someProperty" value="10"/>
  59. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  60.   <property name="someProperty" value="10"/>
  61. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  62.   <property name="someProperty" value="10"/>
  63. </objectfactory>objectfactory,<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  64.   <property name="someProperty" value="10"/>
  65. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  66.   <property name="someProperty" value="10"/>
  67. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  68.   <property name="someProperty" value="10"/>
  69. </objectfactory>Arrays.asList(String.class,String.class),<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  70.   <property name="someProperty" value="10"/>
  71. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  72.   <property name="someProperty" value="10"/>
  73. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  74.   <property name="someProperty" value="10"/>
  75. </objectfactory>Arrays.asList(order.getorderNo(),order.getGoodsName()));<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  76.   <property name="someProperty" value="10"/>
  77. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  78.   <property name="someProperty" value="10"/>
  79. </objectfactory>System.out.println(proxyOrder.getClass());<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  80.   <property name="someProperty" value="10"/>
  81. </objectfactory><objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  82.   <property name="someProperty" value="10"/>
  83. </objectfactory>System.out.println(((Order)proxyOrder).getGoodsName());<objectfactory type="com.blog4java.mybatis.objectfactory.CustomobjectFactory">
  84.   <property name="someProperty" value="10"/>
  85. </objectfactory>}}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表