guanxf

          我的博客:http://blog.sina.com.cn/17learning

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            71 隨筆 :: 1 文章 :: 41 評(píng)論 :: 0 Trackbacks

          2014年10月20日 #


          createTree(1, orgNodeTree, sameOrgNodes, 0);


          @NoArgsConstructor
          @AllArgsConstructor
          @Getter
          @Setter
          public class NodeTree {
          private String pName;
          private String name;
          private int level;
          private List<NodeTree> children;
          }

          private void createTree(int leave, int ind, Map<String, NodeTree> pIndexNodeNameMap, List<NodeVo> childNodes) {
          Map<String, NodeTree> cIndexNodeNameMap = new HashMap();
          //構(gòu)建樹(shù)
          int treeNo = pIndexNodeNameMap.size();
          if (treeNo == 0) {
          return;
          }
          int group = 0;
          for (int i = ind; i < childNodes.size(); i++) {
          NodeVo node = childNodes.get(i);
          long index = node.getId() % treeNo;
          NodeTree pNode = pIndexNodeNameMap.get(index + "");
          List<NodeTree> children = pNode.getChildren();
          if (CollectionUtils.isEmpty(children)) {
          children = new ArrayList();
          }
          if (children.size() > 2) {
          leave++;
          createTree(leave, i, cIndexNodeNameMap, childNodes);
          break;
          } else {
          NodeTree child = new NodeTree();
          child.setLevel(leave);
          child.setPName(pNode.getName());
          child.setName(node.getNodeName());
          children.add(child);
          pNode.setChildren(children);
          cIndexNodeNameMap.put(group + "", child);
          group++;
          }
          }
          }


          private boolean createTree(int level, List<NodeTree> parentNodes, List<NodeVo> childNodes, int beginIndex) {
          //構(gòu)建樹(shù)
          List<NodeTree> nextLevelNodes = new ArrayList<>();
          for (int i = beginIndex; i < childNodes.size(); i++) {
          int parentCount = 1;
          for (NodeTree pNode : parentNodes) {
          List<NodeTree> children = pNode.getChildren();
          if (CollectionUtils.isEmpty(children)) {
          children = new ArrayList();
          pNode.setChildren(children);
          }
          if (children.size() >= 3) {
          if(parentCount >= parentNodes.size()){
          return createTree(++level, nextLevelNodes, childNodes, beginIndex);
          }
          } else {
          if (beginIndex >= childNodes.size()) {
          return true;
          }
          NodeTree child = new NodeTree();
          child.setLevel(level);
          child.setPName(pNode.getName());
          NodeVo node = childNodes.get(beginIndex);
          child.setName(node.getNodeName());
          pNode.getChildren().add(child);
          nextLevelNodes.add(child);
          beginIndex++;
          }
          parentCount++;
          }
          }
          return true;
          }
          posted @ 2020-09-07 09:56 管先飛 閱讀(263) | 評(píng)論 (0)編輯 收藏

          執(zhí)行命名:
          git pull github master --allow-unrelated-histories

          執(zhí)行結(jié)果如下:

          E:\WorkSpace\workspaceJ2ee\abocode\jfaster>git pull github master --allow-unrelated-histories
          remote: Counting objects: 3, done.
          remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
          Unpacking objects: 100% (3/3), done.
          From https://github.com/abocode/jfaster
           * branch            master     -> FETCH_HEAD
           * [new branch]      master     -> github/master
          Merge made by the 'recursive' strategy.
           .gitattributes | 3 +++
           1 file changed, 3 insertions(+)
           create mode 100644 .gitattributes
          posted @ 2018-05-20 12:30 管先飛 閱讀(326) | 評(píng)論 (0)編輯 收藏

          進(jìn)入“控制面板”——“用戶(hù)賬戶(hù)”-憑據(jù)管理器——windows憑據(jù)

          找到了git的用戶(hù)名密碼。修改正確后ok

          posted @ 2018-05-20 12:29 管先飛 閱讀(277) | 評(píng)論 (0)編輯 收藏

          元注解:

            元注解的作用就是負(fù)責(zé)注解其他注解。Java5.0定義了4個(gè)標(biāo)準(zhǔn)的meta-annotation類(lèi)型,它們被用來(lái)提供對(duì)其它 annotation類(lèi)型作說(shuō)明。Java5.0定義的元注解:
              1.@Target,
              2.@Retention,
              3.@Documented,
              4.@Inherited

            這些類(lèi)型和它們所支持的類(lèi)在java.lang.annotation包中可以找到。下面我們看一下每個(gè)元注解的作用和相應(yīng)分參數(shù)的使用說(shuō)明。
          以下為一個(gè)簡(jiǎn)單場(chǎng)景的應(yīng)用:
           1.定義注解:
             
          @Target(TYPE)
          @Retention(RUNTIME)
          public @interface Table {
          /**
          * (Optional) The name of the table.
          * <p/>
          * Defaults to the entity name.
          */
          String name() default "";
          }
          @Target({METHOD, FIELD})
          @Retention(RUNTIME)
          public @interface Column {

          /**
          * (Optional) The name of the column. Defaults to
          * the property or field name.
          */
          String name() default "";
          }
          2、定義實(shí)體類(lèi):
            

          @Table(name = "t_s_user")
          public class User {
          @Column(name="name")
          private String name;

          @Column(name="pwd")
          private String pwd;

          public String getName() {
          return name;
          }

          public void setName(String name) {
          this.name = name;
          }

          public String getPwd() {
          return pwd;
          }

          public void setPwd(String pwd) {
          this.pwd = pwd;
          }
          }

          3、運(yùn)行:

          public static void print() {
          System.out.println("table's name" + User.class.getAnnotation(Table.class).name());
          Field[] fields = User.class.getDeclaredFields();
          for (int i = 0; i < fields.length; i++) {
          Field field = fields[i];
          System.out.println("field's type:" + field.getType().getName());
          System.out.println("field's columnName:" + field.getAnnotation(Column.class).name());
          }
          }

          關(guān)于注解的詳細(xì)介紹:http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
          posted @ 2016-08-18 20:42 管先飛 閱讀(2850) | 評(píng)論 (0)編輯 收藏

          1.選擇:File->project structure->libraries

          2.左上角選擇添加,選擇添加java(還提供了添加maven項(xiàng)目),然后選擇所需要的目錄:

          3.idea 會(huì)提示選擇添加什么類(lèi)型的文件,我們是單純的文件,所以選擇classes

             

           
          posted @ 2016-04-29 15:42 管先飛 閱讀(1711) | 評(píng)論 (0)編輯 收藏

          nginx 反向代理到 apache
          server {
                  listen       80;
                  server_name  app.haeee.com;
          index index.html index.htm index.php;
             root /alidata/www/movie-app;
               error_page 404 500 502 503 504 http://app.haeee.com; 
          location ~ .*\.(php|php5)?$
          {
          #fastcgi_pass  unix:/tmp/php-cgi.sock;
          fastcgi_pass  127.0.0.1:9000;
          fastcgi_index index.php;
          include fastcgi.conf;
          }
          location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
          {
          expires 30d;
          }
          location ~ .*\.(js|css)?$
          {
          expires 1h;
          }
          #偽靜態(tài)規(guī)則
          #include /alidata/server/nginx/conf/rewrite/phpwind.conf;
          access_log  /alidata/log/nginx/access/movie-app.log;
          }

          nginx 反向代理到 tomcat
          server {
              listen   80;
              server_name  hulasou.com www.hulasou.com;
          index index.html index.htm index.jsp;
          #location ~ .*\.(jsp)?$
          location /{      
          index index.jsp;
                  proxy_pass http://localhost:8181;
          }
          #偽靜態(tài)規(guī)則
          include /alidata/server/nginx/conf/rewrite/uuxiaohua.conf;
          access_log  /alidata/log/nginx/access/uuxiaohua.log;
          }
          posted @ 2016-01-19 17:46 管先飛 閱讀(415) | 評(píng)論 (0)編輯 收藏

          1、修改啟動(dòng)項(xiàng):
          @SpringBootApplication
          @ComponentScan
          @Import({DBConfiguration.class, ResourceConfiguration.class,AppConfiguration.class})
          public class Application extends SpringBootServletInitializer {
          @Override
          protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
          return application.sources(Application.class);
          }
          2、修改pom文件:
              修改packaging
              <packaging>war</packaging>
            加入打包到tomcat的配置:
          <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
          <scope>provided</scope>
          </dependency>
          <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-legacy</artifactId>
          <version>1.0.2.RELEASE</version>
          </dependency>

          <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.0.1</version>
          </dependency>
          <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.0.1</version>
          </dependency>

          <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.1</version>
          </dependency>

          3、如果不需要JMX在application.properties文件中加入配置項(xiàng):
          endpoints.jmx.uniqueNames=true
          或者直接關(guān)閉:
           endpoints.jmx.enabled=false
          posted @ 2016-01-14 17:21 管先飛 閱讀(6572) | 評(píng)論 (1)編輯 收藏

          spring data 系列一直是開(kāi)發(fā)者追捧的熱潮,而官方并未出spring data  jdbc,國(guó)外一個(gè)開(kāi)發(fā)者讓我們看到了福音,文檔如下供大家共同學(xué)習(xí)。

          Build Status Maven Central

          Spring Data JDBC generic DAO implementation

          The purpose of this project is to provide generic, lightweight and easy to use DAO implementation for relational databases based on JdbcTemplate from Spring framework, compatible with Spring Data umbrella of projects.

          Design objectives

          • Lightweight, fast and low-overhead. Only a handful of classes, no XML, annotations, reflection
          • This is not full-blown ORM. No relationship handling, lazy loading, dirty checking, caching
          • CRUD implemented in seconds
          • For small applications where JPA is an overkill
          • Use when simplicity is needed or when future migration e.g. to JPA is considered
          • Minimalistic support for database dialect differences (e.g. transparent paging of results)

          Features

          Each DAO provides built-in support for:

          • Mapping to/from domain objects through RowMapper abstraction
          • Generated and user-defined primary keys
          • Extracting generated key
          • Compound (multi-column) primary keys
          • Immutable domain objects
          • Paging (requesting subset of results)
          • Sorting over several columns (database agnostic)
          • Optional support for many-to-one relationships
          • Supported databases (continuously tested):
            • MySQL
            • PostgreSQL
            • H2
            • HSQLDB
            • Derby
            • MS SQL Server (2008, 2012)
            • Oracle 10g / 11g (9i should work too)
            • ...and most likely many others
          • Easily extendable to other database dialects via SqlGenerator class.
          • Easy retrieval of records by ID

          API

          Compatible with Spring Data PagingAndSortingRepository abstraction, all these methods are implemented for you:

          public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
           T  save(T entity);
          Iterable<T> save(Iterable<? extends T> entities);
           T  findOne(ID id);
          boolean exists(ID id);
          Iterable<T> findAll();
             long count();
             void delete(ID id);
             void delete(T entity);
             void delete(Iterable<? extends T> entities);
             void deleteAll();
          Iterable<T> findAll(Sort sort);
          Page<T> findAll(Pageable pageable);
          Iterable<T> findAll(Iterable<ID> ids);
          }
          

          Pageable and Sort parameters are also fully supported, which means you get paging and sorting by arbitrary properties for free. For example say you have userRepository extending PagingAndSortingRepository<User, String> interface (implemented for you by the library) and you request 5th page of USERS table, 10 per page, after applying some sorting:

          Page<User> page = userRepository.findAll(
          new PageRequest(
          5, 10, 
          new Sort(
          new Order(DESC, "reputation"), 
          new Order(ASC, "user_name")
          )
          )
          );
          

          Spring Data JDBC repository library will translate this call into (PostgreSQL syntax):

          SELECT *
          FROM USERS
          ORDER BY reputation DESC, user_name ASC
          LIMIT 50 OFFSET 10
          

          ...or even (Derby syntax):

          SELECT * FROM (
          SELECT ROW_NUMBER() OVER () AS ROW_NUM, t.*
          FROM (
          SELECT * 
          FROM USERS 
          ORDER BY reputation DESC, user_name ASC
          ) AS t
          ) AS a 
          WHERE ROW_NUM BETWEEN 51 AND 60
          

          No matter which database you use, you'll get Page<User> object in return (you still have to provide RowMapper<User> yourself to translate from ResultSet to domain object). If you don't know Spring Data project yet, Page<T> is a wonderful abstraction, not only encapsulating List<T>, but also providing metadata such as total number of records, on which page we currently are, etc.

          Reasons to use

          • You consider migration to JPA or even some NoSQL database in the future.

            Since your code will rely only on methods defined in PagingAndSortingRepository and CrudRepository from Spring Data Commons umbrella project you are free to switch from JdbcRepository implementation (from this project) to: JpaRepository, MongoRepository, GemfireRepository or GraphRepository. They all implement the same common API. Of course don't expect that switching from JDBC to JPA or MongoDB will be as simple as switching imported JAR dependencies - but at least you minimize the impact by using same DAO API.

          • You need a fast, simple JDBC wrapper library. JPA or even MyBatis is an overkill

          • You want to have full control over generated SQL if needed

          • You want to work with objects, but don't need lazy loading, relationship handling, multi-level caching, dirty checking... You need CRUD and not much more

          • You want to by DRY

          • You are already using Spring or maybe even JdbcTemplate, but still feel like there is too much manual work

          • You have very few database tables

          Getting started

          For more examples and working code don't forget to examine project tests.

          Prerequisites

          Maven coordinates:

          <dependency>
          <groupId>com.nurkiewicz.jdbcrepository</groupId>
          <artifactId>jdbcrepository</artifactId>
          <version>0.4</version>
          </dependency>
          

          This project is available under maven central repository.

          Alternatively you can download source code as ZIP.


          In order to start your project must have DataSource bean present and transaction management enabled. Here is a minimal MySQL configuration:

          @EnableTransactionManagement
          @Configuration
          public class MinimalConfig {
          @Bean
          public PlatformTransactionManager transactionManager() {
          return new DataSourceTransactionManager(dataSource());
          }
          @Bean
          public DataSource dataSource() {
          MysqlConnectionPoolDataSource ds = new MysqlConnectionPoolDataSource();
          ds.setUser("user");
          ds.setPassword("secret");
          ds.setDatabaseName("db_name");
          return ds;
          }
          }
          

          Entity with auto-generated key

          Say you have a following database table with auto-generated key (MySQL syntax):

          CREATE TABLE COMMENTS (
          id INT AUTO_INCREMENT,
          user_name varchar(256),
          contents varchar(1000),
          created_time TIMESTAMP NOT NULL,
          PRIMARY KEY (id)
          );
          

          First you need to create domain object User mapping to that table (just like in any other ORM):

          public class Comment implements Persistable<Integer> {
          private Integer id;
          private String userName;
          private String contents;
          private Date createdTime;
          @Override
          public Integer getId() {
          return id;
          }
          @Override
          public boolean isNew() {
          return id == null;
          }
          //getters/setters/constructors/...
          }
          

          Apart from standard Java boilerplate you should notice implementing Persistable<Integer> where Integer is the type of primary key. Persistable<T> is an interface coming from Spring Data project and it's the only requirement we place on your domain object.

          Finally we are ready to create our CommentRepository DAO:

          @Repository
          public class CommentRepository extends JdbcRepository<Comment, Integer> {
          public CommentRepository() {
          super(ROW_MAPPER, ROW_UNMAPPER, "COMMENTS");
          }
          public static final RowMapper<Comment> ROW_MAPPER = //see below
          private static final RowUnmapper<Comment> ROW_UNMAPPER = //see below
          @Override
          protected <S extends Comment> S postCreate(S entity, Number generatedId) {
          entity.setId(generatedId.intValue());
          return entity;
          }
          }
          

          First of all we use @Repository annotation to mark DAO bean. It enables persistence exception translation. Also such annotated beans are discovered by CLASSPATH scanning.

          As you can see we extend JdbcRepository<Comment, Integer> which is the central class of this library, providing implementations of all PagingAndSortingRepository methods. Its constructor has three required dependencies: RowMapper, RowUnmapper and table name. You may also provide ID column name, otherwise default "id" is used.

          If you ever used JdbcTemplate from Spring, you should be familiar with RowMapper interface. We need to somehow extract columns from ResultSet into an object. After all we don't want to work with raw JDBC results. It's quite straightforward:

          public static final RowMapper<Comment> ROW_MAPPER = new RowMapper<Comment>() {
          @Override
          public Comment mapRow(ResultSet rs, int rowNum) throws SQLException {
          return new Comment(
          rs.getInt("id"),
          rs.getString("user_name"),
          rs.getString("contents"),
          rs.getTimestamp("created_time")
          );
          }
          };
          

          RowUnmapper comes from this library and it's essentially the opposite of RowMapper: takes an object and turns it into a Map. This map is later used by the library to construct SQL CREATE/UPDATE queries:

          private static final RowUnmapper<Comment> ROW_UNMAPPER = new RowUnmapper<Comment>() {
          @Override
          public Map<String, Object> mapColumns(Comment comment) {
          Map<String, Object> mapping = new LinkedHashMap<String, Object>();
          mapping.put("id", comment.getId());
          mapping.put("user_name", comment.getUserName());
          mapping.put("contents", comment.getContents());
          mapping.put("created_time", new java.sql.Timestamp(comment.getCreatedTime().getTime()));
          return mapping;
          }
          };
          

          If you never update your database table (just reading some reference data inserted elsewhere) you may skip RowUnmapper parameter or use MissingRowUnmapper.

          Last piece of the puzzle is the postCreate() callback method which is called after an object was inserted. You can use it to retrieve generated primary key and update your domain object (or return new one if your domain objects are immutable). If you don't need it, just don't override postCreate().

          Check out JdbcRepositoryGeneratedKeyTest for a working code based on this example.

          By now you might have a feeling that, compared to JPA or Hibernate, there is quite a lot of manual work. However various JPA implementations and other ORM frameworks are notoriously known for introducing significant overhead and manifesting some learning curve. This tiny library intentionally leaves some responsibilities to the user in order to avoid complex mappings, reflection, annotations... all the implicitness that is not always desired.

          This project is not intending to replace mature and stable ORM frameworks. Instead it tries to fill in a niche between raw JDBC and ORM where simplicity and low overhead are key features.

          Entity with manually assigned key

          In this example we'll see how entities with user-defined primary keys are handled. Let's start from database model:

          CREATE TABLE USERS (
          user_name varchar(255),
          date_of_birth TIMESTAMP NOT NULL,
          enabled BIT(1) NOT NULL,
          PRIMARY KEY (user_name)
          );
          

          ...and User domain model:

          public class User implements Persistable<String> {
          private transient boolean persisted;
          private String userName;
          private Date dateOfBirth;
          private boolean enabled;
          @Override
          public String getId() {
          return userName;
          }
          @Override
          public boolean isNew() {
          return !persisted;
          }
          public void setPersisted(boolean persisted) {
          this.persisted = persisted;
          }
          //getters/setters/constructors/...
          }
          

          Notice that special persisted transient flag was added. Contract of [CrudRepository.save()](http://static.springsource.org/spring-data/data-commons/docs/current/api/org/springframework/data/repository/CrudRepository.html#save(S)) from Spring Data project requires that an entity knows whether it was already saved or not (isNew()) method - there are no separate create() and update() methods. Implementing isNew() is simple for auto-generated keys (see Comment above) but in this case we need an extra transient field. If you hate this workaround and you only insert data and never update, you'll get away with return true all the time from isNew().

          And finally our DAO, UserRepository bean:

          @Repository
          public class UserRepository extends JdbcRepository<User, String> {
          public UserRepository() {
          super(ROW_MAPPER, ROW_UNMAPPER, "USERS", "user_name");
          }
          public static final RowMapper<User> ROW_MAPPER = //...
          public static final RowUnmapper<User> ROW_UNMAPPER = //...
          @Override
          protected <S extends User> S postUpdate(S entity) {
          entity.setPersisted(true);
          return entity;
          }
          @Override
          protected <S extends User> S postCreate(S entity, Number generatedId) {
          entity.setPersisted(true);
          return entity;
          }
          }
          

          "USERS" and "user_name" parameters designate table name and primary key column name. I'll leave the details of mapper and unmapper (see source code). But please notice postUpdate() and postCreate() methods. They ensure that once object was persisted, persisted flag is set so that subsequent calls to save() will update existing entity rather than trying to reinsert it.

          Check out JdbcRepositoryManualKeyTest for a working code based on this example.

          Compound primary key

          We also support compound primary keys (primary keys consisting of several columns). Take this table as an example:

          CREATE TABLE BOARDING_PASS (
          flight_no VARCHAR(8) NOT NULL,
          seq_no INT NOT NULL,
          passenger VARCHAR(1000),
          seat CHAR(3),
          PRIMARY KEY (flight_no, seq_no)
          );
          

          I would like you to notice the type of primary key in Persistable<T>:

          public class BoardingPass implements Persistable<Object[]> {
          private transient boolean persisted;
          private String flightNo;
          private int seqNo;
          private String passenger;
          private String seat;
          @Override
          public Object[] getId() {
          return pk(flightNo, seqNo);
          }
          @Override
          public boolean isNew() {
          return !persisted;
          }
          //getters/setters/constructors/...
          }
          

          Unfortunately library does not support small, immutable value classes encapsulating all ID values in one object (like JPA does with @IdClass), so you have to live with Object[] array. Defining DAO class is similar to what we've already seen:

          public class BoardingPassRepository extends JdbcRepository<BoardingPass, Object[]> {
          public BoardingPassRepository() {
          this("BOARDING_PASS");
          }
          public BoardingPassRepository(String tableName) {
          super(MAPPER, UNMAPPER, new TableDescription(tableName, null, "flight_no", "seq_no")
          );
          }
          public static final RowMapper<BoardingPass> ROW_MAPPER = //...
          public static final RowUnmapper<BoardingPass> UNMAPPER = //...
          }
          

          Two things to notice: we extend JdbcRepository<BoardingPass, Object[]> and we provide two ID column names just as expected: "flight_no", "seq_no". We query such DAO by providing both flight_no and seq_no (necessarily in that order) values wrapped by Object[]:

          BoardingPass pass = boardingPassRepository.findOne(new Object[] {"FOO-1022", 42});
          

          No doubts, this is cumbersome in practice, so we provide tiny helper method which you can statically import:

          import static com.nurkiewicz.jdbcrepository.JdbcRepository.pk;
          //...
          BoardingPass foundFlight = boardingPassRepository.findOne(pk("FOO-1022", 42));
          

          Check out JdbcRepositoryCompoundPkTest for a working code based on this example.

          Transactions

          This library is completely orthogonal to transaction management. Every method of each repository requires running transaction and it's up to you to set it up. Typically you would place @Transactional on service layer (calling DAO beans). I don't recommend placing @Transactional over every DAO bean.

          Caching

          Spring Data JDBC repository library is not providing any caching abstraction or support. However adding @Cacheable layer on top of your DAOs or services using caching abstraction in Spring is quite straightforward. See also: @Cacheable overhead in Spring.

          Contributions

          ..are always welcome. Don't hesitate to submit bug reports and pull requests.

          Testing

          This library is continuously tested using Travis (Build Status). Test suite consists of 60+ distinct tests each run against 8 different databases: MySQL, PostgreSQL, H2, HSQLDB and Derby + MS SQL Server and Oracle tests not run as part of CI.

          When filling bug reports or submitting new features please try including supporting test cases. Each pull request is automatically tested on a separate branch.

          Building

          After forking the official repository building is as simple as running:

          $ mvn install
          

          You'll notice plenty of exceptions during JUnit test execution. This is normal. Some of the tests run against MySQL and PostgreSQL available only on Travis CI server. When these database servers are unavailable, whole test is simply skipped:

          Results :
          Tests run: 484, Failures: 0, Errors: 0, Skipped: 295
          

          Exception stack traces come from root AbstractIntegrationTest.

          Design

          Library consists of only a handful of classes, highlighted in the diagram below (source):

          UML diagram

          JdbcRepository is the most important class that implements all PagingAndSortingRepository methods. Each user repository has to extend this class. Also each such repository must at least implement RowMapper and RowUnmapper (only if you want to modify table data).

          SQL generation is delegated to SqlGenerator. PostgreSqlGenerator. and DerbySqlGenerator are provided for databases that don't work with standard generator.

          Changelog

          0.4.1

          0.4

          • Repackaged: com.blogspot.nurkiewicz -> com.nurkiewicz

          0.3.2

          • First version available in Maven central repository
          • Upgraded Spring Data Commons 1.6.1 -> 1.8.0

          0.3.1

          0.3

          0.2

          0.1

          License

          This project is released under version 2.0 of the Apache License (same as Spring framework).

          posted @ 2015-12-28 23:48 管先飛 閱讀(4112) | 評(píng)論 (2)編輯 收藏

          Idea是目前最好的開(kāi)發(fā)工具,經(jīng)收集及整理如下常用快捷鍵: 
          一、常用快捷鍵:
           

               
            1.常用操作:
                 Ctrl+E,可以顯示最近編輯的文件列表
            Shift+Click可以關(guān)閉文件
            Ctrl+[或]可以跳到大括號(hào)的開(kāi)頭結(jié)尾
            Ctrl+Shift+Backspace可以跳轉(zhuǎn)到上次編輯的地方
            Ctrl+F12,可以顯示當(dāng)前文件的結(jié)構(gòu)
            Ctrl+F7可以查詢(xún)當(dāng)前元素在當(dāng)前文件中的引用,然后按F3可以選擇
            Ctrl+N,可以快速打開(kāi)類(lèi)
            Ctrl+Shift+N,可以快速打開(kāi)文件
            Alt+Q可以看到當(dāng)前方法的聲明
            Ctrl+W可以選擇單詞繼而語(yǔ)句繼而行繼而函數(shù)
            Alt+F1可以將正在編輯的元素在各個(gè)面板中定位
            Ctrl+P,可以顯示參數(shù)信息
            Ctrl+Shift+Insert可以選擇剪貼板內(nèi)容并插入
            Alt+Insert可以生成構(gòu)造器/Getter/Setter等
            Ctrl+Alt+V 可以引入變量。例如把括號(hào)內(nèi)的SQL賦成一個(gè)變量
            Ctrl+Alt+T可以把代碼包在一塊內(nèi),例如try/catch
            Alt+Up and Alt+Down可在方法間快速移動(dòng)

            2. 查詢(xún)快捷鍵
            CTRL+N 查找類(lèi)
            CTRL+SHIFT+N 查找文件
            CTRL+SHIFT+ALT+N 查找類(lèi)中的方法或變量
            CIRL+B 找變量的來(lái)源
            CTRL+ALT+B 找所有的子類(lèi)
            CTRL+SHIFT+B 找變量的類(lèi)
            CTRL+G 定位行
            CTRL+F 在當(dāng)前窗口查找文本
            CTRL+SHIFT+F 在指定窗口查找文本
            CTRL+R 在 當(dāng)前窗口替換文本
            CTRL+SHIFT+R 在指定窗口替換文本
            ALT+SHIFT+C 查找修改的文件
            CTRL+E 最近打開(kāi)的文件
            F3 向下查找關(guān)鍵字出現(xiàn)位置
            SHIFT+F3 向上一個(gè)關(guān)鍵字出現(xiàn)位置
            F4 查找變量來(lái)源
            CTRL+ALT+F7 選中的字符查找工程出現(xiàn)的地方
            CTRL+SHIFT+O 彈出顯示查找內(nèi)容

            3. 自動(dòng)代碼
            ALT+回車(chē) 導(dǎo)入包,自動(dòng)修正
            CTRL+ALT+L 格式化代碼
            CTRL+ALT+I 自動(dòng)縮進(jìn)
            CTRL+ALT+O 優(yōu)化導(dǎo)入的類(lèi)和包
            ALT+INSERT 生成代碼(如GET,SET方法,構(gòu)造函數(shù)等)
            CTRL+E 最近更改的代碼
            CTRL+SHIFT+SPACE 自動(dòng)補(bǔ)全代碼
            CTRL+空格 代碼提示
            CTRL+ALT+SPACE 類(lèi)名或接口名提示
            CTRL+P 方法參數(shù)提示
            CTRL+J 自動(dòng)代碼
            CTRL+ALT+T 把選中的代碼放在 TRY{} IF{} ELSE{} 里

            4. 復(fù)制快捷方式
            CTRL+D 復(fù)制行
            CTRL+X 剪切,刪除行
            5. 其他快捷方式
            CIRL+U 大小寫(xiě)切換
            CTRL+Z 倒退
            CTRL+SHIFT+Z 向前
            CTRL+ALT+F12 資源管理器打開(kāi)文件夾
            ALT+F1 查找文件所在目錄位置
            SHIFT+ALT+INSERT 豎編輯模式
            CTRL+/ 注釋//
            CTRL+SHIFT+/ 注釋/*...*/
            CTRL+W 選中代碼,連續(xù)按會(huì)有其他效果
            CTRL+B 快速打開(kāi)光標(biāo)處的類(lèi)或方法
            ALT+ ←/→ 切換代碼視圖
            CTRL+ALT ←/→ 返回上次編輯的位置
            ALT+ ↑/↓ 在方法間快速移動(dòng)定位
            SHIFT+F6 重構(gòu)-重命名
            CTRL+H 顯示類(lèi)結(jié)構(gòu)圖
            CTRL+Q 顯示注釋文檔
            ALT+1 快速打開(kāi)或隱藏工程面板
            CTRL+SHIFT+UP/DOWN 代碼向上/下移動(dòng)。
            CTRL+UP/DOWN 光標(biāo)跳轉(zhuǎn)到第一行或最后一行下
            ESC 光標(biāo)返回編輯框
            SHIFT+ESC 光標(biāo)返回編輯框,關(guān)閉無(wú)用的窗口
            F1 幫助千萬(wàn)別按,很卡!
            CTRL+F4 非常重要下班都用

          二、常用配置:
            1. IDEA內(nèi)存優(yōu)化
            因機(jī)器本身的配置而配置:
            \IntelliJ IDEA 8\bin\idea.exe.vmoptions
            -----------------------------------------
            -Xms64m
            -Xmx256m
            -XX:MaxPermSize=92m
            -ea
            -server
            -Dsun.awt.keepWorkingSetOnMinimize=true

          posted @ 2015-09-26 11:38 管先飛 閱讀(495) | 評(píng)論 (0)編輯 收藏

          1、編寫(xiě)腳步:update.js
               /**
           * 時(shí)間對(duì)象的格式化;
           */
          Date.prototype.format = function(format) {
              /*
               * eg:format="YYYY-MM-dd hh:mm:ss";
               */
              var o = {
                  "M+" :this.getMonth() + 1, // month
                  "d+" :this.getDate(), // day
                  "h+" :this.getHours(), // hour
                  "m+" :this.getMinutes(), // minute
                  "s+" :this.getSeconds(), // second
                  "q+" :Math.floor((this.getMonth() + 3) / 3), // quarter
                  "S" :this.getMilliseconds()
              // millisecond
              }
           
              if (/(y+)/.test(format)) {
                  format = format.replace(RegExp.$1, (this.getFullYear() + "")
                          .substr(4 - RegExp.$1.length));
              }
           
              for ( var k in o) {
                  if (new RegExp("(" + k + ")").test(format)) {
                      format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k]
                              : ("00" + o[k]).substr(("" + o[k]).length));
                  }
              }
              return format;
          }
          var date =new Date();
          var createdate=date.format("yyyy-MM-dd hh:mm:ss");
          date.setMinutes(date.getMinutes()+5);
          var validtime=date.format("yyyy-MM-dd hh:mm:ss");
          db.UserOnlineInfo.update(
          {
            "uid" : "110000350"
          },
          {$set : {
            "uid" : "110000350", 
            "createtime" : createdate,
            "validtime" : validtime
          }});
          db.UserOnlineInfo.update(
          {
            "uid" : "110000351"
          },
          {$set : {
            "uid" : "110000351", 
            "createtime" : createdate,
            "validtime" : validtime
          }});

          2、編寫(xiě)shell腳步:
           #/bin/bash
          echo "update mongod begin"
          cd /home/mongodb/mongodb-3.0.2/bin
          ./mongo  192.168.1.122:27108/YouLiao update.js;
          echo "update mongod success"

          3、 執(zhí)行腳本:
          /home/mongodb/mongodb-3.0.2/bin/mongo  192.168.1.122:27108/YouLiao /root/www/job/mongo-test/update.js

          備注:
          mongodb查詢(xún)、刪除類(lèi)似

             
          posted @ 2015-09-22 19:25 管先飛 閱讀(3575) | 評(píng)論 (0)編輯 收藏

          Java多線(xiàn)程技術(shù)  --作者:楊帆    文章連接:http://express.ruanko.com/ruanko-express_6/webpage/tech4.html
           
          項(xiàng)目經(jīng)理:楊帆

          多線(xiàn)程編程一直是學(xué)員們比較頭痛和心虛的地方,因?yàn)榫€(xiàn)程執(zhí)行順序的不可預(yù)知性和調(diào)試時(shí)候的困難,讓不少人在面對(duì)多線(xiàn)程的情況下選擇了逃避,采用單線(xiàn)程的方式,其實(shí)只要我們對(duì)線(xiàn)程有了明確的認(rèn)識(shí),再加上java內(nèi)置的對(duì)多線(xiàn)程的天然支持,多線(xiàn)程編程不再是一道難以逾越的鴻溝。

          進(jìn)程、線(xiàn)程、并發(fā)執(zhí)行

          首先我們先來(lái)認(rèn)識(shí)一下進(jìn)程、線(xiàn)程、并發(fā)執(zhí)行的概念:

            一般來(lái)說(shuō),當(dāng)運(yùn)行一個(gè)應(yīng)用程序的時(shí)候,就啟動(dòng)了一個(gè)進(jìn)程,當(dāng)然有些會(huì)啟動(dòng)多個(gè)進(jìn)程。啟動(dòng)進(jìn)程的時(shí)候,操作系統(tǒng)會(huì)為進(jìn)程分配資源,其中最主要的資源是內(nèi)存空間,因?yàn)槌绦蚴窃趦?nèi)存中運(yùn)行的。

          在進(jìn)程中,有些程序流程塊是可以亂序執(zhí)行的,并且這個(gè)代碼塊可以同時(shí)被多次執(zhí)行。實(shí)際上,這樣的代碼塊就是線(xiàn)程體。線(xiàn)程是進(jìn)程中亂序執(zhí)行的代碼流程。當(dāng)多個(gè)線(xiàn)程同時(shí)運(yùn)行的時(shí)候,這樣的執(zhí)行模式成為并發(fā)執(zhí)行。

          下面我以一個(gè)日常生活中簡(jiǎn)單的例子來(lái)說(shuō)明進(jìn)程和線(xiàn)程之間的區(qū)別和聯(lián)系:

          雙向多車(chē)道道路圖

          這副圖是一個(gè)雙向多車(chē)道的道路圖,假如我們把整條道路看成是一個(gè)“進(jìn)程”的話(huà),那么圖中由白色虛線(xiàn)分隔開(kāi)來(lái)的各個(gè)車(chē)道就是進(jìn)程中的各個(gè)“線(xiàn)程”了。

          1. 這些線(xiàn)程(車(chē)道)共享了進(jìn)程(道路)的公共資源(土地資源)。
          2. 這些線(xiàn)程(車(chē)道)必須依賴(lài)于進(jìn)程(道路),也就是說(shuō),線(xiàn)程不能脫離于進(jìn)程而存在(就像離開(kāi)了道路,車(chē)道也就沒(méi)有意義了)。
          3. 這些線(xiàn)程(車(chē)道)之間可以并發(fā)執(zhí)行(各個(gè)車(chē)道你走你的,我走我的),也可以互相同步(某些車(chē)道在交通燈亮?xí)r禁止繼續(xù)前行或轉(zhuǎn)彎,必須等待其它車(chē)道的車(chē)輛通行完畢)。
          4. 這些線(xiàn)程(車(chē)道)之間依靠代碼邏輯(交通燈)來(lái)控制運(yùn)行,一旦代碼邏輯控制有誤(死鎖,多個(gè)線(xiàn)程同時(shí)競(jìng)爭(zhēng)唯一資源),那么線(xiàn)程將陷入混亂,無(wú)序之中。
          5. 這些線(xiàn)程(車(chē)道)之間誰(shuí)先運(yùn)行是未知的,只有在線(xiàn)程剛好被分配到CPU時(shí)間片(交通燈變化)的那一刻才能知道。

          JVM與多線(xiàn)程

          Java編寫(xiě)的程序都運(yùn)行在Java虛擬機(jī)(JVM)中,在JVM的內(nèi)部,程序的多任務(wù)是通過(guò)線(xiàn)程來(lái)實(shí)現(xiàn)的。

          每用java命令啟動(dòng)一個(gè)java應(yīng)用程序,就會(huì)啟動(dòng)一個(gè)JVM進(jìn)程。在同一個(gè)JVM進(jìn)程中,有且只有一個(gè)進(jìn)程,就是它自己。在這個(gè)JVM環(huán)境中,所有程序代碼的運(yùn)行都是以線(xiàn)程來(lái)運(yùn)行的。JVM找到程序的入口點(diǎn)main(),然后運(yùn)行main()方法,這樣就產(chǎn)生了一個(gè)線(xiàn)程,這個(gè)線(xiàn)程稱(chēng)之為主線(xiàn)程。當(dāng)main方法結(jié)束后,主線(xiàn)程運(yùn)行完成。JVM進(jìn)程也隨即退出。

          操作系統(tǒng)將進(jìn)程線(xiàn)程進(jìn)行管理,輪流(沒(méi)有固定的順序)分配每個(gè)進(jìn)程很短的一段時(shí)間(不一定是均分),然后在每個(gè)進(jìn)程內(nèi)部,程序代碼自己處理該進(jìn)程內(nèi)部線(xiàn)程的時(shí)間分配,多個(gè)線(xiàn)程之間相互的切換去執(zhí)行,這個(gè)切換時(shí)間也是非常短的。

          Java語(yǔ)言對(duì)多線(xiàn)程的支持

          Java語(yǔ)言對(duì)多線(xiàn)程的支持通過(guò)類(lèi)Thread和接口Runnable來(lái)實(shí)現(xiàn)。這里就不多說(shuō)了。這里重點(diǎn)強(qiáng)調(diào)兩個(gè)地方:

          // 主線(xiàn)程其它代碼段
          ThreadClass subThread = new ThreadClass();
          subThread.start();
          // 主線(xiàn)程其它代碼段
          subThread.sleep(1000);

          有人認(rèn)為以下的代碼在調(diào)用start()方法后,肯定是先啟動(dòng)子線(xiàn)程,然后主線(xiàn)程繼續(xù)執(zhí)行。在調(diào)用sleep()方法后CPU什么都不做,就在那里等待休眠的時(shí)間結(jié)束。實(shí)際上這種理解是錯(cuò)誤的。因?yàn)椋?/p>

          1. start()方法的調(diào)用后并不是立即執(zhí)行多線(xiàn)程代碼,而是使得該線(xiàn)程變?yōu)榭蛇\(yùn)行態(tài)(Runnable),什么時(shí)候運(yùn)行是由操作系統(tǒng)決定的。
          2. Thread.sleep()方法調(diào)用目的是不讓當(dāng)前線(xiàn)程獨(dú)自霸占該進(jìn)程所獲取的CPU資源,以留出一定時(shí)間給其他線(xiàn)程執(zhí)行的機(jī)會(huì)(也就是靠?jī)?nèi)部自己協(xié)調(diào))。

          線(xiàn)程的狀態(tài)切換

          前面我們提到,由于線(xiàn)程何時(shí)執(zhí)行是未知的,只有在CPU為線(xiàn)程分配到時(shí)間片時(shí),線(xiàn)程才能真正執(zhí)行。在線(xiàn)程執(zhí)行的過(guò)程中,由可能會(huì)因?yàn)楦鞣N各樣的原因而暫停(就像前面所舉的例子一樣:汽車(chē)只有在交通燈變綠的時(shí)候才能夠通行,而且在行駛的過(guò)程中可能會(huì)出現(xiàn)塞車(chē),等待其它車(chē)輛通行或轉(zhuǎn)彎的狀況)。

          這樣線(xiàn)程就有了“狀態(tài)”的概念,下面這副圖很好的反映了線(xiàn)程在不同情況下的狀態(tài)變化。

          線(xiàn)程在不同情況下的狀態(tài)變化

          • 新建狀態(tài)(New):新創(chuàng)建了一個(gè)線(xiàn)程對(duì)象。
          • 就緒狀態(tài)(Runnable):線(xiàn)程對(duì)象創(chuàng)建后,其他線(xiàn)程調(diào)用了該對(duì)象的start()方法。該狀態(tài)的線(xiàn)程位于可運(yùn)行線(xiàn)程池中,變得可運(yùn)行,等待獲取CPU的使用權(quán)。
          • 運(yùn)行狀態(tài)(Running):就緒狀態(tài)的線(xiàn)程獲取了CPU,執(zhí)行程序代碼。
          • 阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線(xiàn)程因?yàn)槟撤N原因放棄CPU使用權(quán),暫時(shí)停止運(yùn)行。直到線(xiàn)程進(jìn)入就緒狀態(tài),才有機(jī)會(huì)轉(zhuǎn)到運(yùn)行狀態(tài)。阻塞的情況分三種:
            1. 等待阻塞:運(yùn)行的線(xiàn)程執(zhí)行wait()方法,JVM會(huì)把該線(xiàn)程放入等待池中。
            2. 同步阻塞:運(yùn)行的線(xiàn)程在獲取對(duì)象的同步鎖時(shí),若該同步鎖被別的線(xiàn)程占用,則JVM把該線(xiàn)程放入鎖。
            3. 其他阻塞:運(yùn)行的線(xiàn)程執(zhí)行sleep()或join()方法,或者發(fā)出了I/O請(qǐng)求時(shí),JVM會(huì)把該線(xiàn)程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時(shí)、join()等待線(xiàn)程終止或者超時(shí)、或者I/O處理完畢時(shí),線(xiàn)程重新轉(zhuǎn)入就緒狀態(tài)。
          • 死亡狀態(tài)(Dead):線(xiàn)程執(zhí)行完了或者因異常退出了run()方法,該線(xiàn)程結(jié)束生命周期。

          Java中線(xiàn)程的調(diào)度API

          Java中關(guān)于線(xiàn)程調(diào)度的API最主要的有下面幾個(gè):

          1. 線(xiàn)程睡眠:Thread.sleep(long millis)方法
          2. 線(xiàn)程等待:Object類(lèi)中的wait()方法
          3. 線(xiàn)程讓步:Thread.yield() 方法
          4. 線(xiàn)程加入:join()方法
          5. 線(xiàn)程喚醒:Object類(lèi)中的notify()方法

          關(guān)于這幾個(gè)方法的詳細(xì)應(yīng)用,可以參考SUN的API。這里我重點(diǎn)總結(jié)一下這幾個(gè)方法的區(qū)別和使用。

          sleep方法與wait方法的區(qū)別:

          1. sleep方法是靜態(tài)方法,wait方法是非靜態(tài)方法。
          2. sleep方法在時(shí)間到后會(huì)自己“醒來(lái)”,但wait不能,必須由其它線(xiàn)程通過(guò)notify(All)方法讓它“醒來(lái)”。
          3. sleep方法通常用在不需要等待資源情況下的阻塞,像等待線(xiàn)程、數(shù)據(jù)庫(kù)連接的情況一般用wait。

          sleep/wait與yeld方法的區(qū)別:調(diào)用sleep或wait方法后,線(xiàn)程即進(jìn)入block狀態(tài),而調(diào)用yeld方法后,線(xiàn)程進(jìn)入runnable狀態(tài)。

          wait與join方法的區(qū)別:

          1. wait方法體現(xiàn)了線(xiàn)程之間的互斥關(guān)系,而join方法體現(xiàn)了線(xiàn)程之間的同步關(guān)系。
          2. wait方法必須由其它線(xiàn)程來(lái)解鎖,而join方法不需要,只要被等待線(xiàn)程執(zhí)行完畢,當(dāng)前線(xiàn)程自動(dòng)變?yōu)榫途w。
          3. join方法的一個(gè)用途就是讓子線(xiàn)程在完成業(yè)務(wù)邏輯執(zhí)行之前,主線(xiàn)程一直等待直到所有子線(xiàn)程執(zhí)行完畢。

          通過(guò)上面的介紹相信同學(xué)們對(duì)java里面的多線(xiàn)程已經(jīng)有了基本的了解和認(rèn)識(shí)。其實(shí)多線(xiàn)程編程并沒(méi)有大家想象中的那么難,只要在實(shí)際的學(xué)習(xí),工作當(dāng)中不斷的加以練習(xí)和使用,相信大家很快就能掌握其中的奧妙,從而編寫(xiě)出賞心悅目的java程序。


          posted @ 2015-04-11 17:31 管先飛 閱讀(270) | 評(píng)論 (0)編輯 收藏

          1、多表級(jí)聯(lián)刪除:
          ---DELETE---
          DELETE from a_msg_push,a_announcement
          using a_msg_push,a_announcement
          where  a_msg_push.announcement_id=a_announcement.id and a_announcement.Create_time<'2014-11-19 23:59:59';

          2、子查詢(xún)刪除:
          -----------delete--------
          DELETE From  t_repeat  where t_repeat.id in(
          SELECT tb.id from (
          SELECT *  from t_repeat   t 
          where 
          1=1
          and 
          (t.cid,t.uid ) in (select t1.cid,t1.uid from t_repeat t1 group by t1.cid,t1.uid having count(*) > 1) 
          and 
          t.id  not in (select min(t2.id) from t_repeat t2 group by t2.cid,t2.uid having count(*)>1) 
          ) as tb )

          3、子表刪除:
          -----------delete--------
          DELETE From  t_repeat  where t_repeat.id  not in
             SELECT tb.id from(
          select  a.id from t_repeat a where a.id =(
          select   max(b.id) from t_repeat b where a.cid=b.cid and a.uid=b.uid
             )as tb
          )
          posted @ 2015-03-01 22:52 管先飛 閱讀(2561) | 評(píng)論 (0)編輯 收藏

          感謝廖雪峰為大家提供這么好的免費(fèi)教程,主要目錄如下:
          Git教程

          posted @ 2014-10-20 10:59 管先飛 閱讀(249) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 辽源市| 剑川县| 彰武县| 福安市| 阿瓦提县| 西城区| 建宁县| 遂川县| 五华县| 雷州市| 托里县| 称多县| 栾城县| 环江| 新民市| 黄骅市| 中宁县| 永和县| 丹阳市| 突泉县| 乃东县| 罗定市| 普陀区| 大洼县| 越西县| 如东县| 岑巩县| 界首市| 开阳县| 定远县| 台湾省| 利津县| 纳雍县| 土默特右旗| 仁寿县| 财经| 通辽市| 博爱县| 高州市| 永兴县| 德保县|