MyBatis具体是什么东东,这些在后边在研究吧,本文目的是为了记录如何使用MyBatis。

  • 首先,需要下载MyBatis开发所需要文件。

通过github上可以找到MyBatis代码:https://github.com/mybatis/mybatis-3,在最新代码中可以下载具体的有代码包,也可以下载开发包。

  • 解压MyBatis后把其中的Jar包引入工程中:

  • 在工程下边添加配置文件:

mybatis-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 引用db.properties配置文件 -->
  7. <properties resource="resources/db.properties"/>
  8. <typeAliases>
  9. <package name="com.xxx.entity"/>
  10. </typeAliases>
  11. <!-- 对事务的管理和连接池的配置 -->
  12. <environments default="mysql_jdbc">
  13. <environment id="oracle_jdbc">
  14. <transactionManager type="JDBC"/>
  15. <dataSource type="POOLED">
  16. <property name="driver" value="${driver}"/>
  17. <property name="url" value="${url}"/>
  18. <property name="username" value="${name}"/>
  19. <property name="password" value="${password}"/>
  20. </dataSource>
  21. </environment>
  22.  
  23. <environment id="mysql_jdbc">
  24. <transactionManager type="JDBC"/>
  25. <dataSource type="POOLED">
  26. <property name="driver" value="${driver}"/>
  27. <property name="url" value="${url}"/>
  28. <property name="username" value="${name}"/>
  29. <property name="password" value="${password}"/>
  30. </dataSource>
  31. </environment>
  32. </environments>
  33. <mappers>
  34. <mapper resource="resources/mapper/TaskAutoExecutePlanMapper.xml"/>
  35. </mappers>
  36. </configuration>

log4j.properties

  1. # #define DEBUG priority, R
  2. # log4j.rootLogger = INFO, R
  3. # # configure log output type as file
  4. # log4j.appender.R = org.apache.log4j.DailyRollingFileAppender
  5. # #log filename
  6. # log4j.appender.R.file = ./logRecord.log
  7. # # append
  8. # log4j.appender.R.Append = true
  9. # log4j.appender.R.layout = org.apache.log4j.PatternLayout
  10. # log4j.appender.R.layout.ConversionPattern = %n%d%p[%l]%m%n
  11. #
  12. # log4j.appender.R.DatePattern='.' yyyy-MM-dd
  13.  
  14. log4j.rootLogger=DEBUG, Console
  15. #Console
  16. log4j.appender.Console=org.apache.log4j.ConsoleAppender
  17. log4j.appender.Console.layout=org.apache.log4j.PatternLayout
  18. log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
  19. log4j.logger.java.sql.ResultSet=INFO
  20. log4j.logger.org.apache=INFO
  21. log4j.logger.java.sql.Connection=DEBUG
  22. log4j.logger.java.sql.Statement=DEBUG
  23. log4j.logger.java.sql.PreparedStatement=DEBUG

这里主要目的是实现把MyBatis的sql操作打印到控制台中。

具体其他方式实现MyBatis操作日志打印到控制台,请参考文章:http://blog.csdn.net/qq_17555933/article/details/51656253

