前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从一个互联网职场小白到一个沪漂湿人,一路让我知道分享是一件多么重要的事情,总之不对的地方,多多指出,我们一起徜徉代码的海洋!
 
我这里做每个章节去说的前提,不是一定很标准的套用一些官方名词,目的是为了让大家可以理解更加清楚,如果形容的不恰当,可以留言出来,万分感激

1、Spring框架为什么要和持久层整合?

因为在整个JavaEE开发中需要持久层进行数据库的访问和操作。

常见的技术有

  • JDBC
  • Hibernate
  • Mybatis

但是这三个技术在持久层开发中存在着大量的代码冗余。

所以Spring基于模板设计模式对上述的持久层技术进行了封装!!

那么一旦Spring封装完成之后,尽管还是使用上面三个技术进行持久层的操作,但是效率大大增加了!

2、Spring可以与哪些持久层技术进行整合?

1、JDBC

形成了JDBCTemplate这个类,进行jdbc的访问和操作,进行了封装

2、Hibernate

Hibernate更多人喜欢称为JPA,形成了HibernateTemplate进行hibernate操作,进行了封装

3、Mybatis

形成了SqlSessionFactoryBean和MapperScannerConfigure工具,来简化mybatis的处理

当然目前应用比较多的,还是和Mybatis的整合

所以后面我们关注与Spring与Mybatis整合

3、Spring与Mybatis整合

作为Spring框架之所以要和Mybatis进行整合,其本质是对Mybatis现有开发过程中的,不满意的地方,Spring要进行合理的封装!!从而让Mybatis的开发更加简洁,所以我们要先了解下Mybatis的开发过程

1、Mybatis开发步骤的回顾

以前老师会告诉我们有7个步骤

  • 实体
  • 实体别名
  • 创建DAO接口
  • 实现Mapper文件
  • 注册Mapper文件
  • MybatisApi调用

通过案例回忆下!

依赖关系(记得加上log4j日志坐标):

 <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.40</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.4.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-web --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.1.4.RELEASE</version></dependency><!-- 日志门面 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

在resource下面建立一个log4j.properties文件

resources # resources⽂件夹根⽬录下
### ### 配置根
log4j.rootLogger = debug,console
### ### ⽇志输出到控制台显示
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd
HH:mm:ss} %-5p %c{1}:%L - %m%n

实体:

package com.chenxin.spring5.mybatis.entity;import java.io.Serializable;public class Users implements Serializable {private Integer id;private String name;private String password;public Users(Integer id, String name, String password) {this.id = id;this.name = name;this.password = password;}public Users() {}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

实体别名(写在mybatis-config):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><typeAliases><!--        为了后面书写mapper的时候不需要再重复写全限定名--><typeAlias alias="users" type="com.chenxin.spring5.mybatis.Users"></typeAlias></typeAliases></configuration>

表:库users,表t_user

创建Dao接口

public interface UserDao {void save(Users users);
}

实现Mapper文件

<?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.chenxin.spring5.mybatis.dao.UserDao"><insert id="save" parameterType="users">insert into t_user(name, password) values (#{name}, #{password})</insert>
</mapper>

注册Mapper文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><typeAliases><!--        为了后面书写mapper的时候不需要再重复写全限定名--><typeAlias alias="users" type="com.chenxin.spring5.mybatis.Users"></typeAlias></typeAliases><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/users?useSSL=false"></property><property name="username" value="root"></property><property name="password" value="527713"></property></dataSource></environment></environments><mappers><mapper resource="UsersMapper.xml"></mapper></mappers>
</configuration>

因为这些配置文件都是在resource下的,所以默认都是classpath,直接可以写文件名

MybatisApi调用:

用mybatis的api读取文件,这个流是从你本地文件往程序里读,所以是输入流,如果是程序往外做任何事,就要用到输出流,输入输出的主体,都是程序本身,这个额外知识点帮助你更好记忆流!

再用mybatis提供的SQLSessionFactoryBuilder的builder方法把这个流构建成SqlsessionFactory工厂

然后SqlsessionFactory工厂再打开sql会话,得到会话对象,再用会话对象获取mapper接口

从而调用接口上的save方法执行,本质上还是走的是配置文件,通过配置文件读到你接口,然后做代理,去帮你完成,后面我专门花时间来讲mybatis

后面记得提交commit!!

package com.chenxin.spring5.mybatis;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 java.io.IOException;
import java.io.InputStream;public class TestMapper {public static void main(String[] args) throws IOException {InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserDao mapper = sqlSession.getMapper(UserDao.class);Users users = new Users();users.setName("chenxin");users.setPassword("11111");mapper.save(users);sqlSession.commit();}
}

我们测试看下控制台

2021-04-05 12:50:13 DEBUG LogFactory:135 - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
2021-04-05 12:50:13 DEBUG PooledDataSource:335 - PooledDataSource forcefully closed/removed all connections.
2021-04-05 12:50:13 DEBUG PooledDataSource:335 - PooledDataSource forcefully closed/removed all connections.
2021-04-05 12:50:13 DEBUG PooledDataSource:335 - PooledDataSource forcefully closed/removed all connections.
2021-04-05 12:50:13 DEBUG PooledDataSource:335 - PooledDataSource forcefully closed/removed all connections.
2021-04-05 12:50:13 DEBUG JdbcTransaction:137 - Opening JDBC Connection
2021-04-05 12:50:13 DEBUG PooledDataSource:406 - Created connection 2095490653.
2021-04-05 12:50:13 DEBUG JdbcTransaction:101 - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7ce6a65d]
2021-04-05 12:50:13 DEBUG save:159 - ==>  Preparing: insert into t_user(name, password) values (?, ?)
2021-04-05 12:50:13 DEBUG save:159 - ==> Parameters: chenxin(String), 11111(String)
2021-04-05 12:50:13 DEBUG save:159 - <==    Updates: 1
2021-04-05 12:50:13 DEBUG JdbcTransaction:70 - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@7ce6a65d]

