上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(二):Spring-IOC-DI

下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring实现AOP

第3章 Spring实现JDBC

利用springJdbcTemplate实现一个表的简单的增删改查。

事先建表:

CREATE DATABASE STUDENT;

USE STUDENT;

CREATE TABLE STUDENT(
ID INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
AGE INT NOT NULL,
SEX TINYINT(1) UNSIGNED DEFAULT 0 NOT NULL
)AUTO_INCREMENT = 100000; INSERT INTO STUDENT(NAME,AGE,SEX) VALUES("STEVEN",31,1);
INSERT INTO STUDENT(NAME,AGE) VALUES("LUCY",28);

注入数据库连接的四要素(数据库类型、地址、用户名、密码):

  • 引入数据库驱动包

    mysql-connector-java-5.1.39-bin.jar

    ojdbc5.jar
  • 引入spring-jdbc的jar包

    spring-jdbc-4.2.1.RELEASE.jar

    spring-tx-4.2.1.RELEASE.jar(跟事务相关)

3.1 实现方式1:配置文件方式

3.1.1 实体类

package com.steven.spring.sysmgr.entity;

import java.io.Serializable;

/**
* 实体类
* @author chenyang
*
*/
public class Student implements Serializable{
/**
*
*/
private static final long serialVersionUID = -3587920774423955014L; public Student(){ } private int id;
private String name;
private int age;
private int sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
} }

3.1.2 DAO层的接口和实现类

1)DAO接口:

package com.steven.spring.sysmgr.dao;

import java.util.List;
import java.util.Map; import com.steven.spring.sysmgr.entity.Student; public interface IStudentDao { public boolean addStudent(Student student); public boolean delStudent(Integer studentId); public boolean updateStudent(Student student); public List<Map<String, Object>> getStudentMap(); public List<Student> getStudentList();
}

2)DAO接口的实现:

package com.steven.spring.sysmgr.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper; import com.steven.spring.sysmgr.dao.IStudentDao;
import com.steven.spring.sysmgr.entity.Student; public class StudentDao implements IStudentDao{ private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
} @Override
public boolean addStudent(Student student) {
boolean flag = false;
String addSql = "INSERT INTO STUDENT(NAME,AGE,SEX) VALUES(?,?,?)";
int rows = this.jdbcTemplate.update(addSql, student.getName(), student.getAge(), student.getSex());
if(rows > 0){
flag = true;
}
return flag;
} @Override
public boolean delStudent(Integer studentId) {
boolean flag = false;
String delSql = "DELETE FROM STUDENT WHERE ID = ?";
int rows = this.jdbcTemplate.update(delSql, studentId);
if(rows > 0){
flag = true;
} return flag;
} @Override
public boolean updateStudent(Student student) {
boolean flag = false;
String updateSql = "UPDATE STUDENT SET NAME=?, AGE=?, SEX=? WHERE ID=? ";
int rows = this.jdbcTemplate.update(updateSql, student.getName(), student.getAge(), student.getSex(), student.getId());
if(rows > 0){
flag = true;
}
return flag;
} @Override
public List<Map<String, Object>> getStudentMap() {
return this.jdbcTemplate.queryForList("SELECT ID,NAME,AGE,SEX FROM STUDENT");
} @Override
public List<Student> getStudentList() {
String querySql = "SELECT ID, NAME, AGE, SEX FROM STUDENT";
//第1种方式:用接口的匿名内部类来实现,优点:可以根据需求做二次改造
/*return this.jdbcTemplate.query(querySql, new RowMapper<Student>(){ @Override
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
Student student = new Student();
student.setId(rs.getInt("ID"));
student.setName(rs.getString("NAME"));
student.setAge(rs.getInt("AGE"));
student.setSex(rs.getInt("SEX"));
return student;
} });*/ //第2种方式:直接将行结果集映射到实体类中,优点:简便
return this.jdbcTemplate.query(querySql, new BeanPropertyRowMapper<Student>(Student.class)); }
}

3.1.3 服务层的接口和实现类

1)服务类接口:

package com.steven.spring.sysmgr.service;

import java.util.List;
import java.util.Map; import com.steven.spring.sysmgr.entity.Student; public interface IStudentService { public boolean addStudent(Student student); public boolean delStudent(Integer studentId); public boolean updateStudent(Student student); public List<Map<String, Object>> getStudentMap(); public List<Student> getStudentList();
}

2)服务类接口的实现,它依赖于IStudentDao:

package com.steven.spring.sysmgr.service.impl;

