文章目录

  • 1、MyBatis概述
    • 1-1.简介
    • 1-2.MyBatis历史
    • 1-3.为什么要使用MyBatis
    • 1-4.ORM思想的理解
  • 2、MyBatis的Hello 示例程序
    • 2-1.创建一个数据库和一个单表
    • 2-2.创建一个Java模块,示例MyBatis的Hello程序
  • 3、Mapper接口方式的mybatis的增,删,改,查实现
    • 3-1.Mapper接口编程的命名习惯
    • 3-2.Mapper接口开发有四个开发规范**必须遵守**
    • 3-3.插入记录并返回主键
    • 3-4.`<selectKey> ` 标签的使用
    • 3-5.注解@MapKey的使用
  • 4、MyBatis的核心配置之properties
  • 5、MyBatis的核心配置之settings
    • 5-1.所有MyBatiss的settings设置选项
  • 6、MyBatis的核心配置之typeAliases
  • 7、MyBatis的核心配置之typeHandlers
  • 8、MyBatis的核心配置之environments
    • 8-1、environments 标签说明
    • 8-2、transactionManager 标签说明
    • 8-3、dataSource 标签说明
  • 9、MyBatis的核心配置之databaseIdProvider
    • 9-1、databaseId测试
  • 10、MyBatis的核心配置之Mapper
  • 11、MyBatis的参数传递
    • 11-1.一个普通数据类型
    • 11-2.多个普通数据类型
      • @Param注解命名参数
    • 11-3.传递一个Map对象作为参数
    • 11-4.一个Pojo数据类型
    • 11-5.模糊查询
    • 11-6.#{}和${}的区别
      • MySQL的字符串拼接,concat函数实现。

1、MyBatis概述

1-1.简介

1、MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
2、MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
3、MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

1-2.MyBatis历史