db.properties

  1. #oracle.jdbc.driver.OracleDriver | com.mysql.jdbc.Driver
  2. driver=com.mysql.jdbc.Driver
  3. #jdbc:oracle:thin:@localhost:1521:orcl | jdbc:mysql://localhost:3306/mybatis
  4. url=jdbc:mysql://localhost:3306/mybatis
  5. name=root
  6. password=123456
  • 新建mysql库:MyBatis,新建表TaskAutoExecutePlan

  1. create databases mybatis;
  2.  
  3. create table TaskAutoExecutePlan(
  4. id varchar(64) CHARACTER SET utf8mb4 NOT NULL DEFAULT '',
  5. autoExecutePlanType varchar(36) NOT NULL default '',
  6. taskStatus varchar(36) NOT NULL default '',
  7. createDate datetime not null DEFAULT CURRENT_TIMESTAMP,
  8. modifyDate datetime not null DEFAULT CURRENT_TIMESTAMP)
  • 新建实体类TaskAutoExecutePlan.java

  1. package com.xxx.entity;
  2.  
  3. import java.util.UUID;
  4. import java.util.Date;
  5.  
  6. /**
  7. * Created by Administrator on 2017/2/19.
  8. */
  9. public class TaskAutoExecutePlan {
  10. /**
  11. * create databases mybatis;
  12. *
  13. * create table TaskAutoExecutePlan(
  14. * `id` varchar(36) CHARACTER SET utf8mb4 NOT NULL DEFAULT '0',
  15. * 'autoExecutePlanType' integer default '0',
  16. * 'taskStatus' integer default '0',
  17. * 'createDate' datetime DEFAULT CURRENT_TIMESTAMP,
  18. * 'modifyDate' datetime DEFAULT CURRENT_TIMESTAMP)
  19. * */
  20. private String id=null;
  21. private AutoExecutePlanType autoExecutePlanType;
  22. private TaskStatus taskStatus;
  23. private Date createDate;
  24. private Date modifyDate;
  25.  
  26. public String getId() {
  27. return id;
  28. }
  29.  
  30. public void setId(String id) {
  31. this.id = id;
  32. }
  33.  
  34. public AutoExecutePlanType getAutoExecutePlanType() {
  35. return autoExecutePlanType;
  36. }
  37.  
  38. public void setAutoExecutePlanType(AutoExecutePlanType autoExecutePlanType) {
  39. this.autoExecutePlanType = autoExecutePlanType;
  40. }
  41.  
  42. public TaskStatus getTaskStatus() {
  43. return taskStatus;
  44. }
  45.  
  46. public void setTaskStatus(TaskStatus taskStatus) {
  47. this.taskStatus = taskStatus;
  48. }
  49.  
  50. public Date getCreateDate() {
  51. return createDate;
  52. }
  53.  
  54. public void setCreateDate(Date createDate) {
  55. this.createDate = createDate;
  56. }
  57.  
  58. public Date getModifyDate() {
  59. return modifyDate;
  60. }
  61.  
  62. public void setModifyDate(Date modifyDate) {
  63. this.modifyDate = modifyDate;
  64. }
  65. }

设计到的enum对象包括:

  1. AutoExecutePlanType.java
  1. TaskStatus.java
  1. package com.xxxx.entity;
  2.  
  3. /**
  4. * Created by Administrator on 2017/2/19.<br>
  5. * 任务状态:<br>
  6. * 2:Todo,待处理状态<br>
  7. * 4:Doing,正在处理状态<br>
  8. * 8:Success,已成功处理<br>
  9. * 16:Fail;已失败<br>
  10. * */
  11. public enum TaskStatus {
  12. /**
  13. * 2:Todo,待处理状态
  14. * */
  15. Todo(2),
  16. /**
  17. * 4:Doing,正在处理状态
  18. * */
  19. Doing(4),
  20. /**
  21. * 8:Success,已成功处理
  22. * */
  23. Success(8),
  24. /**
  25. * 16:Fail;已失败
  26. * */
  27. Fail(16);
  28.  
  29. private Integer value;
  30. private TaskStatus(int value){
  31. setValue(value);
  32. }
  33.  
  34. public static TaskStatus valueOf(int value){
  35. switch(value){
  36. case 2:
  37. return Todo;
  38. case 4:
  39. return Doing;
  40. case 8:
  41. return Success;
  42. case 16:
  43. return Fail;
  44. default:
  45. return null;
  46. }
  47. }
  48.  
  49. public Integer getValue() {
  50. return value;
  51. }
  52. private void setValue(int value) {
  53. this.value = value;
  54. }
  55. }