import java.util.List;
import java.util.Map; import com.steven.spring.sysmgr.dao.IStudentDao;
import com.steven.spring.sysmgr.entity.Student;
import com.steven.spring.sysmgr.service.IStudentService; public class StudentService implements IStudentService{ private IStudentDao studentDao; public void setStudentDao(IStudentDao studentDao) {
this.studentDao = studentDao;
} @Override
public boolean addStudent(Student student) {
// TODO Auto-generated method stub
return this.studentDao.addStudent(student);
} @Override
public boolean delStudent(Integer studentId) {
// TODO Auto-generated method stub
return this.studentDao.delStudent(studentId);
} @Override
public boolean updateStudent(Student student) {
// TODO Auto-generated method stub
return this.studentDao.updateStudent(student);
} @Override
public List<Map<String, Object>> getStudentMap() {
// TODO Auto-generated method stub
return this.studentDao.getStudentMap();
} @Override
public List<Student> getStudentList() {
// TODO Auto-generated method stub
return this.studentDao.getStudentList();
} }

3.1.4 spring-IOC的配置文件

spring-IOC的配置文件applicationContext.xml:利用SpringIOC实现服务类和DAO类的依赖

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 注册服务类,并描述依赖关系 -->
<bean id="studentService" class="com.steven.spring.sysmgr.service.impl.StudentService">
<property name="studentDao" ref="studentDao"/>
</bean> <!-- 注册DAO类 -->
<bean id="studentDao" class="com.steven.spring.sysmgr.dao.impl.StudentDao">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean> <!-- 注册springJdbc查询模板,模板依赖于数据源 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 注册spring自带的管理数据库连接的数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/student"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</bean> </beans>

3.1.5 测试类

package com.steven.spring.sysmgr.test;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.steven.spring.sysmgr.entity.Student;
import com.steven.spring.sysmgr.service.IStudentService; public class SpringJdbcTest {
private ApplicationContext ac; @Before
public void init(){
ac = new ClassPathXmlApplicationContext("applicationContext.xml");
} //模拟增加功能
@Test
public void testAddStudent(){
IStudentService studentService = (IStudentService) ac.getBean("studentService"); Student student = new Student();
student.setName("Jacky");
student.setAge(35);
student.setSex(1); System.out.println(studentService.addStudent(student)); } //模拟删除功能
@Test
public void testDelStudent(){
IStudentService studentService = (IStudentService) ac.getBean("studentService"); int delStudentId = 100000; System.out.println(studentService.delStudent(delStudentId)); } //模拟更改功能
@Test
public void testUpdateStudent(){
IStudentService studentService = (IStudentService) ac.getBean("studentService"); Student student = new Student();
student.setId(100001);
student.setName("Lily");
student.setAge(26);
student.setSex(0); System.out.println(studentService.updateStudent(student)); } //模拟查询功能,返回List<Student>
@Test
public void testGetStudentList(){
IStudentService studentService = (IStudentService) ac.getBean("studentService");
System.out.println(studentService.getStudentList());
} //模拟查询功能,返回List<Map<String, object>>
@Test
public void testGetStudentMap(){
IStudentService studentService = (IStudentService) ac.getBean("studentService");
System.out.println(studentService.getStudentMap());
}
}

3.2 实现方式2:注解方式

1、在服务层接口实现类(@Service(...))和Dao层接口实现类(@Repository(...))中分别加入注解表示符,并声明依赖关系(@Autowired)

1)DAO的实现类

package com.steven.spring.sysmgr.dao.impl;

import java.util.List;
import java.util.Map; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository; import com.steven.spring.sysmgr.dao.IStudentDao;
import com.steven.spring.sysmgr.entity.Student; @Repository("studentDao")
public class StudentDao implements IStudentDao{
@Autowired
private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
} @Override
public boolean addStudent(Student student) {
boolean flag = false;
String addSql = "INSERT INTO STUDENT(NAME,AGE,SEX) VALUES(?,?,?)";
int rows = this.jdbcTemplate.update(addSql, student.getName(), student.getAge(), student.getSex());
if(rows > 0){
flag = true;
}
return flag;
} @Override
public boolean delStudent(Integer studentId) {
boolean flag = false;
String delSql = "DELETE FROM STUDENT WHERE ID = ?";
int rows = this.jdbcTemplate.update(delSql, studentId);
if(rows > 0){
flag = true;
} return flag;
} @Override
public boolean updateStudent(Student student) {
boolean flag = false;
String updateSql = "UPDATE STUDENT SET NAME=?, AGE=?, SEX=? WHERE ID=? ";
int rows = this.jdbcTemplate.update(updateSql, student.getName(), student.getAge(), student.getSex(), student.getId());
if(rows > 0){
flag = true;
}
return flag;
} @Override
public List<Map<String, Object>> getStudentMap() {
return this.jdbcTemplate.queryForList("SELECT ID,NAME,AGE,SEX FROM STUDENT");
} @Override
public List<Student> getStudentList() {
String querySql = "SELECT ID, NAME, AGE, SEX FROM STUDENT";
//第1种方式:用接口的匿名内部类来实现,优点:可以根据需求做二次改造
/*return this.jdbcTemplate.query(querySql, new RowMapper<Student>(){ @Override
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
Student student = new Student();
student.setId(rs.getInt("ID"));
student.setName(rs.getString("NAME"));
student.setAge(rs.getInt("AGE"));
student.setSex(rs.getInt("SEX"));
return student;
} });*/ //第2种方式:直接将行结果集映射到实体类中,优点:简便
return this.jdbcTemplate.query(querySql, new BeanPropertyRowMapper<Student>(Student.class)); }
}