很明显我们完成了基本的mybatis开发,此时并没有和Spring整合,只是原生的Mybatis开发场景,你们看下麻不麻烦!!!!

4、Mybatis在开发中存在的问题

配置繁琐,代码冗余!!

  • 实体
  • 实体别名
  • 创建DAO接口
  • 实现Mapper文件
  • 注册Mapper文件
  • MybatisApi调用

第二步 实体别名和注册Mapper文件---配置繁琐

当你发现实体很多的时候,就不是单单配置一个User这么简单了,实际生产中,有非常多的实体,你这么写,是会疯的吧.....

<typeAlias alias="users" type="com.chenxin.spring5.mybatis.entity.Users"></typeAlias>
<typeAlias alias="product" type="com.chenxin.spring5.mybatis.entity.Product"></typeAlias>
<typeAlias alias="person" type="com.chenxin.spring5.mybatis.entity.Person"></typeAlias>

而且我们这步是很容易丢掉的

包括mapper注册,只要有一个mapper,我就要写一个mapper文件名

<mappers><mapper resource="UsersMapper.xml"></mapper><mapper resource="Product.xml"></mapper><mapper resource="People.xml"></mapper></mappers>

所以这些操作,实际上你很烦的。只是名字有差异,但是这些都要重复写!!

代码冗余体现在第七步,API调用

每个人都要去写自己的业务逻辑,是不是都要把这些代码重复写一遍,不然你怎么保证你业务逻辑可以走通呢

这些代码就会造成冗余

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);

你和我的区别就是getMapper里面的东西不一样,你是UserDao,我是ProductDao。

2、6、7步骤,在mybatis独立开发的过程中,会造成代码冗余吗,所以Spring要拯救他,解决了2、6、7的问题!!

5、Spring与Mybatis整合思路分析

Spring在整合Mybatis中,其实本质上是对这四行代码做了封装

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);

先是前两行创建出来sqlSessionFactory工厂,进而通过工厂得到Dao的实现类

前两行,Spring特地开发了一个类,叫做SqlSessionFactoryBean,作用是用于封装SqlSessionFactory创建的代码。

作为这个类,既然是Spring提供的,那么哈哈,就回到<bean id="sqlSessionFactoryBean" class="SqlSessionFactoryBean全限定名">.....

这两行中第一行是读取配置文件mybatis-config.xml,里面一共三个部分,第一个是别名,第二个是数据源mysql配置,第三个是映射mapper文件