为了实现mybatis映射enum类型需要添加一个每个enum对象的一个mybatis转化处理类.

  1. package com.xxx.entity;
  2.  
  3. import org.apache.ibatis.type.BaseTypeHandler;
  4. import org.apache.ibatis.type.JdbcType;
  5.  
  6. import java.sql.CallableStatement;
  7. import java.sql.PreparedStatement;
  8. import java.sql.ResultSet;
  9. import java.sql.SQLException;
  10.  
  11. /**
  12. * Created by Administrator on 2017/2/20.
  13. */
  14. public class TaskStatusHandler extends BaseTypeHandler<TaskStatus> {
  15. private Class<TaskStatus> type;
  16. private final TaskStatus[] enums;
  17.  
  18. /**
  19. * 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现
  20. *
  21. * @param type 配置文件中设置的转换类
  22. */
  23. public TaskStatusHandler(Class<TaskStatus> type) {
  24. if (type == null)
  25. throw new IllegalArgumentException("Type argument cannot be null");
  26. this.type = type;
  27. this.enums = type.getEnumConstants();
  28. if (this.enums == null)
  29. throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
  30. }
  31.  
  32. @Override
  33. public void setNonNullParameter(PreparedStatement preparedStatement, int i, TaskStatus autoExecutePlanType, JdbcType jdbcType) throws SQLException {
  34. // baseTypeHandler已经帮我们做了parameter的null判断
  35. preparedStatement.setInt(i, autoExecutePlanType.getValue());
  36. }
  37.  
  38. @Override
  39. public TaskStatus getNullableResult(ResultSet resultSet, String s) throws SQLException {
  40. // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
  41. int i = resultSet.getInt(s);
  42.  
  43. if (resultSet.wasNull()) {
  44. return null;
  45. } else { // 根据数据库中的code值,定位EnumStatus子类
  46. return locateEnumStatus(i);
  47. }
  48. }
  49.  
  50. @Override
  51. public TaskStatus getNullableResult(ResultSet resultSet, int i) throws SQLException {
  52. // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
  53. int index = resultSet.getInt(i);
  54. if (resultSet.wasNull()) {
  55. return null;
  56. } else { // 根据数据库中的code值,定位EnumStatus子类
  57. return locateEnumStatus(index);
  58. }
  59. }
  60.  
  61. @Override
  62. public TaskStatus getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
  63. // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
  64. int index = callableStatement.getInt(i);
  65. if (callableStatement.wasNull()) {
  66. return null;
  67. } else {
  68. // 根据数据库中的code值,定位EnumStatus子类
  69. return locateEnumStatus(index);
  70. }
  71. }
  72.  
  73. /**
  74. * 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷
  75. *
  76. * @param code 数据库中存储的自定义code属性
  77. * @return code对应的枚举类
  78. */
  79. private TaskStatus locateEnumStatus(int code) {
  80. for (TaskStatus status : enums) {
  81. if (status.getValue().equals(Integer.valueOf(code))) {
  82. return status;
  83. }
  84. }
  85. throw new IllegalArgumentException("未知的枚举类型:" + code + ",请核对" + type.getSimpleName());
  86. }
  87. }
  • 配置TaskAutoExecutePlan映射文件:

  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="com.xxx.mapper.TaskAutoExecutePlanMapper">
  6. <!--
  7. private UUID id=null;
  8. private AutoExecutePlanType autoExecutePlanType;
  9. private TaskStatus taskStatus;
  10. private Date createDate;
  11. private Date modifyDate;
  12. -->
  13. <resultMap type="TaskAutoExecutePlan" id="TaskAutoExecutePlanResult">
  14. <result column="id" property="id"/>
  15. <result column="autoExecutePlanType" property="autoExecutePlanType" typeHandler="com.xxx.entity.AutoExecutePlanTypeHandler"/>
  16. <result column="taskStatus" property="taskStatus" typeHandler="com.xxx.entity.TaskStatusHandler"/>
  17. <result column="createDate" property="createDate" jdbcType="TIMESTAMP" javaType="java.sql.Timestamp"/>
  18. <result column="modifyDate" property="modifyDate" jdbcType="TIMESTAMP" javaType="java.sql.Timestamp"/>
  19. </resultMap>
  20. <select id="getAll" resultType="TaskAutoExecutePlan" resultMap="TaskAutoExecutePlanResult">
  21. select * from TaskAutoExecutePlan
  22. </select>
  23. <insert id="insert" parameterType="TaskAutoExecutePlan">
  24. <selectKey keyProperty="id" resultType="String" order="BEFORE">
  25. select replace(uuid(),'-','') from dual
  26. </selectKey>
  27. insert into TaskAutoExecutePlan (id,autoExecutePlanType,taskStatus,createDate,modifyDate)
  28. values (#{id,jdbcType=VARCHAR},
  29. #{autoExecutePlanType,jdbcType=BIT,typeHandler=com.xxx.entity.AutoExecutePlanTypeHandler},
  30. #{taskStatus,jdbcType=BIT,typeHandler=com.xxx.entity.TaskStatusHandler},
  31. #{createDate,jdbcType=TIMESTAMP},
  32. #{modifyDate,jdbcType=TIMESTAMP})
  33. </insert>
  34. </mapper>

当涉及到日期操作时,需要注视事项:
在MyBatis映射文件中要表明映射类型:

  1. <!-- jdbcType="TIMESTAMP"入库后保存精确日期为:yyyy-MM-dd HH:mm:ss-->
  2. <result column="CreateDate" jdbcType="TIMESTAMP" property="createDate" javaType="java.sql.Timestamp" />
  3. <!-- jdbcType="DATE"入库后保存精确日期为:yyyy-MM-dd -->
  4. <result column="ModifyDate" jdbcType="DATE" property="modifyDate" javaType="java.util.Date" />

在使用字段的时候也要标明类型#{createDate,jdbcType=TIMESTAMP}、#{modifyDate,jdbcType=DATE}。

  • 编写数据操作接口类TaskAutoExecutePlanMapper.java:

  1. package com.xxx.mapper;
  2.  
  3. import com.xxx.entity.TaskAutoExecutePlan;
  4.  
  5. import java.util.List;
  6.  
  7. /**
  8. * Created by Administrator on 2017/2/17.
  9. */
  10. public interface TaskAutoExecutePlanMapper {
  11. public List<TaskAutoExecutePlan> getAll();
  12. public void insert(TaskAutoExecutePlan taskAutoExecutePlan);
  13.  
  14. }
  • 编写业务类TaskAutoExecutePlanServer.java:

  1. package com.xxx.service;
  2.  
  3. import java.io.InputStream;
  4. import java.util.List;
  5.  
  6. import com.xxx.entity.TaskAutoExecutePlan;
  7. import com.xxx.mapper.TaskAutoExecutePlanMapper;
  8. import org.apache.ibatis.session.SqlSession;
  9. import org.apache.ibatis.session.SqlSessionFactory;
  10. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  11.  
  12. /**
  13. * Created by Administrator on 2017/2/20.
  14. */
  15. public class TaskAutoExecutePlanServer implements TaskAutoExecutePlanMapper {
  16. private final String resource = "resources/mybatis-config.xml";
  17. private SqlSessionFactory factory = null;
  18.  
  19. public TaskAutoExecutePlanServer() {
  20. InputStream is = TaskAutoExecutePlanServer.class.getClassLoader().getResourceAsStream(resource);
  21. factory = new SqlSessionFactoryBuilder().build(is);
  22. }
  23.  
  24. @Override
  25. public List<TaskAutoExecutePlan> getAll() {
  26. SqlSession sqlSession = this.factory.openSession();
  27. List<TaskAutoExecutePlan> result = sqlSession.selectList("com.xxx.mapper.TaskAutoExecutePlanMapper.getAll");
  28. sqlSession.commit();
  29. sqlSession.close();
  30.  
  31. return result;
  32. }
  33.  
  34. @Override
  35. public void insert(TaskAutoExecutePlan taskAutoExecutePlan) {
  36. SqlSession sqlSession = this.factory.openSession();
  37. sqlSession.insert("com.xxx.mapper.TaskAutoExecutePlanMapper.insert",taskAutoExecutePlan);
  38. sqlSession.commit();
  39. sqlSession.close();
  40. }
  41.  
  42. }
  • 测试类Main.java

  1. public static void main(String[] args) {
  2. TaskAutoExecutePlanServer taskAutoExecutePlanServer = new TaskAutoExecutePlanServer();
  3. TaskAutoExecutePlan taskAutoExecutePlan = new TaskAutoExecutePlan();
  4. taskAutoExecutePlan.setId("BC");
  5. taskAutoExecutePlan.setAutoExecutePlanType(AutoExecutePlanType.MxRasterization);
  6. taskAutoExecutePlan.setTaskStatus(TaskStatus.Doing);
  7. taskAutoExecutePlan.setCreateDate(new Date());
  8. taskAutoExecutePlan.setModifyDate(new Date());
  9. taskAutoExecutePlanServer.insert(taskAutoExecutePlan);
  10.  
  11. List<TaskAutoExecutePlan> items = taskAutoExecutePlanServer.getAll();
  12. for (TaskAutoExecutePlan item : items)
  13. System.out.println(item.getId() + "," + item.getAutoExecutePlanType() + "," + item.getTaskStatus() + "," + item.getCreateDate() + "," + item.getModifyDate());
  14.  
  15. Log log = LogUtil.getInstance(MainThread.class);
  16. }

输出结果:

  1. "D:\Program Files\Java\jdk1.8.0_111\bin\java"2017-02-21 01:06:54,465 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.insert!selectKey] - ==> Preparing: select replace(uuid(),'-','') from dual
  2. 2017-02-21 01:06:54,509 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.insert!selectKey] - ==> Parameters:
  3. 2017-02-21 01:06:54,548 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.insert!selectKey] - <== Total: 1
  4. 2017-02-21 01:06:54,549 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.insert] - ==> Preparing: insert into TaskAutoExecutePlan (id,autoExecutePlanType,taskStatus,createDate,modifyDate) values (?, ?, ?, ?, ?)
  5. 2017-02-21 01:06:54,563 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.insert] - ==> Parameters: fa07695af78e11e69fb300fffdc16f2e(String), 256(Integer), 4(Integer), 2017-02-21 01:06:54.124(Timestamp), 2017-02-21 01:06:54.124(Timestamp)
  6. 2017-02-21 01:06:54,565 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.insert] - <== Updates: 1
  7. 2017-02-21 01:06:54,574 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.getAll] - ==> Preparing: select * from TaskAutoExecutePlan
  8. 2017-02-21 01:06:54,575 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.getAll] - ==> Parameters:
  9. 2017-02-21 01:06:54,587 [main] DEBUG [com.xxx.mapper.TaskAutoExecutePlanMapper.getAll] - <== Total: 7
  10. b82e7600f78d11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 00:57:54.0,2017-02-21 00:00:00.0
  11. cc754dacf78d11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 00:58:28.0,2017-02-21 00:58:28.0
  12. 2e6cb0a8f78e11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 01:01:12.0,2017-02-21 01:01:12.0
  13. 3cfe4f81f78e11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 01:01:36.0,2017-02-21 01:01:36.0
  14. 576b7b93f78e11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 01:02:21.0,2017-02-21 01:02:21.0
  15. a5de9916f78e11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 01:04:32.0,2017-02-21 01:04:32.0
  16. fa07695af78e11e69fb300fffdc16f2e,MxRasterization,Doing,2017-02-21 01:06:54.0,2017-02-21 01:06:54.0

