mybtis 基础
一、什么是mybatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。对于有一定sql基础的开发人员来说,非常好用。
二、mybatis的配置方法
1.引入jar包
2.创建表
3.创建数据库配置文件 dbconfig.properties
#### 数据库配置文件 #######
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/zmyproject?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root
4.创建mybatis配置文件 mybatis-config.xml
<?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> <!-- 引入外部文件 -->
<properties resource="dbconfig.properties"></properties> <environments default="development"> <!-- 可以配置多个,这样就能进行切换了 -->
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment> </environments> <!-- 实体类对应的映射文件 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
<mapper resource="mapper/UserMapper2.xml"/>
<mapper resource="mapper/deptMapper.xml"/>
<mapper resource="mapper/roleMapper.xml"/>
</mappers> </configuration>
5.创建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">
<!--
如果不和接口关联则namespace只要唯一就行
如果和接口关联则namespace需要和接口全类名一致
-->
<mapper namespace="test.dao.UserMapper"> </mapper>
三、mybatis的基本使用方法
1.使用纯配置文件的方式来操作数据库
①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">
<!--
如果不和接口关联则namespace只要唯一就行
如果和接口关联则namespace需要和接口全类名一致
-->
<mapper namespace="test.dao.UserMapper1">
<resultMap id="BaseResultMap" type="test.entity.User">
<id column="user_id" jdbcType="VARCHAR" property="userId" />
<result column="account" jdbcType="VARCHAR" property="account" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="nikname" jdbcType="VARCHAR" property="nikname" />
<result column="gender" jdbcType="INTEGER" property="gender" />
<result column="age" jdbcType="INTEGER" property="age" />
<result column="dep_id" jdbcType="CHAR" property="depId" />
<result column="dept_name" jdbcType="VARCHAR" property="deptName" />
<result column="image_url" jdbcType="VARCHAR" property="imageUrl" />
<result column="location" jdbcType="VARCHAR" property="location" />
<result column="per_status" jdbcType="VARCHAR" property="perStatus" />
</resultMap>
<sql id="Base_Column_List">
user_id, account, password, name, nikname, gender, age, dep_id, dept_name, image_url,
location, per_status
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
where user_id = #{userId,jdbcType=VARCHAR}
</select> <!--
useGeneratedKeys="true" 来取出 由数据库内部生成的主键
keyProperty="userId" 获得主键值后将其赋值给 userId 属性
只对主键自增长有效
-->
<insert id="insert" parameterType="test.entity.User" useGeneratedKeys="true" keyProperty="userId">
insert into user (user_id, account, password,
name, nikname, gender,
age, dep_id, dept_name,
image_url, location, per_status
)
values (#{userId,jdbcType=VARCHAR}, #{account,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
#{name,jdbcType=VARCHAR}, #{nikname,jdbcType=VARCHAR}, #{gender,jdbcType=INTEGER},
#{age,jdbcType=INTEGER}, #{depId,jdbcType=CHAR}, #{deptName,jdbcType=VARCHAR},
#{imageUrl,jdbcType=VARCHAR}, #{location,jdbcType=VARCHAR}, #{perStatus,jdbcType=VARCHAR}
)
<!-- 将生成的主键赋给属性userId,对于不是自增长主键的表也有用
order :mysql中用AFTER;oracle中用BEFORE
-->
<selectKey keyColumn="user_id" resultType="string" keyProperty="userId" order="AFTER">
SELECT LAST INSERT ID ()
</selectKey>
</insert> <select id="selectInfo" resultType="test.entity.User">
select
<include refid="Base_Column_List" />
from user
where gender =#{gender} and age = #{age} </select> <!-- 动态sql用到的标签
<if test="userName != null and userName != ''"></if> 通过参数来判断是否使用某个语句 <choose> 上面的<if>标签只能实现if条件,<choose>标签则能实现if...else if...else 的逻辑
<when test=""></when>
<when test=""></when>
<otherwise></otherwise>
</choose> <where></where> 如果该标签中包含有内容则在前面插入一个where,如果<where>后面的字符串是AND 或者 OR开头 则将AND或OR去掉 <set></set> 如果该标签中包含有内容则在前面插入一个set,如果<where>后面的字符串是以逗号(,)结尾,则将逗号去掉 <trim prefix="WHERE" prefixOverrides="AND |OR" > ... </trim> 实现where标签功能
<trim prefix="SET" suffixOverrides="," > ... </trim> 实现set标签功能
trim 标签有如下属性:
prefix:当 trim 元素内包含内容时,会给内容增加 prefix 指定的前缀。
prefixOverrides:当 trim 元素内包含内容时,会把内容中匹配的前缀字符串去掉。
suffix:当 trim 元素内包含内容时,会给内容增加 suffix 指定的后缀。
suffixOverrides :当 trim 元素内包含内容时,会把内容中匹配的后缀字符串去掉。 <foreach collection="" index="" item="" separator="" open="" close=""></foreach>
foreach 包含以下属性:
collection: 必填,值为要选代循环的属性名。这个属性值的情况有很多。
1.参数为list时collection的值为list
2.参数为array时collection的值为array
3.参数为map时,collection的值为map集合对应的key
item:变量名,值为从法代对象中取出的每一个值。
index:索引的属性名,在集合数组情况下值为当前索引值, 当选代循环的对象是 Map类型时,这个值为 Map 的 key(键值)。
open:整个循环内容开头的字符串 。
close: 整个循环内容结尾的字符串。
separator:每次循环的分隔符。
--> </mapper>
public static void xmlConfig(){
SqlSession session = MybatisUtil.openSession();
//使用namespace+sql的id来保证唯一性
User user = (User)session.selectOne("test.dao.UserMapper.selectByPrimaryKey", "d96b17cbce8c11e79871f07959e0e549");
System.out.println(user);
MybatisUtil.closeSession();
}
2.使用接口对数据库进行操作
/**
*使用mybatis接口对数据库进行操作的时候需要接口的全路径名与映射文件中的namespace相同,这是接口与映射文件之间的关联
*接口的方法要和sql的id一致,否则无法找到对应的sql
*接口之所以没有实现类也能正常调用,因为使用了动态代理
*/
public interface UserMapper { /**
* 对于多参数的情况,可以使用Map封装参数,也可以使用@Param注解来进行标注
*/
User selectInfo(@Param("gender") int gender, @Param("age") int age); }
<?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">
<!--
如果不和接口关联则namespace只要唯一就行
如果和接口关联则namespace需要和接口全类名一致
-->
<mapper namespace="test.dao.UserMapper">
<resultMap id="BaseResultMap" type="test.entity.User">
<id column="user_id" jdbcType="VARCHAR" property="userId" />
<result column="account" jdbcType="VARCHAR" property="account" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="nikname" jdbcType="VARCHAR" property="nikname" />
<result column="gender" jdbcType="INTEGER" property="gender" />
<result column="age" jdbcType="INTEGER" property="age" />
<result column="dep_id" jdbcType="CHAR" property="depId" />
<result column="dept_name" jdbcType="VARCHAR" property="deptName" />
<result column="image_url" jdbcType="VARCHAR" property="imageUrl" />
<result column="location" jdbcType="VARCHAR" property="location" />
<result column="per_status" jdbcType="VARCHAR" property="perStatus" />
</resultMap>
<sql id="Base_Column_List">
user_id, account, password, name, nikname, gender, age, dep_id, dept_name, image_url,
location, per_status
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
where user_id = #{userId,jdbcType=VARCHAR}
</select> </mapper>
/**
* 使用接口进行操作
*/
public static void testInterface(){
SqlSession session = MybatisUtil.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.selectByPrimaryKey("d96b17cbce8c11e79871f07959e0e549");
System.out.println(user); User user2 = userMapper.selectInfo(1, 28);
System.out.println(user2); MybatisUtil.closeSession();
}
3.使用注解操作数据库,不需要映射文件文件中有sql,但还是需要mapper文件。
/**
*使用mybatis接口对数据库进行操作的时候需要接口的全路径名与映射文件中的namespace相同,这是接口与映射文件之间的关联
*接口的方法要和sql的id一致,否则无法找到对应的sql
*接口之所以没有实现类也能正常调用,因为使用了动态代理
*/
public interface UserMapper { @Select("select user_id, account, password, name, nikname "
+ "from user where user_id = #{userId}")
User selectByPrimaryKey2(String UserId); }
public static void testAnnotation(){
SqlSession session = MybatisUtil.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.selectByPrimaryKey2("d96b17cbce8c11e79871f07959e0e549");
System.out.println(user);
MybatisUtil.closeSession();
}
四、mybatis的高级映射
<?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">
<!--
如果不和接口关联则namespace只要唯一就行
如果和接口关联则namespace需要和接口全类名一致
-->
<mapper namespace="test.dao.User2Mapper">
<resultMap id="UserResultMap" type="test.entity.User2">
<id column="user_id" jdbcType="VARCHAR" property="userId" />
<result column="account" jdbcType="VARCHAR" property="account" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="nikname" jdbcType="VARCHAR" property="nikname" />
<result column="gender" jdbcType="INTEGER" property="gender" />
<result column="age" jdbcType="INTEGER" property="age" />
<result column="image_url" jdbcType="VARCHAR" property="imageUrl" />
<result column="location" jdbcType="VARCHAR" property="location" />
<result column="per_status" jdbcType="VARCHAR" property="perStatus" />
</resultMap>
<resultMap id="BaseResultMap1" type="test.entity.User2" extends="UserResultMap">
<id column="user_id" jdbcType="VARCHAR" property="userId" />
<result column="account" jdbcType="VARCHAR" property="account" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="nikname" jdbcType="VARCHAR" property="nikname" />
<result column="gender" jdbcType="INTEGER" property="gender" />
<result column="age" jdbcType="INTEGER" property="age" />
<result column="image_url" jdbcType="VARCHAR" property="imageUrl" />
<result column="location" jdbcType="VARCHAR" property="location" />
<result column="per_status" jdbcType="VARCHAR" property="perStatus" />
<result column="dep_id" jdbcType="CHAR" property="dept.depId" />
<result column="dept_name" jdbcType="CHAR" property="dept.deptName" />
</resultMap>
<resultMap id="BaseResultMap2" type="test.entity.User2" extends="UserResultMap">
<association property="dept" javaType="test.entity.Dept" resultMap="test.dao.DeptMapper.BaseResultMap">
<!-- 如果用 resultMap 就无需配置下面的result标签,相当于是用DeptMapper.xml文件中的resultMap-->
<!-- <result column="dep_id" jdbcType="CHAR" property="depId" />
<result column="dept_name" jdbcType="CHAR" property="deptName" /> -->
</association>
</resultMap>
<resultMap id="BaseResultMap3" type="test.entity.User2" extends="UserResultMap">
<association property="dept" column="deptId"
select="test.dao.DeptMapper.selectByPrimaryKey"></association>
</resultMap>
<resultMap id="BaseResultMap4" type="test.entity.User3" extends="BaseResultMap2">
<collection property="roleList" javaType="java.util.List" ofType="test.entity.Role"
resultMap="test.dao.RoleMapper.BaseResultMap">
</collection>
</resultMap>
<resultMap id="BaseResultMap5" type="test.entity.User3" extends="BaseResultMap2">
<collection property="roleList" column="rid"
select="test.dao.RoleMapper.selectByPrimaryKey">
</collection>
</resultMap> <!-- 一对一映射的三种方式
1.通过属性.子属性直接进行映射;
2.通过resultMap来进行映射;
3.使用 resultMap 的 association 标签配置一对一映射
4.通过association 标签的嵌套查询,这种方式与根据业务逻辑于动执行多次 SQL 的方式相像,最后会将结果组 合成一个对象。
-->
<!-- 1.使用resultMap进行一对一映射 -->
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap1">
select
*
from user
where user_id = #{userId,jdbcType=VARCHAR}
</select>
<!-- 2.直接进行一对一映射 -->
<select id="selectByPrimaryKey2" parameterType="java.lang.String" resultType="test.entity.User2">
SELECT
user_id AS userId,
account AS account,
`password` AS `password`,
`name` AS `name`,
nikname AS nikname,
gender AS gender,
age AS age,
image_url AS imageUrl,
location AS location,
per_status AS perStatus,
dep_id AS `dept.depId`,
dept_name AS `dept.deptName`
FROM `user`
WHERE user_id = #{userId,jdbcType=VARCHAR}
</select>
<!-- 3.使用 resultMap 的 association 标签配置一对一映射 -->
<select id="selectByPrimaryKey3" parameterType="java.lang.String" resultMap="BaseResultMap2">
select
*
from user
where user_id = #{userId,jdbcType=VARCHAR}
</select>
<!-- 4.通过association 标签的嵌套查询,这种方式与根据业务逻辑于动执行多次 SQL 的方式相像,最后会将结果组 合成一个对象。 -->
<select id="selectByPrimaryKey4" parameterType="java.lang.String" resultMap="BaseResultMap3">
select
*
from user
where user_id = #{userId,jdbcType=VARCHAR}
</select> <!-- 两种一对多映射方式
5.collection 集合的嵌套结果映射
6.collection 集合的嵌套查询 (这种方式貌似有bug,只能查出一个角色,不推荐使用。以后再找原因)
-->
<!-- 5.collection 集合的嵌套结果映射 -->
<select id="selectByPrimaryKey5" parameterType="java.lang.String" resultMap="BaseResultMap4">
SELECT
user.*,
role.*
FROM USER
INNER JOIN user_role ON user.user_id = user_role.user_id
INNER JOIN role ON user_role.role_id = role.role_id
WHERE user.user_id = #{userId,jdbcType=VARCHAR}
</select>
<!-- 6.collection 集合的嵌套查询 (这种方式貌似有bug,只能查出一个角色,不推荐使用。以后再找原因) -->
<select id="selectByPrimaryKey6" parameterType="java.lang.String" resultMap="BaseResultMap5">
SELECT
user.*,
user_role.role_id as rid
FROM USER
INNER JOIN user_role ON user.user_id = user_role.user_id
WHERE user.user_id = #{userId,jdbcType=VARCHAR}
</select> <!-- mybatis 执行存储过程
1.不要将出参和返回混淆,返回是通过return接受;出参是通过入参的Map和javaBean来接受,不过属性要有对应的setter
2.入参不需要写jdbcType,出参一定要写jdbcType
3.出参和入参最好不要和表中的字段一样,否则可能会出现问题
-->
<!--
DELIMITER ;; DROP PROCEDURE IF EXISTS `selectUserByAccount`;; CREATE PROCEDURE `selectUserByAccount`(IN saccount VARCHAR(50))
BEGIN
SELECT
`name` ,
nikname
FROM
`user`
WHERE account = saccount; END;; DELIMITER ; -->
<select id="selectUserByAccount" statementType="CALLABLE" useCache="false" resultMap="UserResultMap">
{
call selectUserByAccount(
#{account,mode=IN}
)
}
</select> <!--
DELIMITER ;; DROP PROCEDURE IF EXISTS `selectUserByAccount2`;; CREATE PROCEDURE `selectUserByAccount2`(IN saccount VARCHAR(50),OUT `oname` VARCHAR(80),OUT onikname VARCHAR(80))
BEGIN
SELECT
`name` ,
nikname INTO `oname`,onikname
FROM
`user`
WHERE account = saccount; END;; DELIMITER ;
-->
<select id="selectUserByAccount2" statementType="CALLABLE" useCache="false">
{
call selectUserByAccount2(
#{saccount,mode=IN},
#{oname,mode=OUT,jdbcType=VARCHAR},
#{onikname,mode=OUT,jdbcType=VARCHAR}
)
}
</select> </mapper>
public interface User2Mapper { User2 selectByPrimaryKey(String userId); User2 selectByPrimaryKey2(String userId); User2 selectByPrimaryKey3(String userId); User3 selectByPrimaryKey5(String string); User3 selectByPrimaryKey6(String string); User2 selectUserByAccount(String string); void selectUserByAccount2(Map<String,String> map); }
public class testService2 { /**
* 一对一
*/
public static void testOneToOne(){
SqlSession session = MybatisUtil.openSession();
User2Mapper user2Mapper = session.getMapper(User2Mapper.class);
User2 user21 = user2Mapper.selectByPrimaryKey("d96b17cbce8c11e79871f07959e0e549");
User2 user22 = user2Mapper.selectByPrimaryKey2("d96b17cbce8c11e79871f07959e0e549");
User2 user23 = user2Mapper.selectByPrimaryKey3("d96b17cbce8c11e79871f07959e0e549");
User2 user24 = user2Mapper.selectByPrimaryKey3("d96b17cbce8c11e79871f07959e0e549");
System.out.println(user21);
System.out.println(user22);
System.out.println(user23);
System.out.println(user24); MybatisUtil.closeSession();
}
/**
* 一对多
*/
public static void testOneToMany(){
SqlSession session = MybatisUtil.openSession();
User2Mapper user2Mapper = session.getMapper(User2Mapper.class);
User3 user31 = user2Mapper.selectByPrimaryKey5("d96b17cbce8c11e79871f07959e0e549");
User3 user32 = user2Mapper.selectByPrimaryKey6("d96b17cbce8c11e79871f07959e0e549");
System.out.println(user31);
System.out.println(user32); MybatisUtil.closeSession();
} /**
* 存储过程
*/
public static void testCallable(){
SqlSession session = MybatisUtil.openSession();
User2Mapper user2Mapper = session.getMapper(User2Mapper.class);
User2 user21 = user2Mapper.selectUserByAccount("80074567");
System.out.println(user21); Map<String,String> map = new HashMap<>();
map.put("saccount", "80074567");
user2Mapper.selectUserByAccount2(map);
System.out.println(map);//出参直接从map中可以获取 MybatisUtil.closeSession(); } public static void main(String[] args) throws IOException {
//testOneToOne();
//testOneToMany();
testCallable();
} }
五、mybatis缓存
1.mybatis有两级缓存,第一级默认开启,无法控制;
MyBatis 的一级缓存存在于 SqlSession 的生命周期中,在同一个 SqlSession 中查询 时, MyBatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个 Map 对象中。
如果同一个 SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的 键值,当 Map 缓存对象中己经存在该键值时,则会返回缓存中的对象。
2.第二级缓存存在于SqlSessionFacotry的生命周期中。
在 MyBatis的全局配置 settings中有 一个参数 cacheEnabled,这个参数是二级缓存的全局开关,默认值是 true,初始状态 为启用状态。
如果把这个参数设置为 false,即使有后面的二级缓存配置,也不会生效。 由于这个参数值默认为 true ,所以不必配置,如果想要配置,
可以在 mybatis-config.xml中配置如下:
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
在保证二级缓存的全局配置开启的情况下,给 RoleMapper.xml 开启 二级缓存只需要在 UserMapper.xml
中添加<cache/>元素即可,添加后的 UserMapper.xml 如下。
六、mybatis代码生成器:eclipse需要下载插件MyBatis Generator才能执行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- <properties></properties> -->
<classPathEntry location="C:\Users\007\.m2\repository\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar"/>
<context id="table2Object" targetRuntime="MyBatis3" defaultModelType="flat">
<commentGenerator>
<property name="suppressDate" value="true" />
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/zmyproject"
userId="root"
password="root">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成实体类地址 -->
<javaModelGenerator targetPackage="mybatis.entity"
targetProject="testProject">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成mapxml文件 -->
<sqlMapGenerator targetPackage="mapper"
targetProject="testProject">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 生成mapxml对应client,也就是接口dao -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="mybatis.dao" targetProject="testProject">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table tableName="role" domainObjectName="Role"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false" />
</context>
</generatorConfiguration>
mybtis 基础的更多相关文章
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- node-webkit 环境搭建与基础demo
首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Golang, 以17个简短代码片段,切底弄懂 channel 基础
(原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- HTTPS 互联网世界的安全基础
近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
随机推荐
- BZOJ2040[2009国家集训队]拯救Protoss的故乡——模拟费用流+线段树+树链剖分
题目描述 在星历2012年,星灵英雄Zeratul预测到他所在的Aiur行星在M天后会发生持续性暴雨灾害,尤其是他们的首都.而Zeratul作为星灵族的英雄,当然是要尽自己最大的努力帮助星灵族渡过这场 ...
- 【BZOJ1007】【HNOI2008】水平可见直线 几何 单调栈
题目大意 给你\(n\)条直线\(y=kx+b\),问你从\(y\)值为正无穷大处往下看能看到那些直线. \(1\leq n\leq 500000\) 题解 如果对于两条直线\(l_i,l_j\),\ ...
- rar自动压缩备份
rem ******MySQL backup start********@echo offforfiles /p "D:\备份\发布软件备份" /m backup_*.sql -d ...
- 「CodeForces 581D」Three Logos
BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形 ...
- BZOJ 5097: [Lydsy1711月赛]实时导航(最短路 + bitset)
题意 \(n\) 个点的有向图,边权 \(\in \{1, 2, 3, 4\}\) ,\(m\) 次修改边权/加边/删边,\(q\) 次询问:以 \(s_i\) 为起点,输出它到其他点的最短 ...
- 使用 Zabbix 监控 Jenkins
笔者最近的工作涉及到使用 Zabbix 监控 Jenkins.在谷歌上搜索到的文章非常少,能操作的就更少了.所以决定写一篇文章介绍如何使用 Zabbix 监控 Jenkins. 下图为整体架构图: 整 ...
- 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)
[LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...
- SCOI2008着色方案(记忆化搜索)
有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即 c1+c2+...+ck=n.相邻两个木块涂相同色显得很难 ...
- Redis主从复制与高可用方案
redis简单介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.Redis与其他key – value缓存产品有以下三个特点: 支持数据的持久化,可以将内存中 ...
- Libre OJ 144、145 (DFS序)
部分参考自博客:https://blog.csdn.net/hpu2022/article/details/81910490 在许多问题中,由于树结构复杂通常会导致问题很棘手,因为其实非线性结构,操作 ...