2)服务层的实现类

package com.steven.spring.sysmgr.service.impl;

import java.util.List;
import java.util.Map; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.steven.spring.sysmgr.dao.IStudentDao;
import com.steven.spring.sysmgr.entity.Student;
import com.steven.spring.sysmgr.service.IStudentService; @Service("studentService")
public class StudentService implements IStudentService{
@Autowired
private IStudentDao studentDao; public void setStudentDao(IStudentDao studentDao) {
this.studentDao = studentDao;
} @Override
public boolean addStudent(Student student) {
// TODO Auto-generated method stub
return this.studentDao.addStudent(student);
} @Override
public boolean delStudent(Integer studentId) {
// TODO Auto-generated method stub
return this.studentDao.delStudent(studentId);
} @Override
public boolean updateStudent(Student student) {
// TODO Auto-generated method stub
return this.studentDao.updateStudent(student);
} @Override
public List<Map<String, Object>> getStudentMap() {
// TODO Auto-generated method stub
return this.studentDao.getStudentMap();
} @Override
public List<Student> getStudentList() {
// TODO Auto-generated method stub
return this.studentDao.getStudentList();
} }

2、在配置文件中进行加入约束和扫描包

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 扫描包 -->
<context:component-scan base-package="com.steven.spring.sysmgr"></context:component-scan> <!-- 注册springJdbc查询模板,模板依赖于数据源 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 注册spring自带的管理数据库连接的数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/student"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</bean>
</beans>

3.3 实现方式3:Dao实现类继承JdbcDaoSupport

在Dao接口实现里,不用引入JdbcTemplate的接口,而是继承JdbcDaoSupport。因为JdbcDaoSupport类引入了JdbcTemlate。

使用这种方式时,可以不用注入jdbcTemplate,即dao实现类直接依赖于dataSource。因为在类JdbcDaoSupport中会实例化JdbcTemplate。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 注册服务类,并描述依赖关系 -->
<bean id="studentService" class="com.steven.spring.sysmgr.service.impl.StudentService">
<property name="studentDao" ref="studentDao"/>
</bean> <!-- 注册DAO类: 当Dao实现类继承了JdbcDaoSupport,可以直接注入dataSource-->
<bean id="studentDao" class="com.steven.spring.sysmgr.dao.impl.StudentDao">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 注册spring自带的管理数据库连接的数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/student"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</bean>
</beans>

3.4 实现方式4:利用properties配置文件方式

1、在src根目录下新建一个配置文件jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/student
jdbc.user=root
jdbc.password=123

2、让spring加载配置文件

1)加载properties配置文件内容

方式1:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties"/>
</bean>

方式2:

首先在xml配置文件中引入context头文件标签。

	<context:property-placeholder location="classpath:jdbc.properties"/>

2)将dataSource的bean标签更改为:

<!-- 注册spring自带的管理数据库连接的数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

3.5 实现方式5:c3p0数据源连接池

1)引入c3p0数据连接池的jar包:c3p0-0.9.0.jar

2)xml配置文件数据源连接部分改为(注意不同点):

<!-- 注册c3p0数据源连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

3.6 实现方式6:dbcp数据源连接池

1)引入dbcp数据源连接池(Apache公司)需要的jar包

commons-dbcp-1.4.jar

commons-pool-1.6.jar

2)xml配置文件数据源连接部分改为(注意不同点):

<!-- 注册dbcp数据源连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(二):Spring-IOC-DI

下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring实现AOP