MyBatis(一):配置并使用的更多相关文章

  1. Mybatis XML配置

    Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...

  2. MyBatis Cache配置

    @(MyBatis)[Cache] MyBatis Cache配置 MyBatis提供了一级缓存和二级缓存 配置 全局配置 配置 说明 默认值 可选值 cacheEnabled 全局缓存的开关 tru ...

  3. spring和mybatis整合配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  4. SSM ( Spring 、 SpringMVC 和 Mybatis )配置详解

    使用 SSM ( Spring . SpringMVC 和 Mybatis )已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没 ...

  5. Mybatis中配置Mapper的方法

    在这篇文章中我主要想讲一下Mybatis配置文件中mappers元素的配置.关于基础部分的内容可以参考http://haohaoxuexi.iteye.com/blog/1333271. 我们知道在M ...

  6. MyBatis 实践 -配置

    MyBatis 实践 标签: Java与存储 Configuration mybatis-configuration.xml是MyBatis的全局配置文件(文件名任意),其配置内容和顺序如下: pro ...

  7. SpringMVC+Mybatis+MySQL配置Redis缓存

    SpringMVC+Mybatis+MySQL配置Redis缓存 1.准备环境: SpringMVC:spring-framework-4.3.5.RELEASE-dist Mybatis:3.4.2 ...

  8. spring整合mybatis(hibernate)配置

    一.Spring整合配置Mybatis spring整合mybatis可以不需要mybatis-config.xml配置文件,直接通过spring配置文件一步到位.一般需要具备如下几个基本配置. 1. ...

  9. 笔记:MyBatis XML配置详解

    MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息.文档的顶层结构如下: configuration 配置 properties ...

  10. mybatis的配置和使用

    mybatis的配置和使用 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

