一、连接SQL Server数据库
- 连接sql Server数据库需要导入sqljdbc.jar包。
- 使用com.microsoft.sqlserver.jdbc.SQLServerDriver驱动。
- 连接数据库url为jdbc:sqlserver:localhost:1433;DatabaseName=student
二、对JDBC执行结果的遍历与判断
--------参考 execute、executeUpdate、executeQuery三者的区别(及返回值)
1、boolean execute(String sql)
允许执行查询语句、更新语句、DDL语句。
返回值为true时,表示执行的是查询语句,可以通过getResultSet方法获取结果;返回值为false时,执行的是更新语句或DDL语句,getUpdateCount方法获取更新的记录数量。
public static void main(String[] args) {
Connection conn = null;
Statement stm = null;
ResultSet rs = null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=Test;user=sa;password=sasa");
stm = conn.createStatement();
boolean ret = stm.execute("select * from stuinfo");
if(ret){
rs = stm.getResultSet();
while(rs.next()){
System.out.println("姓名:"+rs.getString("stuName")+"\t年龄:"+rs.getString("stuScore"));
}
}
ret = stm.execute("update stuinfo set stuScore=62 where stuname='张三'");
int count = stm.getUpdateCount();
if(!ret){
System.out.println(count+"条数据修改成功!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
2、int executeUpdate(String sql)
执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
返回值是更新的记录数量。0是没有更新,大于0是更新数量。
3、ResultSet executeQuery(String sql)
执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。
【execute是executeUpdate与executeQuery的综合。】
三、使用UUID生成SM4密钥
- UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。UUID 是指通用唯一识别码(Universally Unique Identifier)。
- SM4密钥长度为16个字节。
使用UUID生成SM4密钥的代码如下:
UUID.randomUUID().toString().replace("-", "").toLowerCase().substring(0, 16)
四、SM2加密密文byte[]与String转换问题
SM2使用公钥加密后,生成byte[]类型的密文,转换为String类型并不能直接用过toString()方法,应该使用Base64编码后转为String,具体代码如下:
byte[] encryptKey = new byte[100000];
String encKey = "";
try {
encryptKey = SM2Utils.encrypt(Base64.decode(DataConstant.PUBKS.getBytes()), sm4.getSecretKey().getBytes());
encKey = new String(Base64.encode(encryptKey));
System.out.println("SM4加密后密钥:"+encKey);
} catch (IOException e) {
e.printStackTrace();
}
解密时也应先使用Base64解码后,再使用SM2的私钥解密。
String decKey = new String(SM2Utils.decrypt(Base64.decode(prikS.getBytes()), Base64.decode(encKey.getBytes())));
五、解析XML格式的字符串
需求为解密文件内容后,将数据封装为指定格式。
String xmlDoc=“<table><record><numsourceid>31231415</numsourceid><hospital_code>42507230900</hospital_code><update_time>2018-09-12 00:00:00.0</update_time><create_time>2018-09-12 00:00:00.0</create_time><release_time>2018-09-12 00:00:00.0</release_time><end_time>2018-09-12 00:00:00.0</end_time><ordernumtype>1</ordernumtype><is_special>1</is_special><source_status>1</source_status><is_advantage>1</is_advantage><advantage_abort_time>2018-09-12 00:00:00.0</advantage_abort_time><is_temporary>1</is_temporary><dept1id>2356</dept1id><dept1name>内科</dept1name><dept2id>11231</dept2id><dept2name>胸内科</dept2name><dept_shenkang_id>12414</dept_shenkang_id><doctorid>312313</doctorid><doctor_name>陈XX</doctor_name><doctor_level>2</doctor_level><start_date>2018-09-12 00:00:00.0</start_date><end_date>2018-09-12 00:00:00.0</end_date><schedule_status>2</schedule_status><is_changediagtag>1</is_changediagtag><visit_cost>6.00</visit_cost><schedule_update_time>2018-09-12 00:00:00.0</schedule_update_time></record></table>”
public String xmlElements(String xmlDoc) {
StringBuffer datastr = null;
//删除字符串中的换行符
if (xmlDoc!=null && !xmlDoc.equals("")) {
Pattern p = Pattern.compile("\r|\n");
Matcher m = p.matcher(xmlDoc);
xmlDoc = m.replaceAll("");
}
StringReader read = new StringReader(xmlDoc);
//创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
InputSource source = new InputSource(read);
//创建一个新的SAXBuilder
SAXBuilder sb = new SAXBuilder();
try {
//通过输入源构造一个Document
Document doc = sb.build(source);
//取的根元素<table>
Element root = doc.getRootElement();
//得到根元素所有子元素的集合<record>
List recordList = root.getChildren();
//获得XML中的命名空间(XML中未定义可不写)
Namespace ns = root.getNamespace();
datastr =new StringBuffer();
for(int i=0;i<recordList.size();i++){
Element et = (Element) recordList.get(i);//循环依次得到子元素
//依次获取单个<record>标签
List childElement = et.getChildren();
//遍历<record>中子元素
for (int j = 0; j < childElement.size(); j++) {
Element child = (Element)childElement.get(j);
String str = child.getText();
if(j != childElement.size()-1){
str += "!@!";
}
datastr.append(str);
}
datastr.append("^&^");
}
System.out.println(datastr);
} catch (JDOMException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return datastr.toString();
}
/*
输出结果:
31231415!@!42507230900!@!2018-09-12 00:00:00.0!@!2018-09-12 00:00:00.0!@!2018-09-12 00:00:00.0!@!2018-09-12 00:00:00.0!@!1!@!1!@!1!@!1!@!2018-09-12 00:00:00.0!@!1!@!2356!@!内科!@!11231!@!胸内科!@!12414!@!312313!@!陈XX!@!2!@!2018-09-12 00:00:00.0!@!2018-09-12 00:00:00.0!@!2!@!1!@!6.00!@!2018-09-12 00:00:00.0^&^
*/
网友评论