- 测试程序都放在 samsung 的 SD CARD —- > AndroidTestProgram 目录
- 当实现一个派生类时, 鼠标放在派生类名字上 , 按 CTRL+I , 可以选择要 implement 的 method
- 如果有某个类没有import , 比如 Intent , 鼠标放在名字上, 按 Alt + Enter 可以 import
- How to debug android program ?
java 如何生成 json
来源网页 : https://www.cnblogs.com/garfieldcgf/p/5967590.html
全文:
1.json简单介绍
1.1 json是最流行和广泛通用的数据传输格式,简称JavaScript Object Notation,最早在JavaScript中使用.
1.2 举个例子,下面是一个json对象,名字叫王尼玛,他有两个粉丝组成数组,一个叫小王,一个叫小尼玛:
{
“name”:”王尼玛”,
“fans”:[{
“name”:”小王”,
“age”:”7″
},{
“name”:”小尼玛”,
“age”:”10″
}]
}
2.json数据生成和解析
2.1 关于json处理的包有好几类,开源jackson,谷歌Gson,阿里巴巴的Fastjson.Gson功能强大,但是Fastjson性能更快.如何选择见仁见智就行
2.2 这里我开始都是用org.json,后面为了演示复杂json转java bean又导入了功能强大的Gjson,先附上两个maven依赖:
1 2 3 4 5 6 7 8 9 10 11 12 |
<!-- https://mvnrepository.com/artifact/org.json/json --> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20160810</version> </dependency> <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.7</version> </dependency> |
2.3 json数据的生成,也就是各种类型转json.(String,map和java bean)
1 |
DemoCreateJson.java |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by garfield on 2016/10/16. * 举三种创建json的例子 */ public class DemoCreateJson { public static void main(String[] args) { StringCreateJson(); mapCreateJson(); beanCreateJson(); } //String创建json /** * { "name":"王尼玛", "fans":[{ "name":"小王", "age":"7" },{ "name":"小尼玛", "age":"10" }] } */ static void StringCreateJson(){ JSONObject jsonObject = new JSONObject(); jsonObject.put("name","王尼玛"); //粉丝是个数组,其实就是嵌套json JSONObject jsonObject1 = new JSONObject(); jsonObject1.put("name","小王"); jsonObject1.put("age",7); JSONObject jsonObject2 = new JSONObject(); jsonObject2.put("name","小尼玛"); jsonObject2.put("age",10); //从此处可以看出其实list和json也是互相转换的 List<JSONObject> jsonObjects = new ArrayList<JSONObject>(); jsonObjects.add(jsonObject1); jsonObjects.add(jsonObject2); jsonObject.put("fans",jsonObjects); System.out.println("jsonObject直接创建json:" + jsonObject); } //第二种方法,用map方式 static void mapCreateJson(){ Map<String,Object> map = new HashMap<String,Object>(); map.put("name","王尼玛"); Map<String,Object> map1 = new HashMap<String,Object>(); map1.put("name","小王"); map1.put("age",7); Map<String,Object> map2 = new HashMap<String,Object>(); map2.put("name","小尼玛"); map2.put("age",10); List<Map> jsonObjects = new ArrayList<Map>(); jsonObjects.add(map1); jsonObjects.add(map2); map.put("fans",jsonObjects); System.out.println("集合中Map创建json对象:" + new JSONObject(map)); } //第三种,也是比较常用的,用bean转换,(这里用的是map作为子json,如果必须要创建复杂bean对象,建议用Gjson操作) static void beanCreateJson(){ Actor actor = new Actor(); actor.setName("王尼玛"); Map<String,Object> map1 = new HashMap<String,Object>(); map1.put("name","小王"); map1.put("age",7); Map<String,Object> map2 = new HashMap<String,Object>(); map2.put("name","小尼玛"); map2.put("age",10); List<Map> maps = new ArrayList<Map>(); maps.add(map1); maps.add(map2); actor.setFans(maps); System.out.println("java bean创建json对象:" + new JSONObject(actor)); } } |
2.3.1上面类缺少基本bean
Actor.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import java.util.List; import java.util.Map; /** * Created by garfield on 2016/10/16. */ public class Actor { private String name; private List<Map> fans; public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Map> getFans() { return fans; } public void setFans(List<Map> fans) { this.fans = fans; } } |
2.4 json的解析,这里写了两种解析方式,同样,比较常用的还是第二种,json转java bean
DemoParseJson.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import com.google.gson.*; import org.json.JSONObject; import java.util.Map; /** * Created by garfield on 2016/10/16. */ public class DemoParseJson { public static void main(String[] args) { String jsonString = "{\"fans\":[{\"name\":\"小王\",\"age\":7},{\"name\":\"小尼玛\",\"age\":10}],\"name\":\"王尼玛\"}"; normalParse(jsonString); beanParse(jsonString); } static void normalParse(String jsonString){ JSONObject jsonObject = new JSONObject(jsonString); //获取普通属性 System.out.println("姓名:"); System.out.println(" " + jsonObject.getString("name")); //获取数组 System.out.println("粉丝:"); for (Object fan : jsonObject.getJSONArray("fans")) { JSONObject object = (JSONObject)fan; System.out.println(" 姓名:" + object.get("name") + ",年龄:" + object.get("age")); } } //org.json并不支持这种复杂的bean转换,所以这边又导入了gson的包 static void beanParse(String jsonString){ System.out.println("=========Gson解析========="); JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject(); Actor actor = new Gson().fromJson(obj,Actor.class); System.out.println("姓名:"); System.out.println(" " + obj.get("name")); System.out.println("粉丝:"); for (Map map : actor.getFans()) { System.out.println(" 姓名:" + map.get("name") + "年龄:" + map.get("age")); } } } |
2.4.1顺便附上执行结果:
1 2 3 4 5 6 7 8 9 10 11 |
姓名: 王尼玛 粉丝: 姓名:小王,年龄:7 姓名:小尼玛,年龄:10 =========Gson解析========= 姓名: "王尼玛" 粉丝: 姓名:小王年龄7.0 姓名:小尼玛年龄10.0 |
ok,that’s it…
How to make a spring boot webservice
- 从这个网址生成项目文件 https://start.spring.io/
对于webservice , 按下图选择 :
然后点击 Generate Project
- 在 eclipse 导入项目后 , 新建 HelloController.java ,代码为:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.example.ly.FirstWebService; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class FirstWebServiceApplication { public static void main(String[] args) { SpringApplication.run(FirstWebServiceApplication.class, args); } } |
代码用意为: The class is flagged as a @RestController
, meaning it’s ready for use by Spring MVC to handle web requests. @RequestMapping
maps /
to the index()
method. When invoked from a browser or using curl on the command line, the method returns pure text. That’s because @RestController
combines @Controller
and @ResponseBody
, two annotations that results in web requests returning data rather than a view.
注:这个Controller只实现了最简单对 “/” 的返回,是不带参数的request , 当用户调用时是这样的:
1 |
http://localhost:8080/ |
如果改成实际可用的带参数的request , 见下面这个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
package com.example.ly.FirstWebService; import org.springframework.web.bind.annotation.RestController; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @RestController public class HelloController { Logger logger = LoggerFactory.getLogger(HelloController.class); @RequestMapping("/") public String index() { //logger.trace("This is a TRACE message."); //logger.debug("This is a DEBUG message."); //logger.info("This is an INFO message."); //logger.warn("This is a WARN message."); //logger.error("You guessed it, an ERROR message."); return "Greetings from Spring Boot!"; } @RequestMapping(value = { "/ocs_new" }) @ResponseBody public Map<String, Object> getRoute(@RequestParam("sid") String id,@RequestParam("calling") String calling,@RequestParam("called") String called,@RequestParam("trunk_in") String trunk_in) { logger.info("ocs_new command income."); Map<String, Object> mRet = new HashMap<String, Object>(); mRet.put("duration", 120); Map<String,Object> map1 = new HashMap<String,Object>(); map1.put("nap","nap256"); map1.put("src","60133878300"); map1.put("dst","800113803088900"); Map<String,Object> map2 = new HashMap<String,Object>(); map2.put("nap","nap369"); map2.put("src","60133878399"); map2.put("dst","800213803088999"); List<Map> jsonObjects = new ArrayList<Map>(); jsonObjects.add(map1); jsonObjects.add(map2); mRet.put("routetable",jsonObjects); mRet.put("next_update_time", 120); mRet.put("cmd", "ocs_new"); mRet.put("sid", id); mRet.put("result", 0); mRet.put("msg", null); return mRet; } @RequestMapping(value = { "/ocs_start" }) @ResponseBody public Map<String, Object> callstart(@RequestParam("sid") String id,@RequestParam("a_setup_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime a_setup_time,@RequestParam("a_connect_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime a_connect_time,@RequestParam("b_setup_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime b_setup_time,@RequestParam("b_connect_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime b_connect_time,@RequestParam("connected_trunk") String connected_trunk) { logger.info("ocs_start command income."); Map<String, Object> mRet = new HashMap<String, Object>(); mRet.put("cmd", "ocs_start"); mRet.put("result", 0); mRet.put("sid", id); mRet.put("msg", "queued for processing"); return mRet; } @RequestMapping(value = { "/ocs_end" }) @ResponseBody public Map<String, Object> callend(@RequestParam("sid") String id,@RequestParam("duration_a") int duration_a,@RequestParam("duration_b") int duration_b,@RequestParam("a_hangup_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime a_hangup_time,@RequestParam("b_hangup_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime b_hangup_time) { logger.info("ocs_end command income."); Map<String, Object> mRet = new HashMap<String, Object>(); mRet.put("cmd", "ocs_end"); mRet.put("result", 0); mRet.put("sid", id); mRet.put("msg", "queued for processing"); return mRet; } } |
- 接下来修改 项目自动生成的: FirstWebServiceApplication.java 文件
改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package com.example.ly.FirstWebService; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.Arrays; import org.springframework.boot.CommandLineRunner; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @SpringBootApplication public class FirstWebServiceApplication { public static void main(String[] args) { SpringApplication.run(FirstWebServiceApplication.class, args); } @Bean public CommandLineRunner commandLineRunner(ApplicationContext ctx) { return args -> { System.out.println("Let's inspect the beans provided by Spring Boot:"); String[] beanNames = ctx.getBeanDefinitionNames(); Arrays.sort(beanNames); for (String beanName : beanNames) { System.out.println(beanName); } }; } } |
- 接下来编译 : 到项目文件夹后, 在 command line type 如下命令:
1 |
gradlew -x test -Dorg.gradle.java.home=C:\PROGRA~1\Java\jdk1.8.0_171 build |
- 运行并调试 :
运行: 在 command line 模式到 F:\JavaProject\javaExercise\FirstWebService\build\libs 目录 , 执行
1 |
java -jar FirstWebService-0.0.1-SNAPSHOT.jar |
然后用 浏览器打 http://localhost:8080/
如果得到 Greetings from Spring Boot! 的输出 , 就说明完成 了。
来源自 https://spring.io/guides/gs/spring-boot/
接下来是如何让spring boot 能写log , 使用 log4j2 , 不用spring boot 自带的 logback
首先在 build.gradle 将 log back去除 ; 需要加上这一行:
1 2 3 |
configurations.all { exclude group:'org.springframework.boot', module: 'spring-boot-starter-logging' } |
并且在dependence加上
1 |
compile('org.springframework.boot:spring-boot-starter-log4j2') |
改之前的HelloController.java 为 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.example.ly.FirstWebService; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @RestController public class HelloController { Logger logger = LoggerFactory.getLogger(HelloController.class); @RequestMapping("/") public String index() { logger.trace("This is a TRACE message."); logger.debug("This is a DEBUG message."); logger.info("This is an INFO message."); logger.warn("This is a WARN message."); logger.error("You guessed it, an ERROR message."); return "Greetings from Spring Boot!"; } } |
在 src/main/resources 新建 log4j2-spring.xml
内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <!-- LOG everything at INFO level --> <Root level="info"> <AppenderRef ref="Console" /> </Root> <!-- LOG "com.example" at TRACE level --> <Logger name="com.example" level="trace"> </Logger> </Loggers> </Configuration> |
然后重新编译执行
日志部分来源与博客 : https://blog.scalyr.com/2018/07/started-quickly-spring-boot-logging/
如何将日志输出到文件
上一步是把日志输出到 console , 要写到文件就要改 log4j2-spring.xml ,
改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Appenders> <File name="MyFile" fileName="logs/app.log"> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> </File> </Appenders> <Loggers> <!-- LOG everything at INFO level --> <Root level="info"> <AppenderRef ref="MyFile" /> </Root> <!-- LOG "com.example" at TRACE level --> <Logger name="com.example" level="trace"> </Logger> </Loggers> </Configuration> |
更详细的配置见: https://logging.apache.org/log4j/2.x/manual/appenders.html
Maven Note
How to use ZMQ
- simple example :
server side : http://zguide.zeromq.org/java:hwserver
client side : http://zguide.zeromq.org/java:hwclient
- server side code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package useZMQ; import org.apache.log4j.Logger; import org.zeromq.ZMQ; //import org.zeromq.ZMQ.Context; //import org.zeromq.ZMQ.Socket; public class ZMQServer { static Logger logger = Logger.getLogger(ZMQServer.class); public static void main(String[] args) throws Exception { ZMQ.Context context = ZMQ.context(1); // Socket to talk to clients ZMQ.Socket responder = context.socket(ZMQ.REP); responder.bind("tcp://*:5555"); while (!Thread.currentThread().isInterrupted()) { // Wait for next request from the client byte[] request = responder.recv(0); //System.out.println("Received " + new String (request)); logger.info("Received " + new String (request)); // Do some 'work' Thread.sleep(1000); // Send reply back to client String reply = "World"; responder.send(reply.getBytes(), 0); } responder.close(); context.term(); } } |
- client code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package useZMQClient; import org.zeromq.ZMQ; public class ZMQClient { public static void main(String[] args) { ZMQ.Context context = ZMQ.context(1); // Socket to talk to server System.out.println("Connecting to hello world server…"); ZMQ.Socket requester = context.socket(ZMQ.REQ); requester.connect("tcp://176.122.178.37:5555"); for (int requestNbr = 0; requestNbr != 10; requestNbr++) { String request = "Hello"; System.out.println("Sending Hello " + requestNbr); requester.send(request.getBytes(), 0); byte[] reply = requester.recv(0); System.out.println("Received " + new String(reply) + " " + requestNbr); } requester.close(); context.term(); } } |
- server pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>Ly.java.program</groupId> <artifactId>useZMQ</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.zeromq</groupId> <artifactId>jeromq</artifactId> <version>0.3.4</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/resources</directory> <targetPath>${project.build.directory}</targetPath> </resource> </resources> <defaultGoal>install</defaultGoal> <plugins> <!-- Set a JDK compiler level --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <!-- Make this jar executable --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>useZMQ.ZMQServer</mainClass> </manifest> <manifestEntries> <Class-Path>.</Class-Path> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build> </project> |
Eclipse with spring framwork , use gradle to compile , How to use log4j
For waqas ‘s diameter-relay project , It can output logs to /logs/out.log .
the project is a Spring boot project , use gradle to compile , then the problem is : How to enable Log4j on SpringBoot Gradle: log4j-over-slf4j.jar, slf4j-log4j12.jar Multiple Bindings
But, In diameter-relay project , I neither find any info in build.gradle , nor in gradlew
How to search a certain word through whole project in eclipse
same problem from stackoverflow is :
How to search in Eclipse through project for some word ? When I start CTRL-h I need to choose field, method or …., but I need to find all occurences in project no metter method, field or .. ! How to achieve that ?
Answer is :
CTRL + H -> File Search -> Containing Text ‘some word’
make sure the scope is set to workspace or enclosing projects. Choosing Selected Resources will narrow the result set to the folder or file you selected in the explorer.
Further if you know the file type that might contain the text you can use the File Name patterns
with values like *.php, *.phtml, *.html
Jboss tutorial
- Q&A
- what is J2EE (Java 2 Platform, Enterprise Edition )
J2EE is a platform-independent, Java-centric environment from Sun for developing, building and deploying Web-based enterprise applications online. The J2EE platform consists of a set of services, APIs, and protocolsthat provide the functionality for developing multitiered, Web-based applications.
Some of the key features and services of J2EE:
- At the client tier, J2EE supports pure HTML, as well as Java applets or applications. It relies on Java Server Pages and servletcode to create HTML or other formatted data for the client.
- Enterprise JavaBeans (EJBs) provide another layer where the platform’s logic is stored. An EJB server provides functions such as threading, concurrency, security and memory management. These services are transparent to the author.
- Java Database Connectivity (JDBC), which is the Java equivalent to ODBC, is the standard interface for Java databases.
- The Java servlet API enhances consistency for developers without requiring a graphical user interface.
In simpler terms, J2EE is essentially a standard middleware architecture, proposed by Sun Microsystems for developing and deploying multitier, distributed, e-enabled, enterprise scale business applications. Applications written for J2EE standards enjoy certain inherent benefits such as portability, security, scalability, load-balancing, and reusability.
2) How to install JBoss in eclipse
download from this site : http://jbossas.jboss.org/downloads
in eclipse , goto : help —-> eclipse market , type “jboss” , select “JBoss Tools 4.4.4.final” , and install it
after install , restart eclipse as require .
3) How to build jboss server
How to use sql server jdbc in java application (for win 10)
- download “Microsoft JDBC Driver 6.0 for SQL Server” from this site :
https://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774
- 解压后,到这个目录 sqljdbc_6.0.8112.200_enu.tar\sqljdbc_6.0.8112.200_enu\sqljdbc_6.0\enu\jre8
用 command line 执行 :
1 |
mvn install:install-file -Dfile=sqljdbc42.jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0 -Dpackaging=jar |
这是因为maven没有sqljdbc的repository , 必须手动把 sqljdbc42.jar 加到本地的maven repository
此方法来源于 :
https://stackoverflow.com/questions/19537396/missing-artifact-com-microsoft-sqlserversqljdbc4jar4-0
执行成功的标志是: 可以在本地maven repository 看到 sqljdbc
- 然后 ,在 maven 的pom.xml 文件加入dependency
1 |
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>sqljdbc4</artifactId> <version>4.0</version> </dependency> |
- 需要用到 sql server 时 ,加这句即可
1 |
import java.sql.*; |
- 各种调用的例子, 包括直接执行sql语句,调用store procedure (带输入和输出参数) , 见这个网址, 例子比较全
如果要持续的调用sql sp , 就不能每一次都新建connection , 要使用 connection pool , 选用 apache 的 dbcp 库
- 如何引用: 在 pom.xml 加
1 2 3 4 5 |
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1</version> </dependency> |
- 在 package 新建 DataSource.java 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package org.tinyradius.test; import java.beans.PropertyVetoException; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import org.apache.commons.dbcp2.BasicDataSource; public class DataSource { private static DataSource datasource; private BasicDataSource ds; private DataSource() throws IOException, SQLException, PropertyVetoException { ds = new BasicDataSource(); ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); ds.setUrl("jdbc:sqlserver://sqlhostname:port;databaseName=xxx;user=sa;password=xxxxxxxxx"); ds.setInitialSize(5); ds.setMaxTotal(5); ds.setMaxOpenPreparedStatements(180); } public static DataSource getInstance() throws IOException, SQLException, PropertyVetoException { if (datasource == null) { datasource = new DataSource(); return datasource; } else { return datasource; } } public Connection getConnection() throws SQLException { return this.ds.getConnection(); } } |
- try to call a sp with one input and output parameter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
package com.worldhubcom.testJDBC; import java.sql.*; public class App { public static void main( String[] args ) { CallableStatement cstmt = null; // Declare the JDBC objects. Connection con = null; String sStatus =null; try { String username = "userLY"; con = DataSource.getInstance().getConnection(); System.out.println("connection success \n"); cstmt = con.prepareCall( "{call sp_simple_sp_ly(?,?)}", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); //cstmt.setString("I_username", username); cstmt.setString("I_username", username); cstmt.registerOutParameter("O_sMsg", java.sql.Types.VARCHAR); cstmt.execute(); System.out.println("exec success \n"); sStatus = cstmt.getNString("O_sMsg"); System.out.println("sStatus:\n" + sStatus); cstmt.close(); con.close(); // run one more time and see if getconnection still spend much time con = DataSource.getInstance().getConnection(); // // Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // con = DriverManager.getConnection(connectionUrl); System.out.println("connection success \n"); cstmt = con.prepareCall( "{call sp_simple_sp_ly(?,?)}", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); //cstmt.setString("I_username", username); cstmt.setString("I_username", username); cstmt.registerOutParameter("O_sMsg", java.sql.Types.VARCHAR); cstmt.execute(); System.out.println("exec success \n"); sStatus = cstmt.getNString("O_sMsg"); System.out.println("sStatus:\n" + sStatus); } catch (Exception ex) { System.out.println("exec sp raise error \n"); } finally { if (cstmt != null) { try { cstmt.close(); con.close(); } catch (SQLException ex) { } } } //return sStatus; } //end of public main } |
from running , you can find when the second trying , this code
1 |
con = DataSource.getInstance().getConnection(); |
is much more faster than the first time .
- apache dbcp 的例子见
https://www.javatips.net/blog/dbcp-connection-pooling-example
- basicDataSource 是否已包含pool的特性 ? 已有, 详细解释见:
https://stackoverflow.com/questions/14467480/connection-pooling-with-apache-dbcp