随机推荐

  1. Android proguard (混淆)

    混淆(Proguard)用法 最近项目中遇到一些混淆相关的问题,由于之前对proguard了解不多,所以每次都是面向Stackoverflow的编程.copy别人的答案内心还可以接受,但是copy了之 ...

  2. 在用jQuery时遇到的小问题

    1. class类名问题? 在我在class ='看看(2)' ,凡是这样的居然给自身加其他style样式,居然添加不上,后来改成其他类名不带括号里的,居然好了. 2. line-height 引入的 ...

  3. 大数据 --> Kafka集群搭建

    Kafka集群搭建 下面是以三台机器搭建为例,(扩展到4台以上一样,修改下配置文件即可) 1.下载kafka http://apache.fayea.com/kafka/0.9.0.1/ ,拷贝到三台 ...

  4. java基础之类与对象

    [类 & 对象] 1.类:具有一系列相同属性(特征)和方法(行为)的个体的集合,称为类. 类是一个抽象的概念,只能说类具有哪些属性,而不能直接对属性进行赋值. 例如:人类有身高的属性,但是不能 ...

  5. Beta 第七天

    今天遇到的困难: 构造新适配器的时候出现了某些崩溃的问题 ListView监听器有部分的Bug 今天完成的任务: 陈甘霖:完成相机调用和图库功能,完成阿尔法项目遗留下来的位置调用问题,实现百度定位 蔡 ...

  6. 四则运算----C++版

    一.设计思想 因java中已做过,就是简单的将java中的语句调换为C++的语句. 二.代码 #include<iostream.h> #include<Stdlib.h> v ...

  7. 软件工程第三次作业-结对作业NO.1

    第一次结对作业 结对人员: 潘伟靖 170320077 张 松 170320079 方案分析 我们对所供的资料进行分析,如下: 从提供的资料可以看出,需要解决的问题以及满足的需求主要有两类目标用户,各 ...

  8. 《Effective Objective-C 2.0》摘要

    前一段时间将<Effective Objective-C 2.0>这本书浏览了一遍,说一下几个觉得比较有意思的知识点. 感觉这本书是ios开发必看的一本书,最基础的,以及稍微高阶一点的oc ...

  9. 【iOS】单元测试

    iOS单元测试(作用及入门提升) 字数1704 阅读16369 评论26 喜欢247 由于只是一些简单实用的东西,学学还是挺不错的.其实单元测试用的好,开发起来也会快很多.单元测试对于我目前来说,就是 ...

  10. defaultdict使用及__missing__理解

    import collections import re WORD_RE = re.compile(r'\w+') index = collections.defaultdict(list) #用li ...