1、原来是Apache有一个开源的项目iBatis, 2010年6月这个项目由Apache software foundation 迁移到了Google Code,随着开发团队转投Google Code旗下,ibatis3.x正式更名为MyBatis ,代码于2013年11月迁移到了Github上(https://github.com/mybatis/mybatis-3)。

2、iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL MapsData Access Object(DAO)

1-3.为什么要使用MyBatis

1、MyBatis是一个半自动化的持久化层ORM框架
2、jdbc编程—当我们使用jdbc持久化的时候,sql语句被硬编码到java代码中。这样耦合度太高。代码不易于维护。在实际项目开发中会经常添加sql或者修改sql,这样我们就只能到java代码中去修改。
3、Hibernate和JPA,长难复杂的SQL,对于Hibernate而言处理也不容易。内部自动生产的SQL,不容易做特殊优化。Hibernate是基于全映射的全自动化的ORM框架,javaBean存在大量字段时无法只映射部分字段。导致数据库性能下降。
4、对开发人员而言,核心sql还是需要自己优化。sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。可以使用简单的XML注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。成为业务代码+底层数据库的媒介。

1-4.ORM思想的理解

2、MyBatis的Hello 示例程序

2-1.创建一个数据库和一个单表

drop database if exists mybatis;
create database mybatis;
use mybatis;
##############################################################################
################################### 单表 ######################################
##############################################################################
## 创建单表
create table t_user(`id` int primary key auto_increment,`last_name` varchar(50),`sex` int
);insert into t_user(`last_name`,`sex`) values('wzg168',1);
select * from t_user;

2-2.创建一个Java模块,示例MyBatis的Hello程序

需要导入的jar包有:

  • 编写javaBean
public class User {private Integer id;private String lastName;private Integer sex;
}public Interface User {public User queryUserById(Integer id);
}
  • 编写对应的Sql的配置文件UserMapper.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--配置SQL语句namespace 名称空间,相当于类的包名写对应的Mapper接口的全类名
-->
<mapper namespace="com.atguigu.dao.UserMapper"><!--select标签,它用于配置select查询语句#{id}      它是占位符  相当于以前的 ?id 属性可以给当前的sql语句一个唯一的标识resultType属性表示resultSet查询结果集,每一行转换成为什么类型的对象--><select id="queryUserById" resultType="com.atguigu.pojo.User">select id,last_name lastName,sex from t_user where id = #{id}</select>
</mapper>
  • 创建Mybatis的核心配置文件 mybatis-config.xml配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--修改数据库的四个连接属性--><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!--导入需要的sql语句--><mappers><mapper resource="com/atguigu/dao/UserMapper.xml"/></mappers>
</configuration>
  • 编写测试的代码:
@Test
public void test1() throws Exception{// 通过 xml 配置文件,创建SqlSessionFactory对象InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);System.out.println(sqlSessionFactory);// 创建SqlSessionFactory对象==用于执行Sql语句的// SqlSession相当于jdbc中的Connection连接对象SqlSession sqlSession = sqlSessionFactory.openSession();try {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.queryUserById(1);System.out.println(user);} finally {sqlSession.close();}
}

添加日记操作:

  • 1、先添加日记需要的jar包:log4j-1.2.17.jar
  • 2、在src源码目录下创建log4j.properties属性配置文件
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
# log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

3、Mapper接口方式的mybatis的增,删,改,查实现

3-1.Mapper接口编程的命名习惯

1、JavaBean:Book、User
2、Dao接口:BookMapper、UserMapper
3、sql配置文件名:BookMapper.xml、UserMapper.xml

3-2.Mapper接口开发有四个开发规范必须遵守

1、mapper.xml配置文件中的名称空间必须是Mapper接口的全类名。
2、sql语句的id值必须是方法名。
3、方法的参数和mapper.xml中参数的类型必须一致(如果写就必须一致)
4、方法的返回值类型和mapper.xml中的返回值类型必须一致!

  • Mapper接口:
public interface UserMapper {public int saveUser(User user);public int deleteUserById(Integer id);public int updateUser(User user);public User queryUserById(Integer id);public List<User> queryUsers();
}
  • Mapper.xml配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--配置SQL语句namespace 名称空间,相当于类的包名名称空间的定义有两种写法:一:写对应的JavaBean的全类名二:写对应的Mapper接口的全类名
-->
<mapper namespace="com.atguigu.dao.UserMapper">
<!--    public int saveUser(User user);parameterType 如果参数是一个,且是JavaBean的时候,推荐写。为了可读性
--><insert id="saveUser" useGeneratedKeys="true" keyProperty="id"parameterType="com.atguigu.pojo.User">insert into t_user(`last_name`,`sex`) values (#{lastName},#{sex})</insert>
<!--    public int deleteUserById(Integer id);--><delete id="deleteUserById">delete from t_user where id = #{id}</delete>
<!--    public int updateUser(User user);--><update id="updateUser" parameterType="com.atguigu.pojo.User">update t_user set `last_name` = #{lastName},`sex`=#{sex} where id = #{id}</update>
<!--    public User queryUserById(Integer id);--><select id="queryUserById" resultType="com.atguigu.pojo.User">select `id`,`last_name` lastName,`sex` from t_user where id = #{id}</select>
<!--    public List<User> queryUsers();--><select id="queryUsers" resultType="com.atguigu.pojo.User">select `id`,`last_name` lastName,`sex` from t_user</select>
</mapper>
  • Mapper测试:
public class UserMapperTest {SqlSessionFactory sqlSessionFactory;@Beforepublic void setUp() throws Exception {sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));}@Testpublic void saveUser() {SqlSession session = sqlSessionFactory.openSession();try {User user = new User(null,"bbj168", 0);UserMapper mapper = session.getMapper(UserMapper.class);System.out.println( mapper.saveUser(user) );session.commit();System.out.println(user);} finally {session.close();}}@Testpublic void deleteUserById() {SqlSession session = sqlSessionFactory.openSession();try {UserMapper mapper = session.getMapper(UserMapper.class);System.out.println(mapper.deleteUserById(11));session.commit();} finally {session.close();}}@Testpublic void updateUser() {SqlSession session = sqlSessionFactory.openSession();try {UserMapper mapper = session.getMapper(UserMapper.class);System.out.println(mapper.updateUser(new User(12,"bbb168", 1)));session.commit();} finally {session.close();}}session.close();}}@Testpublic void deleteUserById() {SqlSession session = sqlSessionFactory.openSession();try {UserMapper mapper = session.getMapper(UserMapper.class);System.out.println(mapper.deleteUserById(11));session.commit();} finally {session.close();}}@Testpublic void updateUser() {SqlSession session = sqlSessionFactory.openSession();try {UserMapper mapper = session.getMapper(UserMapper.class);System.out.println(mapper.updateUser(new User(12,"bbb168", 1)));session.commit();} finally {session.close();}
}