[Spring+SpringMVC+Mybatis]框架学习笔记(三):Spring实现JDBC的更多相关文章

  1. [Spring+SpringMVC+Mybatis]框架学习笔记(六):事务

    第7讲 事务 7.1 事务的概念 事务是一系列作为一个逻辑单元来执行的操作集合. 它是数据库维护数据一致性的单位,它讲数据库从一个一致状态,转变为新的另外一个一致状态.说的简单一点就是:如果一组处理步 ...

  2. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建三:配置spring并测试

    这一部分的主要目的是 配置spring-service.xml  也就是配置spring  并测试service层 是否配置成功 用IntelliJ IDEA 开发Spring+SpringMVC+M ...

  3. Spring+SpringMVC+MyBatis集成学习笔记【一】

    一,首先要清楚,SpringMVC其实就是Spring的一个组件       例如我们知道Spring中有类似于,AOP TX等等类似的组件,所以SpringMVC其实就是Spring的一个组件,是S ...

  4. 搭建Spring + SpringMVC + Mybatis框架之三(整合Spring、Mybatis和Spring MVC)

    整合Spring和SpringMVC 之前已经整合了spring和mybatis,现在在此基础上整合SSM. 项目目录: 思路:SpringMVC的配置文件独立,然后在web.xml中配置整合. (1 ...

  5. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建四:配置springmvc

    在用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建三:配置spring并测试的基础上 继续进行springmvc的配置 一:配置完善web.xml文件

  6. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(2 配置spring-dao和测试)

    用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 搭建目录环境和依赖) 四:在\resources\spring 下面 ...

  7. Spring+SpringMVC+MyBatis深入学习及搭建(三)——MyBatis全局配置文件解析

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6874672.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(二)——My ...

  8. Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...

  9. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 构建目录环境和依赖)

    引言:在用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建一   的基础上 继续进行项目搭建 该部分的主要目的是测通MyBatis 及Spring-dao ...

  10. SSM(Spring +SpringMVC + Mybatis)框架搭建

    SSM(Spring +SpringMVC + Mybatis)框架的搭建 最近通过学习别人博客发表的SSM搭建Demo,尝试去搭建一个简单的SSMDemo---实现的功能是对用户增删改查的操作 参考 ...

随机推荐

  1. Linux rsyslogd服务学习

    本篇笔记来自该博客: http://c.biancheng.net/view/1097.html 服务简介 在CentOS 6.x 中日志服务已经由 rsyslogd 取代了原先的 syslogd.r ...

  2. Consistency Models终结扩散模型

    最近看到一篇论文,觉得特别有意思,并且在学术界引起了不小的动静,他就是一致性模型,据说图像生成效果快.质量高,并且还可以实现零样本图像编辑,即不进行一些视觉任务训练,可以实现图像超分.修复.上色等功能 ...

  3. #AI 1分钟学会,利用AI制作思维导图 (NewBing&X-Mind )

    思维导图是一种有效的思考和学习工具,它可以帮助你整理和呈现信息,激发你的创造力和记忆力.但是,传统的思维导图软件往往需要你花费大量的时间和精力来设计和绘制,而且难以修改和分享.有没有一种更简单和智能的 ...

  4. Git&GitHub简介与入手(三)

    五.eclipse中的git使用 1.eclipse中本地库操作 (检测显示创建成功): (设置本地库范围签名): (一些git里的图标,保存着不同内容): https://github.com/gi ...

  5. 2022-12-18:给定一个长度为n的二维数组graph,代表一张图, graph[i] = {a,b,c,d} 表示i讨厌(a,b,c,d),讨厌关系为双向的, 一共有n个人,编号0~n-1, 讨

    2022-12-18:给定一个长度为n的二维数组graph,代表一张图, graph[i] = {a,b,c,d} 表示i讨厌(a,b,c,d),讨厌关系为双向的, 一共有n个人,编号0~n-1, 讨 ...

  6. 2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。 返回最短距离,精确到小数点后面4位。

    2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的. 返回最短距离,精确到小数点后面4位. 答案2022-11- ...

  7. 2022-04-06:go中proto文件能跨平台,那是因为能生成不同语言的代码,做框架开发用protoc+插件生成代码是不合适的,需要解析,请问如何解析?

    2022-04-06:go中proto文件能跨平台,那是因为能生成不同语言的代码,做框架开发用protoc+插件生成代码是不合适的,需要解析,请问如何解析? 答案2022-04-06: go get ...

  8. 基于DevExpress的GridControl实现的一些界面处理功能

    DevExpress的GridControl控件能够提供很多强大的操作,其视图GridView能够通过各种设置,呈现出多种复杂的界面效果,本篇随笔探讨一些常见的GridControl控件及其GridV ...

  9. itextpdf5.5.13给pdf添加图片水印、添加文字水印(平铺)、添加文字水印(单个)、添加页眉、页脚、页眉事件、添加图片

    转载自简书用户:alex很累,感谢分享.原地址:https://www.jianshu.com/p/2b9c7a0300e4 一.相关工具类 1. Excel2Pdf.java (如代码不可用请查看原 ...

  10. 使用脚本收发 protobuf 协议数据

    问题背景 最近做了一个 ipv6 相关的功能,发现使用 getifaddrs 获取的本地 ipv6 地址有可能不是真实的网络 ipv6 地址: 例如上图中通过 getifaddrs 获得了多个本地 i ...