【后端框架】MyBatis(1)
文章目录
- 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 Maps
和Data 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)相关推荐
- 【开发】后端框架——Mybatis
前置知识:JDBC 学习视频 Mybatis--一种ORM框架:将Java中的Bean映射为数据库的记录 ORM:用于实现面向对象编程语言里不同类型系统的数据之间的转换 Mybatis运行过程--工厂 ...
- 一文搞定7大流行后端框架:Spring、Netty、MyBatis、Hibernate、Dubbo...
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法:另一种定义认为,框架是可被应用开发者定制的应用骨架.前者是从应用方面而后者是从目的方面给出的定义. 可 ...
- 【基于Springboot、Mybatis后端框架开发——招生管理网站(系统)】附源码
招生管理网站(系统) 招生管理系统项目简介 内容及步骤 1. 招生管理系统的总体设计与实现 1.1需求分析 1.2系统功能设计 1.4系统功能测试(部分) 1.5代码下载 招生管理系统项目简介 搭建J ...
- Web后端框架Springboot创建和基础讲解(一)
Springboot是一款底层由java编写的web后端框架,前身是spring框架,相较于前身框架而言,继承了其良好的兼容性以及扩展性,并且舍弃了大量繁杂的xml文件,将其改为依赖注入spirngb ...
- mysql后台框架_后端服务开发 - 认识后端框架
后端的基本概念 在软件架构和程序设计领域,前端是软件系统中直接和用户交互的部分,而后端控制着软件的输出. 前端控制ajax等技术向后端进行网络请求:后端收到请求后对数据库进行操作,返回给前端JSON数 ...
- 搭建一个简单springboot后端框架
前言 框架知识是每个程序员都应该或多或少都要有所了解,作为后端开发更是以后进阶架构师必备的知识储备:以此为出发点,我们可以从搭建一个简单的后端框架开始,了解相关的技术点和搭建思路. 我们可以从创建项目 ...
- 应用服务器与WSGI协议以及flask后端框架总结(后端接收请求返回响应的整个流程)...
上次遗留了两个问题,先说一下自己的看法 问题: 1.明明一个线程只能处理一个请求,那么栈里的元素永远是在栈顶,那为什么需要用栈这个结构?用普通变量不行吗. 2._request_ctx_stack和_ ...
- python后端框架flask_Vue+Flask轻量级前端、后端框架,如何完美同步开发
导言我们的Vue2.0应用:简读-微信公众号RSS,即将进入后端开发. Vue+Flask作为轻量级前端.后端框架,非常适合组合起来快速开发.一个是js,一个是Python. Bonus: 可以完美实 ...
- laravel框架中文手册_node.js 后端框架star 排名 2020年11月更新,fastify 超 egg
发布时间以首个版本发布(0.x)为准. 第一名: express 50.8k (2010年1月发布) 目前star 和下载量最高的老牌框架. https://github.com/expressjs/ ...
- python web后端和vue哪个难_全栈开发用纯后端模板与Vue+后端框架组合哪个好?
全栈开发没有明确的定义,但应该指的就是前端+后端+数据库.所以只用纯后端框架,不算全站开发.至少在Angularjs出现以前,我没听说过全站开发这个词. 你问题描述中的感觉是对的,这就是前后端分离的好 ...
最新文章
- 【转】将 Linux 应用程序移植到 64 位系统上
- Effective Java实作toString() - 就是爱Java
- day_6:验证码识别
- Asp.net PageBase学习总结
- pythongoogle.probuf.timestamp_数据通信格式:Google Protobuf
- 经验之谈:Linux运维工程师所需技能
- [LOJ#6068]. 「2017 山东一轮集训 Day4」棋盘[费用流]
- lombok之@RequiredArgsConstructor注解
- java string 加密_java字符串加密解密
- guid主键 oracle_关于ORACLE的GUID主键生成
- 平面设计常用计算机工具,平面设计中常用的计算机软件及其具体使用
- 音视频即时通讯解决方案
- FITC-TAT-Smad7-HA融合蛋白,荧光素标记TAT-Smad7-HA融合蛋白
- 初识Kinect之一
- 免费云存储工具类——七牛云(更改配置信息,直接使用)
- 异形隔离java剧情_异形隔离攻略 系统上手教程 全剧情流程图文攻略(20)
- 自动控制原理MATLAB常用函数总结
- Vscode批量处理
- APP Inventor 基于网络微服务器的即时通信APP
- 服务器gs文件修改器,NBA2K17L大修改器用法 使用第三方名单和GS教程