3-3.插入记录并返回主键

<!--insert标签配置insert的sql语句id 配置唯一标识parameterType 配置方法的参数类型(它是可选的,一般情况下,一个参数,且是JavaBean的时候。建议写上。提高可写性)useGeneratedKeys="true" 表示使用数据库生成的id值。keyProperty="id" 表示把返回的数据自增的id值,给哪个属性
-->
<insert id="saveUser" parameterType="com.atguigu.pojo.User"useGeneratedKeys="true" keyProperty="id">insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex});
</insert>

3-4.<selectKey> 标签的使用

selectLKey标签可以给sql语句。配置另一个查询语句。
一般情况下,这个查询,用于查询生成的主键值。

<!--
insert标签配置insert的sql语句id 配置唯一标识parameterType 配置方法的参数类型(它是可选的,一般情况下,一个参数,且是JavaBean的时候。建议写上。提高可写性)useGeneratedKeys="true" 表示使用数据库生成的id值。keyProperty="id" 表示把返回的数据自增的id值,给哪个属性
-->
<insert id="saveUser" parameterType="com.atguigu.pojo.User"><!-- selectKey标签用于配置一个查询语句,用于查询生成的主键order表示设置执行的顺序BEFORE  selectKey的语句先执行AFTER   selectKey的语句先执行keyProperty="id" 表示把返回的数据自增的id值,给哪个属性resultType是返回的主键类型--><selectKey order="AFTER" keyProperty="id" resultType="java.lang.Integer">select last_insert_id()</selectKey>insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})
</insert>

Oracle数据库的用法

<selectKey order="BEFORE" resultType="int" keyProperty="id"> select 序列名.nextval as id from dual
</selectKey>

3-5.注解@MapKey的使用

@MapKey可以把查询回来的结果集中多条记录以指定的属性名做为key来封装成为一个Map返回。

  • Mapper接口:
/*** 查询全部的用户,并,以用户的id属性为key保存成为map集合返回* @return*/
@MapKey("id")
public Map<Integer,User> queryUsersForMap();
  • Mapper.xml中的配置:
<!--    /**
* 查询全部的用户,并,以用户的id属性为key保存成为map集合返回
* @return
*/
public Map<Integer,User> queryUsersForMap();-->
<select id="queryUsersForMap" resultType="com.atguigu.pojo.User">select `id`,`last_name` lastName,`sex` from t_user
</select>
  • 测试:
@Test
public void queryUsersForMap() {SqlSession session = sqlSessionFactory.openSession();try {UserMapper mapper = session.getMapper(UserMapper.class);Map<Integer, User> integerUserMap = mapper.queryUsersForMap();integerUserMap.forEach((k,v)->{System.out.println("key=" + k + " , value=" + v);});} finally {session.close();}
}

4、MyBatis的核心配置之properties

<!-- properties标签可以配置多组键值对象如果引入的属性配置文件中有相同的key,则以引入的key的值为准-->
<properties resource="jdbc.properties"><property name="username" value="root"/><property name="password" value="root"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="driverClassName" value="com.mysql.jdbc.Driver"/>
</properties>

5、MyBatis的核心配置之settings

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。

5-1.所有MyBatiss的settings设置选项



6、MyBatis的核心配置之typeAliases

<!--配置别名-->
<typeAliases><!--把全类名com.atguigu.pojo.User用user替代<typeAlias type="com.atguigu.pojo.User" alias="user" />--><!--通过指定包名,Mybatis会自动的搜索所有类去自动添加别名自动配置的别名,就是类名(或类名首字母小写)--><package name="com.atguigu.pojo"/><package name="com.atguigu.domain"/>
</typeAliases>

当有多个相同的类名的时候,他们的别名会冲突。这个时候,可以使用注解@Alias()来自定义别名。避免冲突。

7、MyBatis的核心配置之typeHandlers


8、MyBatis的核心配置之environments

8-1、environments 标签说明

<!--数据库环境配置default表示应用哪个数据库环境
-->
<environments default="test"><!--environment配置数据库环境id 就是给当前环境配置一个唯一的标识-->

