MyBatis注解Annotation介绍及Demo
MyBatis注解Annotation介绍及Demo2014-04-21 17:09:55
MyBatis可以利用SQL映射文件来配置,也可以利用Annotation来设置。MyBatis提供的一些基本注解如下表所示。
|
注解 |
目标 |
相应的XML |
描述 |
|
@CacheNamespace |
类 |
<cache> |
为给定的命名空间(比如类)配置缓存。属性: implemetation,eviction, flushInterval , size 和 readWrite 。 |
|
@CacheNamespaceRef |
类 |
<cacheRef> |
参照另外一个命名空间的缓存来使用。 属性:value,也就是类的完全限定名。 |
|
@ConstructorArgs |
方法 |
<constructor> |
收集一组结果传递给对象构造方法。 属性:value,是形式参数的数组 |
|
@Arg |
方法 |
<arg> <idArg> |
单独的构造方法参数,是ConstructorArgs 集合的一部分。属性:id,column,javaType,typeHandler。 id属性是布尔值,来标识用于比较的属性,和<idArg>XML 元素相似 |
|
@TypeDiscriminator |
方法 |
<discriminator> |
一组实例值被用来决定结果映射的表 现。属性:Column, javaType , jdbcType typeHandler,cases。 cases属性就是实例的数组。 |
|
@Case |
方法 |
<case> |
单独实例的值和它对应的映射。属性:value ,type ,results 。 Results 属性是结果数组,因此这个注解和实际的ResultMap 很相似,由下面的 Results注解指定 |
|
@Results |
方法 |
<resultMap> |
结果映射的列表,包含了一个特别结果 列如何被映射到属性或字段的详情。 属性:value ,是Result注解的数组 |
|
@Result |
方法 |
<result> <id> |
在列和属性或字段之间的单独结果映 射。属性:id ,column , property , javaType ,jdbcType ,type Handler , one,many。id 属性是一个布尔值,表 示了应该被用于比较的属性。one 属性是单独的联系,和 <association> 相似,而many 属性是对集合而言的,和 <collection>相似。 |
|
@One |
方法 |
<association> |
复杂类型的单独属性值映射。属性: select,已映射语句(也就是映射器方 法)的完全限定名,它可以加载合适类 型的实例。注意:联合映射在注解 API 中是不支持的。 |
|
@Many |
方法 |
<collection> |
复杂类型的集合属性映射。属性: select,是映射器方法的完全限定名,它可加载合适类型的一组实例。注意:联合映射在 Java注解中是不支持的。 |
|
@Options |
方法 |
映射语句的属性 |
这个注解提供访问交换和配置选项的宽广范围,它们通常在映射语句上作为属性出现。而不是将每条语句注解变复杂,Options 注解提供连贯清晰的方式来访问它们。属性:useCache=true, flushCache=false, resultSetType=FORWARD_ONLY, statementType=PREPARED, fetchSize= -1,timeout=-1 , useGeneratedKeys=false , keyProperty=”id“。 理解Java 注解是很重要的,因为没有办法来指定“null ”作为值。因此,一旦你使用了 Options注解,语句就受所有默认值的支配。要注意什么样的默认值来避免不期望的行为 |
|
@Insert @Update @Delete |
方法 |
<insert> <update> <delete> |
这些注解中的每一个代表了执行的真实 SQL。它们每一个都使用字符串数组(或单独的字符串)。如果传递的是字符串数组,它们由每个分隔它们的单独空间串联起来。属性:value,这是字符串数组用来组成单独的SQL语句 |
|
@InsertProvider @UpdateProvider @DeleteProvider @SelectProvider |
方法 |
<insert> <update> <delete> <select> 允许创建动态 SQL。 |
这些可选的SQL注解允许你指定一个 类名和一个方法在执行时来返回运行 的SQL。基于执行的映射语句, MyBatis 会实例化这个类,然后执行由 provider 指定的方法. 这个方法可以选择性的接 受参数对象作为它的唯一参数,但是必 须只指定该参数或者没有参数。属性: type,method。type 属性是类的完全限定名。method 是该类中的那个方法名。 |
|
@Param |
参数 |
N/A |
当映射器方法需多个参数,这个注解可以被应用于映射器方法参数来给每个参数一个名字。否则,多参数将会以它们的顺序位置来被命名。比如 #{1},#{2} 等,这是默认的。 使用@Param(“person”),SQL中参数应该被命名为#{person}。 |
这些注解都是运用到传统意义上映射器接口中的方法、类或者方法参数中的。
今天主要介绍两种使用注解的方式。
一种是直接在映射器接口中写SQL语句,一种是利用SqlBuilder来创建SQL再由映射器接口来调用
准备前提:
1,配置常规的MyBatis主配置文件,即各种数据源,别名等设置。在利用注解配置SQL的时候,一般不需要在主配置文件中配置Mapper,个别情况下需要配置。
2,数据库表Blog:
|
1
2
3
4
5
6
7
8
9
|
DROP TABLE IF EXISTS `blog`;CREATE TABLE `blog` ( `id` int(10) NOT NULL auto_increment, `title` varchar(200) NOT NULL, `date` varchar(50) NOT NULL, `authername` varchar(15) NOT NULL, `content` varchar(500) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
数据库表User:
|
1
2
3
4
5
6
7
8
|
DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `userName` varchar(50) default NULL, `userAge` int(11) default NULL, `userAddress` varchar(200) default NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
3,分别写User和Blog对应的JavaBean即setter和getter实体类。
第一种 映射器接口中写SQL语句
映射器接口注解
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
package com.whut.inter;import java.util.List;import org.apache.ibatis.annotations.Delete;import org.apache.ibatis.annotations.Insert;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.annotations.Update;import com.whut.model.User;//最基本的注解CRUDpublic interface IUserDAO { @Select("select *from User") public List<User> retrieveAllUsers(); //注意这里只有一个参数,则#{}中的标识符可以任意取 @Select("select *from User where id=#{idss}") public User retrieveUserById(int id); @Select("select *from User where id=#{id} and userName like #{name}") public User retrieveUserByIdAndName(@Param("id")int id,@Param("name")String names); @Insert("INSERT INTO user(userName,userAge,userAddress) VALUES(#{userName}," + "#{userAge},#{userAddress})") public void addNewUser(User user); @Delete("delete from user where id=#{id}") public void deleteUser(int id); @Update("update user set userName=#{userName},userAddress=#{userAddress}" + " where id=#{id}") public void updateUser(User user);} |
测试代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
package com.whut.test;import java.io.IOException;import java.io.Reader;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import com.whut.inter.IUserDAO;import com.whut.model.User;public class TestUser { private static SqlSessionFactory sqlSessionFactory; private static Reader reader; static { try { Reader reader = Resources.getResourceAsReader("mybatic-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 由于使用了注解,所以在主配置文件没有mapper,需要在代码里显示注册该mapper接口 sqlSessionFactory.getConfiguration().addMapper(IUserDAO.class); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { // testSelectAll(); // testSelectByConditions(); //testAddUser(); //testDeleteUser(); testUpateUser(); } public static void testSelectAll() { // sqlSessionFactory.getConfiguration().addMapper(IUserDAO.class); SqlSession session = sqlSessionFactory.openSession(); try { IUserDAO userDAO = session.getMapper(IUserDAO.class); List<User> users = userDAO.retrieveAllUsers(); System.out.println("用户编号\t" + "姓名\t" + "年龄\t住址"); for (User u : users) { System.out.println(u.getId() + "\t" + u.getUserName() + "\t" + u.getUserAge() + "\t" + u.getUserAddress()); } } finally { session.close(); } } public static void testSelectByConditions() { SqlSession session = sqlSessionFactory.openSession(); try { IUserDAO userDAO = session.getMapper(IUserDAO.class); User u = userDAO.retrieveUserByIdAndName(4, "%spring%"); if (u != null) { System.out.println("用户编号\t" + "姓名\t" + "年龄\t住址"); System.out.println(u.getId() + "\t" + u.getUserName() + "\t" + u.getUserAge() + "\t" + u.getUserAddress()); } } finally { session.close(); } } public static void testAddUser() { User u = new User(); u.setUserName("dongtian"); u.setUserAge(51); u.setUserAddress("hubeisheng"); SqlSession session = sqlSessionFactory.openSession(); try { IUserDAO userDAO = session.getMapper(IUserDAO.class); userDAO.addNewUser(u); session.commit(); } finally { session.close(); } } public static void testDeleteUser() { SqlSession session = sqlSessionFactory.openSession(); try { IUserDAO userDAO = session.getMapper(IUserDAO.class); userDAO.deleteUser(7); session.commit(); } finally { session.close(); } } public static void testUpateUser() { User u = new User(); u.setId(4); u.setUserName("dongtian"); u.setUserAge(51); u.setUserAddress("hubeisheng"); SqlSession session = sqlSessionFactory.openSession(); try { IUserDAO userDAO = session.getMapper(IUserDAO.class); userDAO.updateUser(u); session.commit(); } finally { session.close(); } }} |
第二种 映射器接口调用SqlBuilder生成的SQL进行执行
映射器接口
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
package com.whut.inter;import java.util.List;import org.apache.ibatis.annotations.CacheNamespace;import org.apache.ibatis.annotations.DeleteProvider;import org.apache.ibatis.annotations.InsertProvider;import org.apache.ibatis.annotations.Options;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Result;import org.apache.ibatis.annotations.ResultMap;import org.apache.ibatis.annotations.Results;import org.apache.ibatis.annotations.SelectProvider;import org.apache.ibatis.annotations.UpdateProvider;import org.apache.ibatis.type.JdbcType;import com.whut.model.Blog;import com.whut.sqlTool.BlogSqlProvider;@CacheNamespace(size=100)public interface IBlogDAO { @SelectProvider(type = BlogSqlProvider.class, method = "getSql") @Results(value ={ @Result(id=true, property="id",column="id",javaType=Integer.class,jdbcType=JdbcType.INTEGER), @Result(property="title",column="title",javaType=String.class,jdbcType=JdbcType.VARCHAR), @Result(property="date",column="date",javaType=String.class,jdbcType=JdbcType.VARCHAR), @Result(property="authername",column="authername",javaType=String.class,jdbcType=JdbcType.VARCHAR), @Result(property="content",column="content",javaType=String.class,jdbcType=JdbcType.VARCHAR), }) public Blog getBlog(@Param("id") int id); @SelectProvider(type = BlogSqlProvider.class, method = "getAllSql") @Results(value ={ @Result(id=true, property="id",column="id",javaType=Integer.class,jdbcType=JdbcType.INTEGER), @Result(property="title",column="title",javaType=String.class,jdbcType=JdbcType.VARCHAR), @Result(property="date",column="date",javaType=String.class,jdbcType=JdbcType.VARCHAR), @Result(property="authername",column="authername",javaType=String.class,jdbcType=JdbcType.VARCHAR), @Result(property="content",column="content",javaType=String.class,jdbcType=JdbcType.VARCHAR), }) public List<Blog> getAllBlog(); @SelectProvider(type = BlogSqlProvider.class, method = "getSqlByTitle") @ResultMap(value = "sqlBlogsMap") //这里调用resultMap,这个是SQL配置文件中的,必须该SQL配置文件与本接口有相同的全限定名 //注意文件中的namespace路径必须是使用@resultMap的类路径 public List<Blog> getBlogByTitle(@Param("title")String title); @InsertProvider(type = BlogSqlProvider.class, method = "insertSql") public void insertBlog(Blog blog); @UpdateProvider(type = BlogSqlProvider.class, method = "updateSql") public void updateBlog(Blog blog); @DeleteProvider(type = BlogSqlProvider.class, method = "deleteSql") @Options(useCache = true, flushCache = false, timeout = 10000) public void deleteBlog(int ids); } |
SQL生成器(利用SqlBuilder生成)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
package com.whut.sqlTool;import java.util.Map;import static org.apache.ibatis.jdbc.SqlBuilder.*;public class BlogSqlProvider { private final static String TABLE_NAME = "blog"; public String getSql(Map<Integer, Object> parameter) { BEGIN(); //SELECT("id,title,authername,date,content"); SELECT("*"); FROM(TABLE_NAME); //注意这里这种传递参数方式,#{}与map中的key对应,而map中的key又是注解param设置的 WHERE("id = #{id}"); return SQL(); } public String getAllSql() { BEGIN(); SELECT("*"); FROM(TABLE_NAME); return SQL(); } public String getSqlByTitle(Map<String, Object> parameter) { String title = (String) parameter.get("title"); BEGIN(); SELECT("*"); FROM(TABLE_NAME); if (title != null) WHERE(" title like #{title}"); return SQL(); } public String insertSql() { BEGIN(); INSERT_INTO(TABLE_NAME); VALUES("title", "#{title}"); // VALUES("title", "#{tt.title}"); //这里是传递一个Blog对象的,如果是利用上面tt.方式,则必须利用Param来设置别名 VALUES("date", "#{date}"); VALUES("authername", "#{authername}"); VALUES("content", "#{content}"); return SQL(); } public String deleteSql() { BEGIN(); DELETE_FROM(TABLE_NAME); WHERE("id = #{id}"); return SQL(); } public String updateSql() { BEGIN(); UPDATE(TABLE_NAME); SET("content = #{content}"); WHERE("id = #{id}"); return SQL(); }} |
注意由于在映射器接口中调用了@ResultMap,该注解内容是SQL配置文件ResultMap的ID,它是允许访问SQL配置文件中的ResultMap,则需要在相应的SQL配置相应ResultMap,然后再在主配置文件加上该SQL配置的Mapper路径。并且该SQL配置文件的namespace必须与使用@ResultMap的映射器接口的全限定相同。Blog.xml如下。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.whut.inter.IBlogDAO"> <resultMap type="Blog" id="sqlBlogsMap"> <id property="id" column="id"/> <result property="title" column="title"/> <result property="authername" column="authername"/> <result property="date" column="date"/> <result property="content" column="content"/> </resultMap></mapper> |
再在主配置文件mybatis-config.xml加入一句mapper。
|
1
2
3
|
<mappers> <mapper resource="com/whut/model/Blog.xml"/></mappers> |
测试类
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
package com.whut.test;import java.io.IOException;import java.io.Reader;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import com.whut.inter.IBlogDAO;import com.whut.model.Blog;/** * 注意这里是一种利用SqlBuilder以及多种设置来注解使用 * @author zxl * */public class TestBlog { private static SqlSessionFactory sqlSessionFactory; private static Reader reader; static { try { Reader reader = Resources.getResourceAsReader("mybatic-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 由于使用了注解,所以在主配置文件没有mapper,需要在代码里显示注册该mapper接口 //sqlSessionFactory.getConfiguration().addMapper(IBlogDAO.class); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { //testOneBlog(); //testAllBlog(); //testBlogByTitle(); //testAddBlog(); //testDeleteBlog(); testUpdateBlog(); } public static void testOneBlog() { SqlSession session=sqlSessionFactory.openSession(); try{ IBlogDAO dao=session.getMapper(IBlogDAO.class); Blog blog=dao.getBlog(2); System.out.println(blog.getId()+"\t"+blog.getAuthername()+"\t"+blog.getTitle()); }finally{ session.close(); } } public static void testAllBlog() { SqlSession session=sqlSessionFactory.openSession(); try{ IBlogDAO dao=session.getMapper(IBlogDAO.class); List<Blog> blogs=dao.getAllBlog(); System.out.println("编号\t作者\t标题"); for(Blog blog:blogs) System.out.println(blog.getId()+"\t"+blog.getAuthername()+"\t"+blog.getTitle()); }finally{ session.close(); } } public static void testBlogByTitle() { SqlSession session=sqlSessionFactory.openSession(); try{ IBlogDAO dao=session.getMapper(IBlogDAO.class); List<Blog> blogs=dao.getBlogByTitle("%word%"); System.out.println("编号\t作者\t标题"); for(Blog blog:blogs) System.out.println(blog.getId()+"\t"+blog.getAuthername()+"\t"+blog.getTitle()); }finally{ session.close(); } } public static void testAddBlog() { SqlSession session=sqlSessionFactory.openSession(); Blog blog=new Blog(); blog.setTitle("chuntian"); blog.setAuthername("xiaohua"); blog.setDate("2013/12/25"); blog.setContent("bushuangyayya"); try{ IBlogDAO dao=session.getMapper(IBlogDAO.class); dao.insertBlog(blog); session.commit(); }finally{ session.close(); } } public static void testDeleteBlog() { SqlSession session=sqlSessionFactory.openSession(); try{ IBlogDAO dao=session.getMapper(IBlogDAO.class); dao.deleteBlog(5); session.commit(); }finally{ session.close(); } } public static void testUpdateBlog() { SqlSession session=sqlSessionFactory.openSession(); Blog blog=new Blog(); blog.setId(6); blog.setTitle("daxuexiaoyuan"); blog.setAuthername("xiaohua"); blog.setDate("2013/2/25"); blog.setContent("冷死了"); try{ IBlogDAO dao=session.getMapper(IBlogDAO.class); dao.updateBlog(blog); session.commit(); }finally{ session.close(); } }} |
注意事项:
1) 在利用注解配置映射器接口的时候,必须要通过
sqlSessionFactory.getConfiguration().addMapper(IBlogDAO.class);来对给映射器接口注册,如果映射器接口中使用了@ResultMap注解,则由于已经在mybatis-config.xml配置了Mapper,则就不需要再次在代码中添加mapper。
2)当方法有多个参数的时候,为了与SQL语句中的#{}对应,一般可以使用@Param("")来为每个参数命别名,使得该别名与#{}对应。当参数只有一个的时候,不需要别名。
3 在进行更新删除添加的时候,如果传递的是一个实体对象,则SQL可以直接使用实体的属性。
4)映射器接口调用SqlBuilder中的方法,都是将参数转换为Map中的key,可以在SqlBuilder的方法中利用Map来获取传递的参数值,进而进行逻辑操作判断。
5)注解中对于返回多条记录的查询可以直接利用@Results和@Result来配置映射,或者利用@ResultMap来调用SQL配置文件中的ResultMap。
本文出自 “在云端的追梦” 博客,请务必保留此出处http://computerdragon.blog.51cto.com/6235984/1399742
MyBatis注解Annotation介绍及Demo的更多相关文章
- MyBatis注解Annotation介绍及Demo(转)
MyBatis可以利用SQL映射文件来配置,也可以利用Annotation来设置.MyBatis提供的一些基本注解如下表所示. 注解 目标 相应的XML 描述 @CacheNamespace 类 &l ...
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 | 被围观 25,969 views+ 1.Anno ...
- 注解【介绍、基本Annotation、元Anntation、自定义注解、注入基本信息、对象】
什么是注解? 注解:Annotation-. 注解其实就是代码中的特殊标记,这些标记可以在编译.类加载.运行时被读取,并执行相对应的处理. 为什么我们需要用到注解? 传统的方式,我们是通过配置文件(x ...
- mybatis 注解快速上手
一.mybatis 简单注解 关键注解词 : @Insert : 插入sql , 和xml insert sql语法完全一样 @Select : 查询sql, 和xml select sql语法完全一 ...
- SpringBoot使用Mybatis注解开发教程-分页-动态sql
代码示例可以参考个人GitHub项目kingboy-springboot-data 一.环境配置 1.引入mybatis依赖 compile( //SpringMVC 'org.springframe ...
- Java注解Annotation(一)
Java注解Annotation(一)——简介 这一章首先简单介绍一下注解,下一章会给出一个注解应用的DEMO. 1. 元注解 元注解的作用是负责注解其他的注解. JDK1.5中,定义了4个标准的me ...
- Android 自定义注解(Annotation)
现在市面上很多框架都有使用到注解,比如butterknife库.EventBus库.Retrofit库等等.也是一直好奇他们都是怎么做到的,注解的工作原理是啥.咱们能不能自己去实现一个简单的注解呢. ...
- SpringBoot 2.x (9):整合Mybatis注解实战
SSM框架再熟悉不过了,不过以前通常是使用XML写SQL语句 这里用SpringBoot整合Mybatis并且使用注解进行开发 依赖: <!-- Mybatis --> <depen ...
- springboot整合mybatis(注解)
springboot整合mybatis(注解) 1.pom.xml: <?xml version="1.0" encoding="UTF-8"?> ...
随机推荐
- servlet映射路径
1 访问映射过程 问题:访问URL:http://localhost:8080/day10/first ,服务器如何相应的? 前提: tomcat服务器启动时,首先加载webapps中的每个web应 ...
- 读写INI文件操作类
详情介绍:http://zh.wikipedia.org/wiki/INI%E6%96%87%E4%BB%B6 示例: 下面是一个虚拟的程序,其INI文件有两个小节,前面的小节是用来设置拥有者的信息, ...
- PAT 1052 卖个萌
https://pintia.cn/problem-sets/994805260223102976/problems/994805273883951104 萌萌哒表情符号通常由“手”.“眼”.“口”三 ...
- 关于已部署的WCF服务升级的问题
在日常的开发过程中,我们会经常迭代发布不同的版本,所以WCF服务的接口也会经常处于变动的状态,比如在传递实体类中新加一个字段.修改参数名称等等关于服务升级的问题.但是我们不可能让已发布的版本重新引用新 ...
- c++:error2019,无法解析的外部命令blabla~
出现这个原因的问题汇总: 1,相应的附加库没有包含进去,注意附加库的目录是 / 2,函数没有与之对应的类,却在main中以某一类的对象调用了该方法. 其实,当错误中显示fun()成为无法解析的外部命令 ...
- C++面向对象编程,继承,数据抽象,动态绑定
派生类(derived class)能够继承基类(base class )定义的成员: 1).派生类可以无需改变而使用那些与派生类具体特性不相关的操作 2).可以重新定义那些与派生类相关的成员函数,将 ...
- bzoj2257[POI2011]Programming Contest
首先可以费用流建图,左边一堆点表示人,右边一堆点表示题,源点向每个人连floor(t/r)条边,费用依次为r,2r,3r….然后写了一个卡不过去,动态加边也卡不过去,然后我想:这里一定有一些不为人知的 ...
- 【bzoj3754】Tree之最小方差树 最小生成树
题目描述 给出一张无向图,求它的一棵生成树,使得选出的所有边的方差最小.输出这个最小方差. 输入 第一行两个正整数N,M 接下来M行,每行三个正整数Ui,Vi,Ci N<=100,M<=2 ...
- HDFS文件操作命令手册
HDFS文件操作的基本格式是: bin/hadoop dfs -cmd <args> 1. cat $ hadoop dfs -cat URI [URI …] #将参数所指示的文件的内容输 ...
- 【题解】CQOI2012局部最小值
上课讲的一道题,感觉也挺厉害的~正解是容斥 + 状压dp.首先我们容易发现一共可能的局部最小值数量是十分有限的,最多也只有 \(8\) 个.所以我们可以考虑状压. 建立出状态 \(f[i][j]\) ...