1. typeAliases

2.dataSource

3.mapper映射

这些东西,怎么为SqlsessionFactoryBean提供呢

既然是SqlsessionFactoryBean需要的,需要就是依赖,就应该通过配置文件为它的成员变量进行赋值,所以这三块的内容完全可以通过属性注入的方式传递给SqlsessionFactoryBean

先看dataSource,因为java皆对象的原则,连接池也是个对象,并且是自定义的对象,我们就需要用ref标签去引用

再看typeAliases,解决了配置繁琐问题,直接指向实体包的路径就可以了

最后mapper映射,用通配的设置,直接可以写classpath:/*Mapper.xml,当然路径你根据自己的来,我这默认是resource下,你可以是classpath:/mapper/*Mapper.xml,这些不做废话了。*表示统通配,匹配前缀

    <!--    连接池--><bean id="dataSource"class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/users?useSSL=false"></property><property name="username" value="root"></property><property name="password" value="527713"></property></bean><!--创建SqlsessionFactoryBean--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><!--        执行实体对应的包--><property name="typeAliasesPackage" value="com.chenxin.spring5.mybatis.entity"></property><property name="mapperLocations"><list><value>classpath:com.chenxin.spring5/*Mapper.xml</value></list></property></bean>

那么前两行的解释到这,我们看看后面两行sqlSession对象的创建,和getMapper,Spring是怎么做到的?

SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);

目前SqlsessionFactoryBean创建出来了SqlSessionFactory了,只要注意两个细节,一个是拿到sqlSessionFactory,然后提供Dao接口的Class,Spring为我们提供另一个类解决这个问题,叫做MapperScannerConfigure

一样<bean id="scanner" class="..MapperScannerConfigure">,要创建好这个对象,一定要有sqlSessionFactory和Dao接口的Class;需要就等于依赖,依赖就需要属性注入,自然这个标签就一定存在两个这样的属性

<bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property><!--        设置dao所在的包路径--><property name="basePackage" value="com.chenxin.spring5.mybatis.dao"></property></bean>

所以这个MapperScannerConfigure,帮我们最终创建了dao对象,那么我们怎么获得这个dao对象呢,之前我们说过ctx.getBean(bean的id),但是这在配置文件中,你有可能帮我创建UserDao,也会帮别人创建ProductDao对象,我怎么写呢,其实也是驼峰

方式,UserDao->userDao,ProductDao->productDao即可!!

有人说, 你这整的比之前麻烦;但是实际上面这些配置实际上你只需要配置一次就可以,不需要重复往里写了之前的繁琐步骤!!

6、Spring与Mybatis整合开发步骤

去掉上面的2.6.7步骤,其实就剩下4步了

  • 实体
  • 创建DAO接口
  • 实现Mapper文件

我这里把配置文件写下,简单的也写出来,是为了初学者看的方便而已。

<!--    连接池--><bean id="dataSource"class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/users?useSSL=false"></property><property name="username" value="root"></property><property name="password" value="527713"></property></bean><!--创建SqlsessionFactoryBean--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><!--        执行实体对应的包--><property name="typeAliasesPackage" value="com.chenxin.spring5.mybatis.entity"></property><property name="mapperLocations"><list><value>classpath*:*Mapper.xml</value></list></property></bean><bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property><!--        设置dao所在的包路径--><property name="basePackage" value="com.chenxin.spring5.mybatis.dao"></property></bean>

这些配置你在公司中其实都已经配置好了的,但是你要知其然知其所以然!!

这四步,是不是很熟悉???哈哈,实战中你们就是这么写的

测试下

    @Testpublic void test9(){ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao = (UserDao) ctx.getBean("userDao");Users users = new Users();users.setName("chenxin");users.setPassword("11111222");userDao.save(users);}
2021-04-05 14:47:07 DEBUG ClassPathXmlApplicationContext:590 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@c39f790
2021-04-05 14:47:07 DEBUG XmlBeanDefinitionReader:395 - Loaded 3 bean definitions from class path resource [applicationContext.xml]
2021-04-05 14:47:07 DEBUG DefaultListableBeanFactory:213 - Creating shared instance of singleton bean 'scanner'
2021-04-05 14:47:07 DEBUG LogFactory:135 - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
2021-04-05 14:47:07 DEBUG ClassPathMapperScanner:437 - Identified candidate component class: file [E:\spring专题\spring-day03\target\classes\com\chenxin\spring5\mybatis\dao\UserDao.class]
2021-04-05 14:47:07 DEBUG ClassPathMapperScanner:49 - Creating MapperFactoryBean with name 'userDao' and 'com.chenxin.spring5.mybatis.dao.UserDao' mapperInterface
2021-04-05 14:47:07 DEBUG DefaultListableBeanFactory:213 - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
2021-04-05 14:47:07 DEBUG DefaultListableBeanFactory:213 - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
2021-04-05 14:47:07 DEBUG DefaultListableBeanFactory:213 - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
2021-04-05 14:47:07 DEBUG DefaultListableBeanFactory:213 - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
2021-04-05 14:47:07 DEBUG DefaultListableBeanFactory:213 - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
2021-04-05 14:47:07 DEBUG DefaultListableBeanFactory:213 - Creating shared instance of singleton bean 'dataSource'
2021-04-05 14:47:07 DEBUG DefaultListableBeanFactory:213 - Creating shared instance of singleton bean 'sqlSessionFactory'
2021-04-05 14:47:07 DEBUG SqlSessionFactoryBean:49 - Property 'configuration' or 'configLocation' not specified, using default MyBatis Configuration
2021-04-05 14:47:07 DEBUG SqlSessionFactoryBean:49 - Parsed mapper file: 'file [E:\spring专题\spring-day03\target\classes\UsersMapper.xml]'
2021-04-05 14:47:07 DEBUG DefaultListableBeanFactory:213 - Creating shared instance of singleton bean 'userDao'
2021-04-05 14:47:07 DEBUG SqlSessionUtils:49 - Creating a new SqlSession
2021-04-05 14:47:07 DEBUG SqlSessionUtils:49 - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2892dae4] was not registered for synchronization because synchronization is not active
2021-04-05 14:47:07 DEBUG DataSourceUtils:115 - Fetching JDBC Connection from DataSource
2021-04-05 14:47:07 INFO  DruidDataSource:1003 - {dataSource-1} inited
2021-04-05 14:47:07 DEBUG SpringManagedTransaction:49 - JDBC Connection [com.mysql.jdbc.JDBC4Connection@2ed2d9cb] will not be managed by Spring
2021-04-05 14:47:07 DEBUG save:159 - ==>  Preparing: insert into t_user(name, password) values (?, ?)
2021-04-05 14:47:07 DEBUG save:159 - ==> Parameters: chenxin(String), 11111222(String)
2021-04-05 14:47:07 DEBUG save:159 - <==    Updates: 1
2021-04-05 14:47:07 DEBUG SqlSessionUtils:49 - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2892dae4]

很明显,插入成功,至此,Spring和Mybatis整合的代码就完成了,其实你发现mybatis-config其实也就不需要了,可以不用这玩意了。

7、Spring与Mybatis整合细节

我们有没有发现一个问题,在讲Mybatis的时候,我们讲了但凡是增删改的操作,都必须要控制事务,纯用mybatis开发的时候,是不是我们都要手动提交下事务??session.commit();

为什么我们整合后,我们没有手动提交事务,但是数据可以插入数据库中呢?其实是连接对象,我们知道连接对象控制了事务,所以谁控制了连接对象,谁就变相的控制了事务,很明显是Spring?

看一个日志

2021-04-05 14:47:07 DEBUG SpringManagedTransaction:49 - JDBC Connection [com.mysql.jdbc.JDBC4Connection@2ed2d9cb] will not be managed by Spring

我相信这个基本上开发都见过,啥意思呢,明确的告诉我们,Spring没有帮我们管理连接对象,那是不是Mybatis呢?如果是的话,我们为什么在使用纯Mybatis开发的时候,我们要手动提交commit呢?

而现在Mybatis又不需要手动控制事务了呢?

其实控制连接对象的,本质上是连接池,以前我们用Mybatis开发的时候,用的是Mybatis连接池创建的连接对象---》创建Connection

现在我们整合的用Druid连接池,来负责连接对象的创建。最终的效果都是创建连接,但是有微小的区别

在Mybatis创建的连接池中,手工的进行Connection.setAutoCommit(false);操作完,手动提交

在Druid中,Connection.setAutoCommit(ture);保持着自动控制事务;完成一条sql的执行,自动帮你提交了!

当然不止Druid,比如C3p0,都会自动保证控制事务,不需要你手动提交。

注意:未来实战中,还会⼿⼯控制事务(多条sql⼀起成功,⼀起失败),后续Spring通过事务控制解决这个问题。

后面我们继续讲解Spring的事务,敬请期待!!

Spring基础专题——第七章(持久层整合)相关推荐

  1. Spring基础专题——第六章(Aop编程)

    前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...

  2. Spring基础专题——第十一章(高级注解编程完结)

    前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...

  3. Spring基础专题——第五章(Aop代理)

    前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...

  4. Spring基础专题——第三章(反转控制与依赖注入)

    前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...

  5. Dubbo基础专题——第四章(Dubbo整合Nacos分析细节点)

    应广大的读者要求,也是公司目前需要一些支持,我就自己亲身搭建一个Springboot+nacos+dubbo的框架和项目,并演示dubbo面对一些系统的 业务场合,应该怎么去做支持,文章中我会先贴出代 ...

  6. 计算机应用基础第七章自测题,计算机应用基础习题第七章.doc

    计算机应用基础习题第七章 第7章 如何使用 WinRAR 快速压缩当您在文件上点右键的时候,您就会看见图 中的部分就是 WinRAR 在右键中创建的快捷键. ? 图 右键菜单 想压缩文件的时候,在文件 ...

  7. Spring基础专题——第二章(注入Injection)

    前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...

  8. Spring基础专题——第一章(第一个Spring程序)

    前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...

  9. 鸟哥的Linux私房菜(基础篇)- 第七章、Linux 文件与目录管理

    第七章.Linux文件与目录管理 最近升级日期:2009/08/26 在第六章我们认识了Linux系统下的文件权限概念以及目录的配置说明.在这个章节当中,我们就直接来进一步的操作与管理文件与目录吧!包 ...

最新文章

  1. Fastadmin笔记
  2. golang mysql商业用例_完美起航-golang操作mysql用例
  3. malloc 源码_【C++学习笔记(九)】之 new运算符的使用/ new 与 malloc的异同(附代码,详细注释)...
  4. WPF游戏,使用move游戏开发
  5. printf函数输出多个printf 、前置加加或者后置加加
  6. bean json转kotlin_Android--------kotlin插件神器Json直接生成javaBean
  7. 消息中间件学习总结(10)——Kafka、RabbitMQ、RocketMQ消息中间件的消息发送性能对比
  8. Qfarm /load命令
  9. Python的模板:HTML代码 + 模板语法
  10. AIR-Android开发外部数据访问与存储
  11. UVA10284 POJ2512 Chessboard in FEN【国际象棋】
  12. 初学者必学教程——JQuery的简介
  13. 批量复制文件夹的批处理.bat命令
  14. WebStorm中文HTML编辑开发工具
  15. (私人收藏)配色宝典
  16. JAVA管理信息系统答辩ppt,个人信息管理系统答辩ppt
  17. 一定不要想当然啊!!
  18. [零基础学Python]字典,你还记得吗?
  19. Java中如何不用中间变量来使两个变量交换值
  20. dmidecode服务器型号,linux dmidecode查看服务器硬件信息

热门文章

  1. 关于Transformer,那些的你不知道的事
  2. 智能音箱玩出新花样?这家公司推出2699元的智能虚拟机器人
  3. 33关Python游戏,测试你的爬虫能力到底及格不?
  4. 腾讯回应博鳌AI同传:系谣言,承认出现失误
  5. 马上 2018 年了,该不该下定决心转型AI呢?
  6. 9月热文精选,为你的假期加点料
  7. Java必会的工具库,让你的代码量减少90%
  8. 去大厂面试,说了没高并发经验,面试官还是抓着这个问!
  9. 百度最近开源了分布式配置中心,名叫BRCC
  10. Elasticsearch 在互联网公司大量真实的应用案例