8-2、transactionManager 标签说明

• JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
• MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)

8-3、dataSource 标签说明

9、MyBatis的核心配置之databaseIdProvider

MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。

<databaseIdProvider type="DB_VENDOR"><property name="SQL Server" value="sqlserver" /><property name="MySQL" value="mysql" /><property name="DB2" value="db2" /><property name="Oracle" value="oracle" />
</databaseIdProvider>

9-1、databaseId测试

<select id="queryUsers" resultType="user">select `id`,`last_name` lastName,`sex` from t_user
</select>
<!--
databaseId="mysql"表示我当前的这个sql语句只是给Mysql数据库使用
-->
<select id="queryUsers" resultType="user" databaseId="mysql">select `id`,`last_name` lastName,`sex` from t_user where 1 = 1
</select>
<!--
databaseId="oracle"表示我当前的这个sql语句只是给Mysql数据库使用
-->
<select id="queryUsers" resultType="user" databaseId="oracle">select `id`,`last_name` lastName,`sex` from t_user where 2 = 2
</select>

10、MyBatis的核心配置之Mapper

<!--导入sql的配置文件-->
<mappers><!--从类路径下开始找<mapper resource="com/atguigu/dao/UserMapper.xml"/>--><!--按给定的Mapper接口来进行注册sql语句注意1:Mapper接口要和Mapper.xml配置文件在同一包下注意2:mapper接口和Mapper.xml配置文件名要一致<mapper class="com.atguigu.dao.UserMapper" />--><!--通过指定包名.Mybatis自动搜索下面的所有Mapper接口和sql语句的配置文件--><package name="com.atguigu.dao"/>
</mappers>

11、MyBatis的参数传递

参数传递是指我们在java代码中传递入的参数。如何注入到Mapper.xml配置文件中的sql参数。

11-1.一个普通数据类型

  • Mapper接口:
public interface UserMapper {public User queryUserById(Integer id);
}
  • Mapper.xml配置文件:
<!--public User queryUserById(Integer id);当参数是一个普通类型的时候,我们可以在#{}写上任意内容,表示值的传递,一般只推荐写上参数名
-->
<select id="queryUserById" resultType="com.atguigu.pojo.User">select `id`,`last_name` lastName,`sex` from t_user where id =#{id}
</select>
  • 测试的方法:
@Test
public void queryUserById() {SqlSession session = sqlSessionFactory.openSession();try {UserMapper mapper = session.getMapper(UserMapper.class);System.out.println(mapper.queryUserById(1));} finally {session.close();}
}

11-2.多个普通数据类型

  • Mapper接口:
/*** 根据用户名或性别查询用户信息* @param name* @param sex* @return*/
public List<User> queryUsersByNameOrSex(String name,Integer sex);
  • mapper.xml配置文件:
<!--    /**
* 根据用户名或性别查询用户信息
* @param name
* @param sex
* @return
*/
public List<User> queryUsersByNameOrSex(String name,Integer sex);当你的参数是多个的时候,有两种方法可以传递参数第1种是:0,1,2,3……(不推荐使用,因为兼容性不好)第一个参数是:0第二个参数是:1以此类推:第n个参数是:n-1第2种是:param1,param2,param3……第一个参数是:param1第二个参数是:param2以此类推:第n个参数是:paramn
-->
<select id="queryUsersByNameOrSex" resultType="com.atguigu.pojo.User">select `id`,`last_name` lastName,`sex` from t_user where last_name = #{param1} or sex = #{param2}
</select>
  • 测试的代码:
@Test
public void queryUsersByNameOrSex() {SqlSession session = sqlSessionFactory.openSession();try {UserMapper mapper = session.getMapper(UserMapper.class);for (User user : mapper.queryUsersByNameOrSex("aaa186", 1)) {System.out.println(user);}} finally {session.close();}
}

@Param注解命名参数

  • Mapper接口:
/**
* 根据用户名或性别查询用户信息
* @Param("name") String name就是对name参数进行命名为:name
*/
public List<User> queryUsersByNameOrSex(@Param("name") String name, @Param("sex") Integer sex);
  • Mapper.xml配置文件:
<!--
public List<User> queryUsersByNameOrSex(String name,Integer sex);
public List<User> queryUsersByNameOrSex(@Param("name") String name, @Param("sex") Integer sex);当你的参数是多个的时候,也可以使用注解@Param来对参数进行命名。
命名之后,就可以在Mapper.xml中进行使用。
比如 :
@Param("name") String name
命名之后就可以使用为:#{name}
-->
<select id="queryUsersByNameOrSex" resultType="com.atguigu.pojo.User">select `id`,`last_name` lastName,`sex` from t_user where last_name = #{name} or sex = #{sex}
</select>

11-3.传递一个Map对象作为参数

  • Mapper接口:
/*** 根据map参数中的name和sex性别来查询用户的信息*/
public List<User> queryUsersByMap(Map map);
  • mapper.xml配置文件:
<!--
public List<User> queryUsersByMap(Map map);
如果传递的参数是Map类型,那么要求,map的key必须和#{}中的参数名一致。
也就是:last_name = #{name} or sex = #{sex}
那么map中就应该是:Map map = new HashMap();map.put(name,值);map.put(sex,值);
-->
<select id="queryUsersByMap" resultType="com.atguigu.pojo.User">select `id`,`last_name` lastName,`sex` from t_user where last_name = #{name} or sex = #{sex}
</select>

11-4.一个Pojo数据类型

  • Mapper接口:
public int saveUser(User user);
  • mapper.xml配置文件:
<!--public int saveUser(User user);如果参数是一个JavaBean的时候,只需要写上对应的属性名即可
-->
<insert id="saveUser" parameterType="com.atguigu.pojo.User">insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})
</insert>
  • 测试的代码:
@Test
public void saveUser(){SqlSession session = sqlSessionFactory.openSession();try {UserMapper mapper = session.getMapper(UserMapper.class);mapper.saveUser(new User(null,"bbj168", 0));session.commit();} finally {session.close();}
}

11-5.模糊查询

需求:现在要根据用户名查询用户对象。 也就是希望查询如下:
select * from t_user where last_name like '%张%'

  • Mapper接口:
public List<User> queryUsersLikeName(@Param("name") String name);
  • Mapper.xml配置文件:
<!--public List<User> queryUsersLikeName(String name);#{} 是占位符1、里面可以随便写2、它是占符符${} 是直接把参数输出到sql语句中,做字符串拼接(一般用在复杂的sql中,一般是输出表名使用。不在参数中使用)1、只能写value2、输出后,做字符串拼出
-->
<select id="queryUsersLikeName" resultType="com.atguigu.pojo.User">select `id`,`last_name` lastName,`sex` from t_user where last_name like concat('%',#{name},'%')
</select>

11-6.#{}和${}的区别

#{} 是占位符
1、里面可以随便写
2、它是占符符
${} 是直接把参数输出到sql语句中,做字符串拼接(一般用在复杂的sql中,一般是输出表名使用。不在参数中使用)
1、只能写value
2、输出后,做字符串拼出

MySQL的字符串拼接,concat函数实现。

concat是mysql中的一个函数,可以拼接多个字符串:

使用concat解决 关键字中不带%的问题:

<select id="queryUsersLikeName" resultType="com.atguigu.pojo.User">select `id`,`last_name` lastName,`sex` from t_user where last_name like concat('%',#{name},'%')
</select>

【后端框架】MyBatis(1)相关推荐

  1. 【开发】后端框架——Mybatis

    前置知识:JDBC 学习视频 Mybatis--一种ORM框架:将Java中的Bean映射为数据库的记录 ORM:用于实现面向对象编程语言里不同类型系统的数据之间的转换 Mybatis运行过程--工厂 ...

  2. 一文搞定7大流行后端框架:Spring、Netty、MyBatis、Hibernate、Dubbo...

    框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法:另一种定义认为,框架是可被应用开发者定制的应用骨架.前者是从应用方面而后者是从目的方面给出的定义. 可 ...

  3. 【基于Springboot、Mybatis后端框架开发——招生管理网站(系统)】附源码

    招生管理网站(系统) 招生管理系统项目简介 内容及步骤 1. 招生管理系统的总体设计与实现 1.1需求分析 1.2系统功能设计 1.4系统功能测试(部分) 1.5代码下载 招生管理系统项目简介 搭建J ...

  4. Web后端框架Springboot创建和基础讲解(一)

    Springboot是一款底层由java编写的web后端框架,前身是spring框架,相较于前身框架而言,继承了其良好的兼容性以及扩展性,并且舍弃了大量繁杂的xml文件,将其改为依赖注入spirngb ...

  5. mysql后台框架_后端服务开发 - 认识后端框架

    后端的基本概念 在软件架构和程序设计领域,前端是软件系统中直接和用户交互的部分,而后端控制着软件的输出. 前端控制ajax等技术向后端进行网络请求:后端收到请求后对数据库进行操作,返回给前端JSON数 ...

  6. 搭建一个简单springboot后端框架

    前言 框架知识是每个程序员都应该或多或少都要有所了解,作为后端开发更是以后进阶架构师必备的知识储备:以此为出发点,我们可以从搭建一个简单的后端框架开始,了解相关的技术点和搭建思路. 我们可以从创建项目 ...

  7. 应用服务器与WSGI协议以及flask后端框架总结(后端接收请求返回响应的整个流程)...

    上次遗留了两个问题,先说一下自己的看法 问题: 1.明明一个线程只能处理一个请求,那么栈里的元素永远是在栈顶,那为什么需要用栈这个结构?用普通变量不行吗. 2._request_ctx_stack和_ ...

  8. python后端框架flask_Vue+Flask轻量级前端、后端框架,如何完美同步开发

    导言我们的Vue2.0应用:简读-微信公众号RSS,即将进入后端开发. Vue+Flask作为轻量级前端.后端框架,非常适合组合起来快速开发.一个是js,一个是Python. Bonus: 可以完美实 ...

  9. laravel框架中文手册_node.js 后端框架star 排名 2020年11月更新,fastify 超 egg

    发布时间以首个版本发布(0.x)为准. 第一名: express 50.8k (2010年1月发布) 目前star 和下载量最高的老牌框架. https://github.com/expressjs/ ...

  10. python web后端和vue哪个难_全栈开发用纯后端模板与Vue+后端框架组合哪个好?

    全栈开发没有明确的定义,但应该指的就是前端+后端+数据库.所以只用纯后端框架,不算全站开发.至少在Angularjs出现以前,我没听说过全站开发这个词. 你问题描述中的感觉是对的,这就是前后端分离的好 ...

最新文章

  1. 【转】将 Linux 应用程序移植到 64 位系统上
  2. Effective Java实作toString() - 就是爱Java
  3. day_6:验证码识别
  4. Asp.net PageBase学习总结
  5. pythongoogle.probuf.timestamp_数据通信格式:Google Protobuf
  6. 经验之谈:Linux运维工程师所需技能
  7. [LOJ#6068]. 「2017 山东一轮集训 Day4」棋盘[费用流]
  8. lombok之@RequiredArgsConstructor注解
  9. java string 加密_java字符串加密解密
  10. guid主键 oracle_关于ORACLE的GUID主键生成
  11. 平面设计常用计算机工具,平面设计中常用的计算机软件及其具体使用
  12. 音视频即时通讯解决方案
  13. FITC-TAT-Smad7-HA融合蛋白,荧光素标记TAT-Smad7-HA融合蛋白
  14. 初识Kinect之一
  15. 免费云存储工具类——七牛云(更改配置信息,直接使用)
  16. 异形隔离java剧情_异形隔离攻略 系统上手教程 全剧情流程图文攻略(20)
  17. 自动控制原理MATLAB常用函数总结
  18. Vscode批量处理
  19. APP Inventor 基于网络微服务器的即时通信APP
  20. 服务器gs文件修改器,NBA2K17L大修改器用法 使用第三方名单和GS教程

热门文章

  1. Amazon(AMZN)2020年第三季度收益电话会议记录
  2. 安装mysql的初始密码在哪里
  3. 带你全面解析Android框架体系架构view篇,全网疯传
  4. C小程PTA错题集1
  5. Android6.0 usb默认MTP模式的修改方法
  6. MMKV 原理、使用以及简单封装
  7. 告别用了8年的QQ浏览器,这也许是我换浏览器的原因吧
  8. python爬虫返回文本为乱码的解决方法
  9. ElasticSearch 监控单个节点详解
  10. Maven项目 springsecurity配置