黑马学习连接池 druid JdbcTemplate c3p0 池技术
package cn.itcast.jdbctemplate; import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate; import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map; /*
* 1. 要求 JdbcTemplate
* 2. jdbcUtils工具类直接拿来用(druid.properties)
* 3. 插入员工数据(完整的)
* 4. 删除员工数据(按照员工编号删除)
* 5. 修改员工数据(修改李逵的工资、奖金、部门)
* 6. 查询所有工资大于20000万的员工, 按工资降序排列
* 7. 查询所有在 2007-5-1 之后入职的员工
* 8. 按部门分组,统计每组的人数
*
* 分析:
* 1.使用jdbctemplate+druid来进行测试,准备一个DataSource对象,来创建JdbcTemplate对象
*
* */
public class JdbcTemplate_Test {
private JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidJdbcUtils.getDataSource());
/**
* 插入员工数据(完整的)
*/
@Test
public void test1(){
Employee emp = new Employee();
emp.setId(1015);
emp.setEname("小白龙");
emp.setJobId(4);
emp.setMgr(1004);
emp.setJoindate(new Date());
emp.setSalary(new BigDecimal(3000));
emp.setBonus(new BigDecimal(8000));
emp.setDeptId(20); String sql = "insert into emp(id, ename, job_id, mgr, joindate, salary, bonus, dept_id) values(?,?,?,?,?,?,?,?)"; int rows = jdbcTemplate.update(sql, emp.getId(), emp.getEname(), emp.getJobId(), emp.getMgr(),
emp.getJoindate(), emp.getSalary(), emp.getBonus(), emp.getDeptId());
System.out.println(rows);
} /**
* 删除员工数据(按照员工编号删除)
*/
@Test
public void test2(){
String sql = "delete from emp where id = ?";
int rows = jdbcTemplate.update(sql, 1015);
System.out.println(rows);
} /**
* 修改员工数据(修改李逵的工资、奖金、部门)
*/
@Test
public void test3(){
String sql = "update emp set salary = ?, bonus = ?, dept_id = ? where ename = ? ";
int rows = jdbcTemplate.update(sql, 2000, 2000, 20, "李逵");
System.out.println(rows);
} /**
* 查询所有工资大于20000万的员工, 按工资降序排列
*/
@Test
public void test4(){
// TimeZone.setDefault(TimeZone.getTimeZone("GMT+10:00"));数据库是Date类型的,这里修改默认时区根本不影响结果。
String sql = "select id, ename, job_id as jobId, mgr, joindate, salary, bonus, dept_id as deptId from emp where salary > ? ";
List<Employee> employeeList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Employee.class), 20000);
employeeList.forEach(System.out::println);
} /**
* 按部门分组,统计每组的人数
*/
@Test
public void test5(){
String sql = "select\n" +
"\tcount(t1.id) as employee_num, t2.id as id, t2.dname as dname\n" +
"FROM\n" +
"emp as t1\n" +
"right join \n" +
"dept as t2\n" +
"on \n" +
"t1.dept_id = t2.id\n" +
"GROUP BY\n" +
"t2.id";
List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);
mapList.forEach(System.out::println);
}
}
JdbcTemplate操作员工表
package cn.itcast.jdbctemplate; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; public class DruidJdbcUtils {
//DataSource对象
private static DataSource dataSource; static {
try {
//加载配置
Properties props = new Properties();
props.load(DruidJdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties")); //创建德鲁伊连接池
dataSource = new DruidDataSourceFactory().createDataSource(props);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} //获取连接池
public static DataSource getDataSource(){
return dataSource;
} //获取连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
} //DML语句释放资源
public static void release(Statement stmt, Connection conn){
/* if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}*/
release(null, stmt, conn);
} //查询语句释放资源
public static void release(ResultSet rs, Statement stmt, Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
DruidJbctUtils数据库连接工具类
package cn.itcast.jdbctemplate; import java.math.BigDecimal;
import java.util.Date; /*
CREATE TABLE emp (
id INT PRIMARY KEY, -- 员工id
ename VARCHAR(50), -- 员工姓名
job_id INT, -- 职务id
mgr INT , -- 上级领导
joindate DATE, -- 入职日期
salary DECIMAL(7,2), -- 工资
bonus DECIMAL(7,2), -- 奖金
dept_id INT, -- 所在部门编号
);
*/
public class Employee {
private Integer id;
private String ename;
private Integer jobId;
private Integer mgr;
private Date joindate;
private BigDecimal salary;
private BigDecimal bonus;
private Integer deptId; public Employee() {
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getEname() {
return ename;
} public void setEname(String ename) {
this.ename = ename;
} public Integer getJobId() {
return jobId;
} public void setJobId(Integer jobId) {
this.jobId = jobId;
} public Integer getMgr() {
return mgr;
} public void setMgr(Integer mgr) {
this.mgr = mgr;
} public Date getJoindate() {
return joindate;
} public void setJoindate(Date joindate) {
this.joindate = joindate;
} public BigDecimal getSalary() {
return salary;
} public void setSalary(BigDecimal salary) {
this.salary = salary;
} public BigDecimal getBonus() {
return bonus;
} public void setBonus(BigDecimal bonus) {
this.bonus = bonus;
} public Integer getDeptId() {
return deptId;
} public void setDeptId(Integer deptId) {
this.deptId = deptId;
} @Override
public String toString() {
return "Employee{" +
"id=" + id +
", ename='" + ename + '\'' +
", jobId=" + jobId +
", mgr=" + mgr +
", joindate=" + joindate +
", salary=" + salary +
", bonus=" + bonus +
", deptId=" + deptId +
'}';
}
}
Employee实体
package utils; import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties; public class JDBCUtils {
//连接参数
private static String driver;
private static String url;
private static String user;
private static String password; static{
try {
//读取配置
Properties props = new Properties();
//方式一
// props.load(JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
//方式二
ClassLoader cl = JDBCUtils.class.getClassLoader();
URL resource = cl.getResource("jdbc.properties");
//D:/Code/IdeaProject/IdeaCode/javaweb-T1/out/production/jdbc-day01/jdbc.properties
System.out.println(resource.getPath());
props.load(new FileReader(resource.getPath())); //赋值
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password"); //加载驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} //获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
} //释放资源
public static void release(Statement stmt, Connection conn){
release(null, stmt, conn);
} public static void release(ResultSet rs, Statement stmt, Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JdbcUtils简单版工具类
package conn; import utils.JDBCUtils; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException; public class ConnAndSql {
public static void main(String[] args) throws SQLException {
long start = System.currentTimeMillis();
Connection conn = JDBCUtils.getConnection();
long end = System.currentTimeMillis(); System.out.println("获取连接:" + (end - start)); start = System.currentTimeMillis();
String sql = "select * from account";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.executeQuery();
end = System.currentTimeMillis(); System.out.println("执行sql:" + (end - start)); /*
获取连接:543
执行sql:18
*/
}
}
获取连接的时间花费远远超出了执行sql的时间,,需要使用池技术,管理连接。
package pro01.service; import pro01.dao.EmployeeDao;
import pro01.domain.Employee; import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.List;
import java.util.Scanner; public class EmployeeMain {
private static EmployeeDao employeeDao = new EmployeeDao(); private static final String prompt = "user>"; public static void main(String[] args) {
//显式主界面,并给出提示
showMain(); Scanner sc = new Scanner(System.in);
while(true){ System.out.print(prompt); String line = sc.nextLine();
switch (line.trim().toLowerCase()){
case "1" :
findAllProc();break;
case "2" :
deleteProc();break;
case "3" :
insertProc();break;
case "4" :
updateProc();break;
case "5" :
showMain();break;
case "exit" :
return;
default:
System.out.println("输入有误,请重新输入!");
}
}
} private static void showMain() {
System.out.println("1 查询所有员工信息");
System.out.println("2 删除员工");
System.out.println("3 新增员工");
System.out.println("4 修改员工信息");
System.out.println("5 显示主界面");
System.out.println("exit 退出程序");
} private static void updateProc() {
//请输入要修改的员工编号
Scanner sc = new Scanner(System.in);
System.out.println("请输入要修改的员工编号");
System.out.print(prompt); //获取id
String idStr = sc.nextLine();
Integer id = null;
try{
id = Integer.parseInt(idStr);
} catch (NumberFormatException e){
System.out.println("输入有误");
return;
} //根据id,查找用户,判断是否存在
Employee employee = employeeDao.findById(id);
if(employee == null){
System.out.println("员工不存在");
return;
} //封装修改条件
employee = new Employee();
employee.setId(id); //姓名
System.out.println("请输入员工姓名");
System.out.print(prompt);
String name = sc.nextLine();
if(!"".equals(name.trim())){
employee.setName(name);
} //薪水
System.out.println("请输入员工薪水");
System.out.print(prompt);
String salaryStr = sc.nextLine();
if(!"".equals(salaryStr.trim())){
try{
BigDecimal salary = new BigDecimal(salaryStr);
employee.setSalary(salary);
}catch (NumberFormatException e){
System.out.println("输入的薪水应该是数字");
return;
}
} boolean isSuccess = false;
try {
isSuccess = employeeDao.updateById(employee);
} catch (SQLException e) {
System.out.println("数据库错误");
return;
}
if(isSuccess){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
} private static void insertProc() {
Scanner sc = new Scanner(System.in);
//员工编号
System.out.println("请输入员工编号:");
System.out.print(prompt);
String idStr = sc.nextLine();
int id;
try{
id = Integer.parseInt(idStr);
} catch (NumberFormatException e) {
System.out.println("员工编号输入错误,只能是正数");
return;
}
//员工姓名
System.out.println("请输入员工姓名:");
System.out.print(prompt);
String name = sc.nextLine();
//员工薪资
System.out.println("请输入员工薪资:");
System.out.print(prompt);
String salaryStr = sc.nextLine();
BigDecimal salary = null;
try{
salary = new BigDecimal(salaryStr);
}catch (NumberFormatException e){
System.out.println("工资必须为有效的数字");
return;
} Employee employee = new Employee();
employee.setId(id);
employee.setName(name);
employee.setSalary(salary); boolean isSuccess = false;
try {
isSuccess = employeeDao.add(employee);
} catch (SQLException e) {
System.out.println("数据库错误");
return;
}
if(isSuccess){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
} private static void deleteProc() {
//请输入要删除的员工编号
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除的员工编号");
System.out.print(prompt); //获取id
String idStr = sc.nextLine();
int id;
try{
id = Integer.parseInt(idStr);
} catch (NumberFormatException e){
System.out.println("输入有误");
return;
} //根据id,查找用户,判断是否存在
Employee employee = employeeDao.findById(id);
if(employee == null){
System.out.println("员工不存在");
return;
} //如果用户存在,则删除用户
boolean isSuccess = employeeDao.deleteById(id);
if(isSuccess){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
} private static void findAllProc() {
List<Employee> list = employeeDao.findAll(); System.out.println("员工编号\t员工姓名\t员工薪资");
list.forEach(e->{
System.out.println(e.getId() + "\t\t" + e.getName() + "\t\t" + e.getSalary());
});
}
}
cmdCRUD 主界面
package pro01.domain; import java.math.BigDecimal; /*
create table employee(
id int primary key auto_increment,
name varchar(50),
salary DECIMAL
);
*/
public class Employee {
private Integer id;
private String name;
private BigDecimal salary; public Employee() {
} 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 BigDecimal getSalary() {
return salary;
} public void setSalary(BigDecimal salary) {
this.salary = salary;
}
}
cmdCRUD 员工类
package pro01.dao; import pro01.domain.Employee; import java.sql.*;
import java.util.ArrayList;
import java.util.List; public class EmployeeDao {
/**
* 查询全部员工信息
* @return
*/
public List<Employee> findAll() {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3307/jdbc_db";
String user = "root";
String password = "root"; Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null; List<Employee> employeeList = new ArrayList<>();
try {
//连接
conn = DriverManager.getConnection(url, user, password);
//语句
String sql = "select * from employee";
pstmt = conn.prepareStatement(sql);
//执行
rs = pstmt.executeQuery();
while(rs.next()){
//读取记录数据,封装为Employee对象
Employee emp = new Employee();
emp.setId(rs.getInt("eid"));
emp.setName(rs.getString("ename"));
emp.setSalary(rs.getBigDecimal("salary")); //将员工添加到集合
employeeList.add(emp);
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return employeeList;
} public Employee findById(int id) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3307/jdbc_db";
String user = "root";
String password = "root"; Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null; Employee employee = null;
try {
//连接
conn = DriverManager.getConnection(url, user, password);
//语句
String sql = "select * from employee where eid = ? ";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
//执行
rs = pstmt.executeQuery();
if(rs.next()){
//读取记录数据,封装为Employee对象
employee = new Employee();
employee.setId(rs.getInt("eid"));
employee.setName(rs.getString("ename"));
employee.setSalary(rs.getBigDecimal("salary"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return employee;
} public boolean deleteById(int id) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3307/jdbc_db";
String user = "root";
String password = "root"; Connection conn = null;
PreparedStatement pstmt = null;
try{
//获取连接对象
conn = DriverManager.getConnection(url, user, password);
//获取语句
String sql = "delete from employee where eid = ? ";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
//执行
int count = pstmt.executeUpdate();
//如果条数大于0,表示删除成功
return count > 0 ? true : false;
} catch (SQLException e) {
e.printStackTrace();
} finally{
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return false;
} public boolean add(Employee employee) throws SQLException {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3307/jdbc_db";
String user = "root";
String password = "root"; Connection conn = null;
PreparedStatement pstmt = null;
try{
//获取连接对象
conn = DriverManager.getConnection(url, user, password);
//获取语句
String sql = "insert into employee(eid, ename, salary) values(?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, employee.getId());
pstmt.setString(2,employee.getName());
pstmt.setBigDecimal(3, employee.getSalary());
//执行
int count = pstmt.executeUpdate();
//如果条数大于0,表示删除成功
return count > 0 ? true : false;
} finally{
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
} public boolean updateById(Employee employee) throws SQLException {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3307/jdbc_db";
String user = "root";
String password = "root"; Connection conn = null;
PreparedStatement pstmt = null;
try{
//获取连接对象
conn = DriverManager.getConnection(url, user, password);
//获取语句
ArrayList<Object> args = new ArrayList<>();
StringBuilder sb = new StringBuilder(); if(employee.getName() != null){
sb.append(",ename=? ");
args.add(employee.getName());
}
if(employee.getSalary() != null){
sb.append(",salary=? ");
args.add(employee.getSalary());
} int argsNum = args.size();
if(argsNum == 0){
return false;
}
String sql = "update employee set " + sb.deleteCharAt(0).toString() + "where eid=? "; pstmt = conn.prepareStatement(sql); for (int i = 0; i < argsNum; i++) {
pstmt.setObject(i + 1, args.get(i));
}
pstmt.setObject(argsNum + 1, employee.getId());
//执行
int count = pstmt.executeUpdate();
//如果条数大于0,表示删除成功
return count > 0 ? true : false;
} finally{
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
cmdCRUD 数据库操作类employeeDao
黑马学习连接池 druid JdbcTemplate c3p0 池技术的更多相关文章
- 数据库连接池 - (druid、c3p0、dbcp)
概述: 在这里所谓的数据库连接是指通过网络协议与数据库服务之间建立的TCP连接.通常,与数据库服务进行通信的网络协议无需由应用程序本身实现. 原因有三: 实现复杂度大,需要充分理解和掌握相应的通信协议 ...
- 数据库连接池 Druid和C3p0
datasource.properties数据源 #数据源 datasource.peoperties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc: ...
- spring下,druid,c3p0,proxool,dbcp四个数据连接池的使用和配置
由于那天Oracle的数据连接是只能使用dbcp的数据库连接池才连接上了,所以决定试一下当下所有得数据库连接池连接orcale和mysql,先上代码 配置文件的代码 #================ ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- java常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- DataSource - 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- 数据库连接池优化配置(druid,dbcp,c3p0)
主要描述了数据库连接池参数配置的准则,针对常用的数据库连接池(c3p0,dbcp,druid)给出推荐的配置. 考虑因素 1:当前连接DB的规模 2:并发情况 3:执行db的响应时间 配置考虑 1 ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明.RP
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明(转)
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
随机推荐
- 第五章 Java中锁
Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁).在Lock接口出现之前,Java程序 ...
- Struts旅程(六)Struts页面转发控制ActionForward和ActionMapping
转自:https://blog.csdn.net/lovesummerforever/article/details/19125933
- python的print字符串的输出
字符串的输出使用print语句,在每个语句的输出的时候我们使用' '和" "来包含字符串比如: 如果有多个字符串的话呢我们需要用”,“来进行连接: 我们不仅可以使用字符来进行输出时 ...
- 【260】centos设置root密码
怎么进Linux单用户模式 http://tieba.baidu.com/p/2216642385 http://jingyan.baidu.com/article/c1a3101ea68dafde6 ...
- kernel下制作动态logo
kernel下制作动态logo 在uboot中实现logo的好处是反映速度快. 在kernel中实现logo的好处是,不管是android还是什么其他平台,logo显示无需考虑上层平台. 参照三星平台 ...
- activity状态保存的bundl对象存放位置的思考
我们知道,当activity被异常终止时,可以把一些信息保存到bundle对象中,在下次启动时恢复. 那么,这个bundle对象是保存在哪里的呢? 这种状态保存的方法针对的是activity而不是进程 ...
- springBoot 案例
一.工具 JDK1.7 Eclipse Maven 这里Eclipse集成Maven的这一步就省了! 二.编码 新建Maven Project 命名为:SpringBootDemo 选项如图 2.修改 ...
- go语言的源码文件的分类及含义
Go源码文件:名称以.go为后缀,内容以Go语言代码组织的文件 多个Go源码文件是需要用代码包组织起来的 源码文件分为三类:命令源码文件.库源码文件(go语言程序) 测试源码文件(辅助源码文件) 命令 ...
- 【摘自张宴的"实战:Nginx"】Nginx的server指令
server 语法:server name[parameters] 默认值:none 使用环境:upstream 该指令用于指定后端服务器的名称和参数.服务器的名称可以是一个域名.一个IP地址.端口号 ...
- ARC102D All Your Paths are Different Lengths
传送门 题目大意 让你构造一个有向图,使得从1到n有L条不同路径且长度分别是0~L-1. 分析 我们不难想到每一对相邻点之间连一条权值为0的边,之后二进制分解,将每一对点之间连一个权值为2^i的边,但 ...