一. SpringEL入门
Spring动态语言(简称SpEL) 是一个支持运行时查询和操作对象图的强大的动态语言,语法类似于EL表达式,具有诸如显示方法和基本字符串模板函数等特性.
1. 准备工作
需要导入jar包
spring-expression.jar
maven项目pom文件添加:
1
2 org.springframework
3 spring-expression
4 4.3.10.RELEASE
5
测试:
1 /**
2 * 在SpEL中,使用表达式非常简单,只需创建一个SpelExpressionParser实例即可,也就是首先创建一个SpEL *表达式解析器,然后调用ExpressionParser#parseExpression()方法对表达式进行解析,其中单引号表示
3 *String类型.
4 */
5 public class SpelHello {
6 public static void main(String [] args){
7 // TODO 测试SPRINGEL表达式
8 ExpressionParser parser = new SpelExpressionParser();
9 Expression exp = parser.parseExpression("'hello'+'world'");
10 String value = (String) exp.getValue();
11 System.out.println(value); // helloworld
12 }
13 }
注意: SpEL被设计成一个可独立运行的模块,可以脱离Spring容器直接运行,因此只需引入SpEL的模块spring-expression即可,无须引入Spring的其他框架,接下来,在代码中就可以使用SpEL提供表达式解析类.
二.SpringEL核心接口
SpringEL的核心接口和核心类全部位于 org.springframework.expression包及其子包,以及spel.support中.
1. 核心接口介绍
ExpressionParser: 解析表达式字符串,表达式字符串是一个用单引号标注或者用转义的双引号标注的字符串.
Expression: 接口用来计算表达式字符串值
SpringEL支持一系列功能特性,比如方法调用,属性调用及构造器调用.
例如:
1 @Test
2 public void test1(){
3 // TODO 测试SPRINGEL表达式解析函数
4 ExpressionParser parser = new SpelExpressionParser();
5 Expression exp = parser.parseExpression("'hello'+'world'.concat('!!!')");
6 String value = (String) exp.getValue();
7 System.out.println(value); // 输出结果helloworld!!!
8 }
2. EvaluationContext接口
EvaluationContext接口提供了属性,方法,字段解析器及类型转化器.默认实现类StandardEvaluationContext的内部使用反射机制来操作对象.为了提高性能,在其内部会对已获取的Method,Field和Constructor实例进行缓存.
示例:
1 @Test
2 public void test2(){
3 // TODO 测试 EvaluationContext
4 User user = new User();
5 user.setUserName("张三");
6 user.setCredits(100);
7 ExpressionParser parser = new SpelExpressionParser();
8
9 /**
10 * 创建一个 StandardEvaluationContext实例,指定一个跟对象作为求值目标对象,这样在求值表达式中就可以引用根
11 * 对象属性.在求值内部可以使用反射机制从注册对象中获取相应的属性.
12 */
13 EvaluationContext context = new StandardEvaluationContext(user);
14
15 String userName = (String) parser.parseExpression("userName").getValue(context);
16
17 System.out.println(userName);
18 }
示例:
操作类Simple:
1 public class Simple {
2 public List booleansList = new ArrayList();
3
4 }
测试:
1 @Test
2 public void test3(){
3 // TODO 测试 EvaluationContext
4 // 1
5 Simple simple = new Simple();
6 simple.booleansList.add(true ); // 给Simple对象 属性的集合中添加一个值
7 // 2
8 StandardEvaluationContext simpleContext = new StandardEvaluationContext(simple);
9 ExpressionParser parser = new SpelExpressionParser();
10 // 3
11 Expression expression = parser.parseExpression("booleansList[0]");
12 // 4
13 expression.setValue(simpleContext,"false");
14 // 5
15 Boolean bl = simple.booleansList.get(0);
16 System.out.println("bl---->"+bl); // 输出结果: b1 - false
17 }
创建测试类对象,给予booleansList集合设置值
创建StandardEvaluationContext的内部使用反射机制创建Simple操作对象.
创建SpEL表达式
给SpEL表达式设置操作上下文对象. 以及设置对应的值
获取修改后的结果!
三. SpEL基础表达式
1. 文本字符解析器
文本表达式支持字符串,日期,数字(正数,实数及十六进制数),布尔类型及null,其中字符串需使用单引号或者反斜杠+双引号包含起来,如" 'String类型' " , " "String类型" ",单引号字符可使用 " ' " 表示.
test:
1 @Test
2 public void test4(){
3 // TODO SpEL基本类型解析
4 ExpressionParser parser = new SpelExpressionParser();
5 // 1.解析字符串
6 String hellworld =(String) parser.parseExpression("\"hello world\"").getValue();
7 // 2.解析双精度浮点
8 double doubleNumber = (Double) parser.parseExpression("3.1415926").getValue();
9 // 3.解析整数
10 int maxValue = (Integer) parser.parseExpression("0xFFFFFF").getValue();
11 // 4.解析boolean类型
12 boolean value = (Boolean) parser.parseExpression("true").getValue();
13 // 5.解析空值
14 Object nullValue = parser.parseExpression("null").getValue(); System.out.println(hellworld+doubleNumber+maxValue+value+nullValue);
15
16 }
2. 对象属性解析
在SpringEL中,可使用类似 "xxx.yyy.zzz" 的对象属性路径轻松的访问对象属性值.
创建Place类:
1 public class Place {
2 private String city;
3 public Place(String city) {
4 this .city = city;
5 }
6 public String getCity() {
7 return city;
8 }
9 public void setCity(String city) {
10 this .city = city;
11 }
12 }
创建User类:
1 public class User {
2 private String userName;
3 private Integer credits;
4 private Place place;
5 public Place getPlace() {
6 return place;
7 }
8 public void setPlace(Place place) {
9 this .place = place;
10 }
11 public String getUserName() {
12 return userName;
13 }
14 public void setUserName(String userName) {
15 this .userName = userName;
16 }
17 public Integer getCredits() {
18 return credits;
19 }
20 public void setCredits(Integer credits) {
21 this .credits = credits;
22 }
23 }
测试:
1 @Test
2 public void test5(){
3 // TODO 获取对象属性值
4 User user = new User();
5 user.setCredits(100);
6 user.setUserName("王老五");
7 user.setPlace(new Place("葫芦岛"));
8 // 构建SpEL解析上下文
9 ExpressionParser parser = new SpelExpressionParser();
10 EvaluationContext context = new StandardEvaluationContext(user);
11 // 基本属性值获取
12 String username = (String)parser.parseExpression("userName").getValue(context);
13 System.out.println("username = " + username);
14 // 支持运算
15 int credits = (Integer)parser.parseExpression("credits+10").getValue(context);
16 System.out.println("credits = " + credits);
17 // 获取嵌套对象属性值
18 String city = (String)parser.parseExpression("place.city").getValue(context);
19 System.out.println("city = " + city);
20
21 }
3. 数组,集合类型解析
在SpEL中,支持数组,集合类型解析.数组支持标准Java语言创建方法,如"new int []{1,2,3}".List支持大括号括起来的内容,数据项之间用逗号隔开,如 "{1,2,3,4,5}", "{{'a','b'},{'c','d'}}".目前SpEL还不支持多维数组初始化,如 "new int[2][3]{{1,2,3},{4,5,6}} ". Map采用如下表达式: {userName:'tom',credits:100}
1 @Test
2 public void test6(){
3 // TODO 测试数组集合解析
4 ExpressionParser parser = new SpelExpressionParser();
5 EvaluationContext context = new StandardEvaluationContext(user);
6 // 数组获取
7 int [] array1 = (int []) parser.parseExpression("new int[]{1,2,3}").getValue();
8 System.out.println(Arrays.toString(array1));
9 // 集合获取
10 List list = (List) parser.parseExpression("{1,2,3,4}").getValue();
11
12 List tList = (List) parser.parseExpression("{{123,456},{789,111}}").getValue();
13
14 System.out.println(list+"\n"+tList);
15 // Map数据操作
16 Map map= (Map) parser.parseExpression("{username:'tom',age:11}").getValue();
17 List mList = (List) parser.parseExpression("{{username:\"aaa\"},{username:'zhanfsan'}}").getValue();
18 System.out.println("mList = " + mList+" \n "+map);
19
20 }
21 // 输出结果
22 [1, 2, 3]
23 [1, 2, 3, 4]
24 [[123, 456], [789, 111]]
25 mList = [{username=aaa}, {username=zhanfsan}]
26 {username=tom, age=11}
4. 方法解析
在SpEL中,方法调用支持Java可访问的方法,包括对象方法,静态方法,支持可变方法参数;还可以使用String类型的所有可访问的方法,如String#substring()
修改User类:
1 public class User {
2 private String userName;
3 private Integer credits;
4 private Place place;
5 public String [] arr;
6 /**
7 * 添加三个方法 使用spel调用
8 * 共有方法
9 * 静态方法
10 * 私有方法
11 */
12 public Boolean method1(String value){
13 return value.equalsIgnoreCase("admin") ;
14 }
15 public static Boolean method2(String value){
16 return value.equalsIgnoreCase("admin");
17 }
18 private Boolean method3(String value){
19 return value.equalsIgnoreCase("admin")
20 }
21 // setter getter
22 }
View Code
测试:
1 @Test
2 public void test7(){
3 // TODO 测试SPEL调用方法
4 User user = new User();
5 EvaluationContext context = new StandardEvaluationContext(user);
6 ExpressionParser parser = new SpelExpressionParser();
7 // 调用String方法
8 String sbString = parser.parseExpression("'Spring'.substring(2)").getValue(String.class );
9 System.out.println("sbString = " + sbString);
10 Integer index = parser.parseExpression("'Spring'.indexOf('p')").getValue(Integer.class );
11 System.out.println("index = " + index);
12 // 调用实例方法
13 // 共有方法
14 boolean method1 = (Boolean) parser.parseExpression("method1('123')").getValue(context);
15 System.out.println(method1);
16
17 // 静态方法
18 boolean method2 = (Boolean) parser.parseExpression("method2('admin')").getValue(context);
19 System.out.println(method2);
20 /** 结果集
21 sbString = ring
22 index = 1
23 false
24 true
25 */
26 // 私有方法
27 boolean method3 = (Boolean) parser.parseExpression("method3('aaa')").getValue(context);
28 System.out.println("method3 = " + method3);
29 // 此处报错
30 }
5. 操作符解析
SpEL提供了丰富的操作符解析,支持关系操作付符,逻辑操作符号,算术运算操作符等...
关系操作符:
1 @Test
2 public void test8(){
3 // 测试运算符
4 ExpressionParser parser = new SpelExpressionParser();
5 Boolean value = parser.parseExpression("2==2").getValue(Boolean.class );
6 System.out.println("value = " + value);
7 Integer sum = parser.parseExpression("2+2").getValue(Integer.class );
8 System.out.println("sum = " + sum);
9 /**
10 * 输出结果: value = true sum = 4
11 */
12 }
6. 赋值操作
1 User user = new User();
2 EvaluationContext context = new StandardEvaluationContext(user);
3 // setValue方法赋值
4 ExpressionParser parser = new SpelExpressionParser();
5 parset.parsetEcpression("userName").setValue(context,"userName");
1 // 表达式直接赋值
2 User user = new User();
3 EvaluationContext context = new StandardEvaluationContext(user);
4 // setValue方法赋值
5 ExpressionParser parser = new SpelExpressionParser();
6 parset.parsetEcpression("userName='userName对应的值'").setValue(context);
四. 在Spring中使用SpEL
1. 基于XML配置
1 class="xx.xx.xx" p:age="#{T(java.lang.Math).random()*100 }"/>
通过SpEL提供的T类型操作符,直接调java.lang.Math的静态方法来生成一个随机数.
2. 引用其他bean属性
1 class="com.itqf.spring.bean.User">
2
3 class="xx.xx.xx">
4
5
五. Spring JDBC 数据访问
Spring JDBC是Spring所提供的持久层技术,它的主要目标是降低使用JDBC API的门槛,以一种更直接,更简介,更简单的方式使用JDBC API, 在Spring JDBC里,仅需做那些与业务相关的DML操作,而将资源获取,Statment创建,资源释放以及异常处理等繁杂而乏味的工作交给Spring JDBC.
虽然ORM的框架已经成熟丰富,但是JDBC的灵活,直接的特性,依然让他拥有自己的用武之地,如在完全依赖查询模型动态产生查询语句的综合查询系统中,Hibernaye,MyBatis,JPA等框架都无法使用,这里JDBC是唯一的选择.
1. JdbcTemplate入门
1.1 创建项目
引入jar包
pom.xml:
1
2
3 junit
4 junit
5 3.8.1
6 test
7
8
9
10 aopalliance
11 aopalliance
12 1.0
13
14
15
16
17 org.aspectj
18 aspectjweaver
19 1.8.10
20
21
22
23 org.springframework
24 spring-aspects
25 4.3.7.RELEASE
26
27
28 org.springframework
29 spring-aop
30 4.3.10.RELEASE
31
32
33 org.springframework
34 spring-context-support
35 4.3.11.RELEASE
36
37
38
39 org.springframework
40 spring-context
41 4.3.10.RELEASE
42
43
44 org.springframework
45 spring-core
46 4.3.10.RELEASE
47
48
49
50 org.springframework
51 spring-beans
52 4.3.10.RELEASE
53
54
55
56 org.springframework
57 spring-expression
58 4.3.10.RELEASE
59
60
61
62
63 org.springframework
64 spring-jdbc
65 4.3.9.RELEASE
66
67
68
69 mysql
70 mysql-connector-java
71 5.1.38
72
73
74 commons-logging
75 commons-logging
76 1.1.2
77
78
79
80 log4j
81 log4j
82 1.2.14
83
84
85
86 mysql
87 mysql-connector-java
88 5.1.38
89
90
91
92
93 commons-dbcp
94 commons-dbcp
95 1.4
96
97
98
99
100 org.springframework
101 spring-test
102 4.3.10.RELEASE
103 test
104
105
106
107
108 com.mchange
109 mchange-commons-java
110 0.2.11
111
112
113
114
115 org.springframework.boot
116 spring-boot
117 1.5.7.RELEASE
118
119
120
121 com.mchange
122 c3p0
123 0.9.5.2
124
125
126 org.springframework
127 spring-tx
128 4.3.9.RELEASE
129
View Code
导入日志:log4j.properties
1.2 创建数据库
数据库名: springjdbc
创建角色表:
1 CREATE TABLE `role` (
2 `rid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '角色id',
3 `rname` VARCHAR(20) NOT NULL COMMENT '角色名',
4 `alias` VARCHAR(20) NOT NULL COMMENT '角色别名',
5 PRIMARY KEY (`rid`)
6 )
7
8 INSERT INTO role (rid,rname,alias)
9 VALUES(1,'admin','系统管理员'),(2,'dispatcher','调度员');
1.3 测试代码
1 @Test
2 public void test1() throws Exception {
3 // TODO 测试jdbcTemplate简单使用
4 // 1.创建c3p0链接池
5 ComboPooledDataSource dataSource = new ComboPooledDataSource();
6 dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/springjdbc");
7 dataSource.setUser("root");
8 dataSource.setPassword("111");
9 // 创建jdbcTemplate对象
10 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
11 // 创建sql语句
12 String sql = "insert into role (rid , rname ,alias) value (? , ?,?);";
13 jdbcTemplate.update(sql,"3","visitor","游客");
14 }
2. Spring管理JdbcTemplate
1. 创建Role.java
1 public class Role {
2 private Integer cid;
3 private String rname;
4 private String alias;
5 // setter getter
6 }
2. RoleDao.java
1 public interface RoleDao {
2
3 // 增
4 void save(Role role);
5
6 // 删除
7 void delete(Integer id);
8
9 // 改
10 void update(Role role);
11
12 // 查
13 Role getById(Integer id);
14
15 // 查
16 int getTotalCount();
17
18 // 查
19 List getAll();
20
21 }
View Code
3. 创建RoleDaoImpl.java
创建数据源(连接池),JdbcTemplate,RoleDao交给Spring容器管理(IOC)
注意: 可以自己在RoleDaoImpl中添加 JdbcTemplate变量,如果不自动装载记得添加变量的set方法,
标准的操作,我们可以让RoleDaoImpl 继承 JdbcDaoSupport, 因为(org.springframework.jdbc.core.support.JdbcDaoSupport)类提供了JdbcTemplate对象以及对应的获取和设置方法.不用自己在实现类中添加JdbcTemplate变量
1 JdbcTemplate // Spring操作数据模板类(工具类)
2
3 JdbcTemplate.update(sql,ArgsObj....); // DML
4 JdbcTemplate.execute(sql) // DDL DCL
5 // DQL 查询单个
6 jdbcTemplate.queryForObject(String var1, RowMapper var2, Object... var3);
7 RowWapper 将结果封装的处理器; 得到Result解析成实体类对象即可!
8
9 // 查询所有
10 jdbcTemplate.query(String var1, RowMapper var2, Object... var3);
RoleDaoImple代码:
1 public class RoleDaoImpl extends JdbcDaoSupport implements RoleDao {
2
3
4 public void save(Role role) {
5 // TODO 插入数据
6 String sql = "INSERT INTO role (rname,alias) value (?,?) ;";
7 getJdbcTemplate().update(sql,role.getRname(),role.getAlias());
8 }
9
10 public void delete(Integer id) {
11 // TODO 根据id删除
12 String sql = "delete from role where rid = ? ;";
13 getJdbcTemplate().update(sql,id);
14 }
15
16 public void update(Role role) {
17 // TODO 修改role信息
18 String sql="update role set rname = ? , alias = ? where rid = ? ;" ;
19 getJdbcTemplate().update(sql,role.getRname(),role.getAlias(),role.getRid());
20 }
21
22 public Role getById(Integer id) {
23
24 String sql = "select * from role where rid = ? ;";
25
26 // 直接查询
27 // Role role = getJdbcTemplate().queryForObject(sql, new Object[]{id}, Role.class);
28 Role role = (Role) getJdbcTemplate().queryForObject(sql, new Object[]{id}, new RowMapper() {
29
30 public Object mapRow(ResultSet resultSet, int index) throws SQLException {
31 // 将一行数据解析成一个java对象
32
33 return mapRowHandler(resultSet);
34 }
35 });
36
37 return role;
38 }
39
40 public int getTotalCount() {
41
42 String sql = "select count(*) from role ;";
43
44 Integer count = getJdbcTemplate().queryForObject(sql,Integer.class );
45
46 return count;
47 }
48
49 // 查询所有
50 public List getAll() {
51
52 String sql = "select * from role";
53
54 List list = getJdbcTemplate().query(sql, new RowMapper() {
55 public Role mapRow(ResultSet resultSet, int i) throws SQLException {
56
57 return mapRowHandler(resultSet);
58 }
59 });
60
61 return list;
62 }
63
64 private Role mapRowHandler(ResultSet resultSet) throws SQLException{
65 Role role = new Role();
66 role.setRid(resultSet.getInt("rid"));
67 role.setRname(resultSet.getString("rname"));
68 role.setAlias(resultSet.getString("alias"));
69 return role;
70 }
71
72
73 }
View Code
4. 创建数据库配置文件
文件名:db.properties
位置: src下/ maven项目 resources文件夹下
1 jdbc.jdbcUrl=jdbc:mysql:// localhost:3306/springjdbc
2 jdbc.driverClass=com.mysql.jdbc.Driver
3 jdbc.user=root
4 jdbc.password=xxx
5.编写IOC配置
文件名:applicationContext.xml
位置:src下 / maven项目 resources文件夹下
1
2 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:p="http://www.springframework.org/schema/p"
6 xsi:schemaLocation="
7 http:// www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
8 http:// www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd ">
9 package="com.itqf.spring">
10
11 class="com.mchange.v2.c3p0.ComboPooledDataSource" p:jdbcUrl="${jdbc.jdbcUrl}"
12 p:driverClass="${jdbc.driverClass}"
13 p:user="root"
14 p:password="xxxx"
15 />
16
17
18 class="org.springframework.jdbc.core.JdbcTemplate">
19
20
21
22
23
24 class="spring.dao.impl.RoleDaoImpl">
25
26
27
28
View Code
测试:
1 @Test
2 public void test2(){
3 // TODO 测试使用配置文件
4
5 ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
6 RoleDao dao = context.getBean("roleDao", RoleDaoImpl.class );
7
8 Role byId = dao.getById(2);
9 System.out.println(byId);
10
11 List all = dao.getAll();
12
13 System.out.println("all = " + all);
14 }
转载于:https://www.cnblogs.com/sueyyyy/p/9581934.html
你可能感兴趣的:(数据库,java)
《Python全栈开发》第1课:认识全栈开发与Web工作原理
程序员没睡醒
Python全栈 python 前端 开发语言
课程目标理解全栈开发的核心概念了解网站运行的底层原理建立全栈知识体系框架完成第一个网页实践一、什么是全栈开发?(用餐厅比喻)1.1餐厅后厨vs餐厅前厅顾客服务员点单厨师做菜传菜员送餐1.2对应到Web开发:餐厅角色Web开发对应关键技术服务员前端开发HTML/CSS/JavaScript厨师后端开发Python/Java/PHP传菜员数据库MySQL/MongoDB店长全栈工程师掌握所有环节二、网
java中过滤器实现拦截非法访问
Java--成长之路
filter 过滤器 spring
packagecom.hs.filter;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.servlet.Filter;importjavax.servlet.FilterChain;imp
java中过滤器应实现的接口_下面选项中,编写过滤器需要实现的接口是( )
凛冬之怒
java中过滤器应实现的接口
【填空题】Tomcat容器中会话的有效时间可以在___文件中设置,默认会话过期时间为30分钟【判断题】在修改传智书城注册页面使用include指令包含顶部、菜单列表和底部这些公共页面时,可以参考引入css、js文件一样放到head标签内部。()【单选题】下列选项中,可以更改Cookie的存活时间的是()【判断题】用于监听HttpSession对象生命周期的接口是HttpSessionBinding
Vue.js 基础入门:从零开始构建你的第一个 Vue 应用
vvilkim
vue vue.js 前端 javascript
Vue.js是一个轻量级、易上手的渐进式JavaScript框架,广泛用于构建现代化的用户界面。无论你是前端新手还是有一定经验的开发者,Vue.js都能帮助你快速构建高效、可维护的Web应用。本文将带你从零开始学习Vue.js的基础知识,并完成一个简单的Vue应用。1.什么是Vue.js?Vue.js是一个用于构建用户界面的渐进式框架。它的核心库专注于视图层,易于与其他库或现有项目集成。Vue的主
java使用SXSSFWorkbook生成具有图片与文字的Excel表格
「已注销」
apache java poi excel
在这里是一个Maven工程,在pom.xml中引入poi依赖org.apache.poipoi3.9org.apache.poipoi-ooxml3.9例子中的情景是从数据库查出了许多记录,记录的是地理信息。记录有几个字段记录的图片保存的绝对路径。根据这些字段的内容生成图片。例如picOneAddr。记录分为不同的类型,比如楼房,桥梁等。将每种类型生成一个sheet进行分开保存。具体导出表格的一个
接上一篇:Java实现导出Excel并附带水印
沉默木头人
java java poi excel
上篇这么优秀的Excel工具类,你难道不用?介绍了Java使用poi操作excel表格的导入和修改,在日常开发中经常也会遇到在页面上点击按钮将数据库中的数据导出到excel表中;在了解Excel的水印其实就是插入艺术字再修改字体的颜色、字体、透明度就变成了所谓的水印效果了(一顿操作后我发现其实就类似插入一张透明文字图片);思路:根据对Excel的了解及上网查阅了几篇文章后,整理出了思路。在对Exc
Java过滤器
淋风沐雨
java java 开发语言
BWH_Steven的碎碎念javaweb体系只剩ajax和json加maven的讲解了,这段时间我会开始推送算法与数据结构结构的文章,从他们的入门知识到一些很实用的算法了解,亦或我们在java学习中留下的坑,我整理了两张A4纸,日后也打算推送一些大家需要的工具或者资源,暂时学校的事情还是比较多,每晚我都写到很晚,不过我尽最大可能给大家更新,如果你有什么想了解的也可以私信,或者发送邮件和我交流,至
MySQL 与 MongoDB 的区别
kse_music
# DB mysql mongodb 数据库
文章目录前言一、如何选择二、索引总结前言在当今数据驱动的世界中,数据库技术扮演着至关重要的角色,它们为应用程序提供了存储、管理和检索数据的基础设施。MySQL和MongoDB作为两种广泛使用的数据库管理系统,分别代表了关系型数据库(SQL)和非关系型数据库(NoSQL)的典型范例。MySQL是一种成熟的关系型数据库管理系统(RDBMS),自1995年问世以来,凭借其稳定性、可靠性和易用性,成为了许
【图片识别保存表格】图片文档指定多个识别区域,识别固定位置的文字并导出到Excel,Python5分钟搞定,学会不求人
如沐春风菜鸡收割机
excel r语言 开发语言
对于企业和组织来说,他们可能拥有大量扫描的纸质文档存储为图像文件,这些文档可能包含多个部分,不同部分可能涉及不同的信息类别。例如,一份扫描的采购订单可能在不同位置有订单编号、供应商信息、采购物品列表等,通过自定义区域识别,可以更精确地提取这些信息并存储到数据库或Excel表格中,方便日后的检索和统计。以下是使用Python和飞桨实现图片文档指定多个识别区域,识别固定位置的文字并导出到Excel的详
【存储中间件】MongoDB最热门NoSql数据库(一):NoSQL、MongoDB介绍
道友老李
架构师进阶-存储中间件 nosql mongodb 中间件
文章目录1.MongoDb综述1.1.什么是Nosql1.2.什么是MongoDb**1.2.1核心特性****1.2.2典型应用场景****1.2.3与关系型数据库对比****1.2.4局限性及使用建议**个人主页:道友老李欢迎加入社区:道友老李的学习社区1.MongoDb综述1.1.什么是NosqlNoSQL(NotOnlySQL)是一类非关系型数据库的统称,其核心特征在于突破传统关系型数据库
Manus:成为AI Agent领域的标杆
喜欢猪猪
人工智能
一、引言官网:Manus随着人工智能技术的飞速发展,AIAgent(智能体)作为人工智能领域的重要分支,正逐渐从概念走向现实,并在各行各业展现出巨大的应用潜力。在众多AIAgent产品中,Manus以其独特的技术优势和市场表现,有望成为该领域的标杆。作为资深AI工程师,本文将深入探讨Manus的背景知识、主要业务场景、底层原理、功能的优缺点,并尝试使用Java搭建一个属于自己的Manus助手,以期
java中过滤器
简 洁 冬冬
监听器和过滤器 java
Filter过滤器它的作用是:拦截请求,过滤响应应用场景:权限检查日志操作事务管理web.xml1.配置过滤器2.指定过滤器的url-pattern规则doFilter中如果没有调用继续请求的方法,就停止如果继续访问,filterChain.doFilter(servletRequest,servletResponse)在调用过滤器前,request对象已经被创建并封装request.getReq
为什么要使用JUnit 开发规范
潜意识Java
Java知识 junit log4j 数据库
目录命名规范:让代码一目了然测试类命名测试方法命名测试方法结构规范:遵循AAA原则Arrange(准备)Act(执行)Assert(断言)一个测试方法只做一件事断言使用规范:精准验证结果选择合适的断言方法提供有意义的错误信息测试数据管理规范:让测试更可靠使用测试数据生成器避免硬编码测试数据异常处理规范:应对意外情况测试异常抛出异常处理要合理总结嘿,小伙伴们!在咱们Java开发的世界里,JUnit就
Oracle/MySQL/PostgreSQL 到信创数据库数据同步简介
笑远
数据库数据同步详解 数据库 python etl
Oracle/MySQL/PostgreSQL数据库同步到信创数据库的处理方案、注意事项及工具介绍在当前信息化快速发展的背景下,企业面临着多样化的数据库管理需求。尤其是将现有的Oracle、MySQL、PostgreSQL等主流数据库数据迁移或同步到国产信创(国产自主创新)数据库系统,如华为的GaussDB、达梦(Dameng)、人大金仓(Kingbase)等,成为了许多企业的实际需求。本文将详细
Google Chrome 60版本的全新特性与优势
xinwuji312
本文还有配套的精品资源,点击获取简介:Chrome60是GoogleChrome浏览器的一个重大更新,它在2017年推出,为用户和开发者提供了多项改进。新版浏览器通过升级V8JavaScript引擎,增强WebAssembly支持,改进CSSGrid布局,更新ServiceWorker,增强安全性,改进开发者工具,增加新的WebAPI,优化性能,增强隐私控制以及支持64位架构,从而提升浏览体验和开
Websoft9 运维面板,全网真正的一键部署应用
运维运维自动化
一、传统部署的复杂性:以WordPress为例的技术拆解手动部署的典型步骤(耗时约2小时):#1.安装LAMP环境sudoaptinstallapache2mysql-serverphplibapache2-mod-phpphp-mysql#2.配置MySQL(需交互式设置root密码、创建数据库)sudomysql_secure_installationmysql-uroot-p-e"CREAT
YashanDB TLCP连接配置
数据库
本文内容来自YashanDB官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/%E6%95%B0%E6%8D%AE%...YashanDB启用TLCP连接要求由Gmssl工具生成相关证书,在完成相关证书的正确配置后,通讯时进行客户端到服务端的安全验证。Caution:一旦服务器开启TLCP连接,所有的客户端都必须正确配置证书才能连接到数据库。启用
MySQL8官方YUM仓库使用指南
MySQL是一个非常流行的开源关系数据库管理系统,在各种应用场景中都得到了广泛的应用。随着版本的更新,MySQL8引入了许多新特性和性能提升,广泛受到开发者和企业的青睐。为了方便在各种Linux发行版中安装MySQL8,MySQL官方提供了YUM仓库。本指南将介绍如何使用MySQL8官方YUM仓库来安装和管理MySQL。YUM和YUM仓库简介YUM(YellowdogUpdater,Modifie
YashanDB数据库服务端SSL连接配置
数据库
本文内容来自YashanDB官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/%E6%95%B0%E6%8D%AE%...YashanDB启用SSL连接要求由服务器生成根证书、服务器证书和DH文件,客户端获取服务器的根证书,在通讯时进行客户端到服务端的安全验证。Caution:一旦服务器开启SSL连接,所有的客户端都必须有根证书才能连接到数据库。
程序开发中的“坑”:一次数据库连接池泄露问题排查
程序员
最近在开发一个Web应用时,遇到了一个令人头疼的问题:应用运行一段时间后,就会变得异常缓慢,最终甚至无法响应任何请求。经过一番排查,终于找到了罪魁祸首——数据库连接池泄露。一.问题现象:应用上线初期运行平稳,但运行一段时间后(大约几小时),接口响应时间开始变慢,最终完全卡死。查看服务器日志,发现大量数据库连接超时的错误信息。二.排查过程:初步怀疑数据库性能瓶颈:首先怀疑是数据库本身出现了性能问题,
Next.js 开发者必看:最受欢迎的 UI 组件库
大家好,我是长林啊!一个爱好JavaScript、Go、Rust的全栈开发者;致力于终生学习和技术分享。本文首发在我的微信公众号【长林啊】,欢迎大家关注、分享、点赞!在之前,我也写过一篇《打造高效React应用:CSS方案深度解析》,里面介绍到内联样式、CSS类、CSSModules和CSS-in-JS技术,在Next.js中也同样是适用,如果有不熟悉的,可以到公众号「长林啊」中去看!我们这里就不
使用Java开发工具包会遇到哪些问题
ios
哈喽,大家好呀,淼淼又来和大家见面啦,Java作为一门广泛应用于企业级应用、安卓开发、大数据处理等领域的编程语言,其强大的跨平台能力和丰富的类库支持吸引了无数开发者。然而,在使用Java开发工具包(JavaDevelopmentKit,简称JDK)的过程中,开发者往往会遇到各种问题。本文旨在探讨这些常见问题,并提供相应的解决策略,帮助开发者更高效地利用Java进行项目开发。环境配置问题问题描述:初
Spring Boot在java领域中有哪些优势
ios
哈喽,大家好呀,淼淼又来和大家见面啦,随着云计算、微服务架构的兴起,Java开发领域迫切需要一套高效、灵活且易于上手的框架来应对日益复杂的业务需求。正是在这样的背景下,SpringBoot应运而生,以其独特的魅力迅速成为了Java开发者手中的利器。这一期淼淼将深入剖析SpringBoot在Java领域中的十大显著优势,揭示它为何成为现代软件开发不可或缺的一部分。1.零配置起航:约定优于配置Spri
自定义表单开发过程及思路笔记
Zyred
自定义表单 自定义表单 数据库 java
前言:由于公司项目中有一个自定义表单的需求,而本人却无类似开发经验,在朋友和同事的努力下,依然没有找到最佳的解决方案,后来自己根据自己对业务的了解和别人的思路借鉴,最终设计出了现在这款自定义表单的逻辑。项目环境:kingbaseV8(人大金仓数据库),Mybatis-Plusv3.4.2,spring-boot-2.2.5.RELEASE在本文中,主要阐述结合VUEJS动态表格的数据结构进行设计接
Chrome 插件开发:技术解析与应用实例
阿吉的呓语
java开发知识 chrome
引言Chrome插件,又称为扩展,为用户提供了自定义和增强浏览器功能的能力,从而改善用户体验并提升工作效率。本文将详尽介绍Chrome插件的开发基础,探讨所需的技术栈,并通过具体应用场景展示其实际应用和潜力。一、Chrome插件的基本概念什么是Chrome插件Chrome插件是一种浏览器扩展,允许开发者使用Web技术如HTML、CSS和JavaScript为Chrome浏览器添加额外的功能。它可以
Hive实用小文件合并方案
500佰
Hive线上问题处理方案 hive hadoop 数据仓库 大数据
#Hive常见故障#大数据#生产环境真实案例#Hive#离线数据库#整理#经验总结说明:此篇总结hive常见故障案例处理方案结合自身经历总结不易+关注+收藏欢迎留言Hive实用小文件合并方案请往下翻!!!更多Hive案例汇总方案(点击跳转):Hive常见故障多案例维护宝典--项目总结(宝典一)Hive常见故障多案例维护宝典--项目总结(宝典二)目录内容如下:架构概述【1】参数及配置类常见故障执行s
JavaScript中的Observer模式:设计模式与最佳实践
乐闻x
前端知识图谱 javascript 观察者模式 设计模式
前言在现代软件开发中,Observer模式(观察者模式)是一种重要的设计模式,能够有效地管理对象之间的依赖关系。它允许一个对象在状态发生变化时通知其他依赖于它的对象,这种一对多的依赖关系在事件驱动编程、数据绑定以及状态管理等领域非常常见。本文将详细探讨JavaScript中几种常见的Observer实现方式,并通过具体实例展示其使用方法,帮助开发者在实际项目中更好地应用这一模式。什么是Observ
前端开发中的实用场景:提升开发效率与用户体验
lina_mua
前端 vue.js html javascript
1.引言1.1前端开发的多样性前端开发不仅仅是编写HTML、CSS和JavaScript,还涉及用户体验、性能优化、数据可视化等多个方面。掌握实用场景的开发技巧,可以显著提升开发效率和用户体验。1.2本文的目标本文旨在总结前端开发中的实用场景,并提供相应的解决方案和最佳实践,帮助开发者更好地应对实际开发中的挑战。2.表单处理与验证2.1动态表单生成场景:根据用户输入或配置动态生成表单字段。解决方案
JavaScript 异步编程:从基础到实践
lina_mua
javascript 开发语言 ecmascript
1.引言1.1异步编程的重要性在现代前端开发中,异步编程是不可避免的。无论是网络请求、定时任务,还是用户交互,异步操作都无处不在。掌握异步编程的技巧,是编写高效、可维护前端代码的关键。1.2本文的目标本文旨在深入探讨JavaScript中的异步编程,从基础概念到实际应用,帮助开发者更好地理解和使用异步编程模式。2.JavaScript异步基础2.1同步vs异步同步:程序按顺序执行,必须等待当前操作
使用 PyOpenGL 进行 2D 图形渲染总结
无水先生
3D图形渲染和OpenGL编程 图形渲染 人工智能
一、说明OpenGL是一个广泛使用的开放式跨平台实时3D图形库,开发于二十多年前。它提供了一个低级API,允许开发人员以统一的方式访问图形硬件。在开发需要硬件加速且需要在不同平台上运行的复杂2D或3D应用程序时,它是首选平台。它可以在多种语言中使用,包括C/C++、C#、Java、Objective-C(用于iPhone和iPad游戏)、Python等。在本文中,我将展示如何将OpenGL与Pyt
Java开发中,spring mvc 的线程怎么调用?
小麦麦子
spring mvc
今天逛知乎,看到最近很多人都在问spring mvc 的线程http://www.maiziedu.com/course/java/ 的启动问题,觉得挺有意思的,那哥们儿问的也听仔细,下面的回答也很详尽,分享出来,希望遇对遇到类似问题的Java开发程序猿有所帮助。
问题:
在用spring mvc架构的网站上,设一线程在虚拟机启动时运行,线程里有一全局
maven依赖范围
bitcarter
maven
1.test 测试的时候才会依赖,编译和打包不依赖,如junit不被打包
2.compile 只有编译和打包时才会依赖
3.provided 编译和测试的时候依赖,打包不依赖,如:tomcat的一些公用jar包
4.runtime 运行时依赖,编译不依赖
5.默认compile
依赖范围compile是支持传递的,test不支持传递
1.传递的意思是项目A,引用
Jaxb org.xml.sax.saxparseexception : premature end of file
darrenzhu
xml premature JAXB
如果在使用JAXB把xml文件unmarshal成vo(XSD自动生成的vo)时碰到如下错误:
org.xml.sax.saxparseexception : premature end of file
很有可能时你直接读取文件为inputstream,然后将inputstream作为构建unmarshal需要的source参数。InputSource inputSource = new In
CSS Specificity
周凡杨
html 权重 Specificity css
有时候对于页面元素设置了样式,可为什么页面的显示没有匹配上呢? because specificity
CSS 的选择符是有权重的,当不同的选择符的样式设置有冲突时,浏览器会采用权重高的选择符设置的样式。
规则:
HTML标签的权重是1
Class 的权重是10
Id 的权重是100
java与servlet
g21121
servlet
servlet 搞java web开发的人一定不会陌生,而且大家还会时常用到它。
下面是java官方网站上对servlet的介绍: java官网对于servlet的解释 写道
Java Servlet Technology Overview Servlets are the Java platform technology of choice for extending and enha
eclipse中安装maven插件
510888780
eclipse maven
1.首先去官网下载 Maven:
http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-3.2.3-bin.tar.gz
下载完成之后将其解压,
我将解压后的文件夹:apache-maven-3.2.3,
并将它放在 D:\tools目录下,
即 maven 最终的路径是:D:\tools\apache-mave
jpa@OneToOne关联关系
布衣凌宇
jpa
Nruser里的pruserid关联到Pruser的主键id,实现对一个表的增删改,另一个表的数据随之增删改。
Nruser实体类
//*****************************************************************
@Entity
@Table(name="nruser")
@DynamicInsert @Dynam
我的spring学习笔记11-Spring中关于声明式事务的配置
aijuans
spring 事务 配置
这两天学到事务管理这一块,结合到之前的terasoluna框架,觉得书本上讲的还是简单阿。我就把我从书本上学到的再结合实际的项目以及网上看到的一些内容,对声明式事务管理做个整理吧。我看得Spring in Action第二版中只提到了用TransactionProxyFactoryBean和<tx:advice/>,定义注释驱动这三种,我承认后两种的内容很好,很强大。但是实际的项目当中
java 动态代理简单实现
antlove
java handler proxy dynamic service
dynamicproxy.service.HelloService
package dynamicproxy.service;
public interface HelloService {
public void sayHello();
}
dynamicproxy.service.impl.HelloServiceImpl
package dynamicp
JDBC连接数据库
百合不是茶
JDBC编程 JAVA操作oracle数据库
如果我们要想连接oracle公司的数据库,就要首先下载oralce公司的驱动程序,将这个驱动程序的jar包导入到我们工程中;
JDBC链接数据库的代码和固定写法;
1,加载oracle数据库的驱动;
&nb
单例模式中的多线程分析
bijian1013
java thread 多线程 java多线程
谈到单例模式,我们立马会想到饿汉式和懒汉式加载,所谓饿汉式就是在创建类时就创建好了实例,懒汉式在获取实例时才去创建实例,即延迟加载。
饿汉式:
package com.bijian.study;
public class Singleton {
private Singleton() {
}
// 注意这是private 只供内部调用
private static
javascript读取和修改原型特别需要注意原型的读写不具有对等性
bijian1013
JavaScript prototype
对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象A,假设它的原型对象是B,B的原型对象是null。如果我们需要读取A对象的name属性值,那么JS会优先在A中查找,如果找到了name属性那么就返回;如果A中没有name属性,那么就到原型B中查找name,如果找到了就返回;如果原型B中也没有
【持久化框架MyBatis3六】MyBatis3集成第三方DataSource
bit1129
dataSource
MyBatis内置了数据源的支持,如:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<data
我程序中用到的urldecode和base64decode,MD5
bitcarter
c MD5 base64decode urldecode
这里是base64decode和urldecode,Md5在附件中。因为我是在后台所以需要解码:
string Base64Decode(const char* Data,int DataByte,int& OutByte)
{
//解码表
const char DecodeTable[] =
{
0, 0, 0, 0, 0, 0
腾讯资深运维专家周小军:QQ与微信架构的惊天秘密
ronin47
社交领域一直是互联网创业的大热门,从PC到移动端,从OICQ、MSN到QQ。到了移动互联网时代,社交领域应用开始彻底爆发,直奔黄金期。腾讯在过去几年里,社交平台更是火到爆,QQ和微信坐拥几亿的粉丝,QQ空间和朋友圈各种刷屏,写心得,晒照片,秀视频,那么谁来为企鹅保驾护航呢?支撑QQ和微信海量数据背后的架构又有哪些惊天内幕呢?本期大讲堂的内容来自今年2月份ChinaUnix对腾讯社交网络运营服务中心
java-69-旋转数组的最小元素。把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素
bylijinnan
java
public class MinOfShiftedArray {
/**
* Q69 旋转数组的最小元素
* 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。
* 例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
*/
publ
看博客,应该是有方向的
Cb123456
反省 看博客
看博客,应该是有方向的:
我现在就复习以前的,在补补以前不会的,现在还不会的,同时完善完善项目,也看看别人的博客.
我刚突然想到的:
1.应该看计算机组成原理,数据结构,一些算法,还有关于android,java的。
2.对于我,也快大四了,看一些职业规划的,以及一些学习的经验,看看别人的工作总结的.
为什么要写
[开源与商业]做开源项目的人生活上一定要朴素,尽量减少对官方和商业体系的依赖
comsci
开源项目
为什么这样说呢? 因为科学和技术的发展有时候需要一个平缓和长期的积累过程,但是行政和商业体系本身充满各种不稳定性和不确定性,如果你希望长期从事某个科研项目,但是却又必须依赖于某种行政和商业体系,那其中的过程必定充满各种风险。。。
所以,为避免这种不确定性风险,我
一个 sql优化 ([精华] 一个查询优化的分析调整全过程!很值得一看 )
cwqcwqmax9
sql
见 http://www.itpub.net/forum.php?mod=viewthread&tid=239011
Web翻页优化实例
提交时间: 2004-6-18 15:37:49 回复 发消息
环境:
Linux ve
Hibernat and Ibatis
dashuaifu
Hibernate ibatis
Hibernate VS iBATIS 简介 Hibernate 是当前最流行的O/R mapping框架,当前版本是3.05。它出身于sf.net,现在已经成为Jboss的一部分了 iBATIS 是另外一种优秀的O/R mapping框架,当前版本是2.0。目前属于apache的一个子项目了。 相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mappi
备份MYSQL脚本
dcj3sjt126com
mysql
#!/bin/sh
# this shell to backup mysql
#1413161683@qq.com (QQ:1413161683 DuChengJiu)
_dbDir=/var/lib/mysql/
_today=`date +%w`
_bakDir=/usr/backup/$_today
[ ! -d $_bakDir ] && mkdir -p
iOS第三方开源库的吐槽和备忘
dcj3sjt126com
ios
转自
ibireme的博客 做iOS开发总会接触到一些第三方库,这里整理一下,做一些吐槽。 目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code、SourceForge等地方。由于Github社区太过主流,这里主要介绍一下Github里面流行的iOS库。 首先整理了一份
Github上排名靠
html wlwmanifest.xml
eoems
html xml
所谓优化wp_head()就是把从wp_head中移除不需要元素,同时也可以加快速度。
步骤:
加入到function.php
remove_action('wp_head', 'wp_generator');
//wp-generator移除wordpress的版本号,本身blog的版本号没什么意义,但是如果让恶意玩家看到,可能会用官网公布的漏洞攻击blog
remov
浅谈Java定时器发展
hacksin
java 并发 timer 定时器
java在jdk1.3中推出了定时器类Timer,而后在jdk1.5后由Dou Lea从新开发出了支持多线程的ScheduleThreadPoolExecutor,从后者的表现来看,可以考虑完全替代Timer了。
Timer与ScheduleThreadPoolExecutor对比:
1.
Timer始于jdk1.3,其原理是利用一个TimerTask数组当作队列
移动端页面侧边导航滑入效果
ini
jquery Web html5 css javascirpt
效果体验:http://hovertree.com/texiao/mobile/2.htm可以使用移动设备浏览器查看效果。效果使用到jquery-2.1.4.min.js,该版本的jQuery库是用于支持HTML5的浏览器上,不再兼容IE8以前的浏览器,现在移动端浏览器一般都支持HTML5,所以使用该jQuery没问题。HTML文件代码:
<!DOCTYPE html>
<h
AspectJ+Javasist记录日志
kane_xie
aspectj javasist
在项目中碰到这样一个需求,对一个服务类的每一个方法,在方法开始和结束的时候分别记录一条日志,内容包括方法名,参数名+参数值以及方法执行的时间。
@Override
public String get(String key) {
// long start = System.currentTimeMillis();
// System.out.println("Be
redis学习笔记
MJC410621
redis NoSQL
1)nosql数据库主要由以下特点:非关系型的、分布式的、开源的、水平可扩展的。
1,处理超大量的数据
2,运行在便宜的PC服务器集群上,
3,击碎了性能瓶颈。
1)对数据高并发读写。
2)对海量数据的高效率存储和访问。
3)对数据的高扩展性和高可用性。
redis支持的类型:
Sring 类型
set name lijie
get name lijie
set na
使用redis实现分布式锁
qifeifei
在多节点的系统中,如何实现分布式锁机制,其中用redis来实现是很好的方法之一,我们先来看一下jedis包中,有个类名BinaryJedis,它有个方法如下:
public Long setnx(final byte[] key, final byte[] value) {
checkIsInMulti();
client.setnx(key, value);
ret
BI并非万能,中层业务管理报表要另辟蹊径
张老师的菜
大数据 BI 商业智能 信息化
BI是商业智能的缩写,是可以帮助企业做出明智的业务经营决策的工具,其数据来源于各个业务系统,如ERP、CRM、SCM、进销存、HER、OA等。
BI系统不同于传统的管理信息系统,他号称是一个整体应用的解决方案,是融入管理思想的强大系统:有着系统整体的设计思想,支持对所有
安装rvm后出现rvm not a function 或者ruby -v后提示没安装ruby的问题
wudixiaotie
function
1.在~/.bashrc最后加入
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
2.重新启动terminal输入:
rvm use ruby-2.2.1 --default
把当前安装的ruby版本设为默