tonglin0325的个人主页

Java——布局:FlowLayout、BorderLayout、GridLayout、CardLayout

在Swing中使用的所有布局管理器都可以实现LayoutManager接口,在Swing中主要使用的5种布局管理器:FlowLayout、BorderLayout、GridLayout、CardLayout、绝对定位。

 

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
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

//主类
//Function : FlowLayout_demo
public class FlowLayout_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
JFrame f = new JFrame("Swing窗口"); //实例化窗体对象
//设置窗体中的布局管理器为FlowLayout,所有的组件居中对齐,水平和垂直间距为3
f.setLayout(new FlowLayout(FlowLayout.CENTER,3,3));
JButton but = null;
for(int i=0;i<9;i++){
but = new JButton("按钮--"+i);
f.add(but);
}
f.setSize(500, 200);
f.setVisible(true);
}

}

 

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
import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

//主类
//Function : BorderLayout_demo
public class BorderLayout_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
JFrame f = new JFrame("Swing窗口"); //实例化窗体对象
//设置窗体中的布局管理器为BorderLayout,水平和垂直间距为3
f.setLayout(new BorderLayout(3,3));
f.add(new JButton("东"),BorderLayout.EAST);
f.add(new JButton("西"),BorderLayout.WEST);
f.add(new JButton("南"),BorderLayout.SOUTH);
f.add(new JButton("北"),BorderLayout.NORTH);
f.add(new JButton("中"),BorderLayout.CENTER);
f.pack(); //根据组件自动调整窗体的大小
f.setVisible(true);
}

}

 

 

全文 >>

Java——窗体:JFrame、JPanel等

1.JFrame

 

创建一个新的窗体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.awt.Color;
import javax.swing.JFrame;

//主类
//Function : JFrame_demo
public class JFrame_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
JFrame f = new JFrame("Swing窗口");
f.setSize(230,80);
f.setBackground(Color.WHITE);
f.setLocation(300, 200);
f.setVisible(true);
}

}

 

除了JFrame表示之外,还有其他几种常见的窗体:JPanel、JSplitPane、JTabbedPane、JScrollPane、JDesktopPane、JInternalFrame等。

2.JPanel

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 javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

//主类
//Function : JPanel_demo
public class JPanel_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
JFrame f = new JFrame("Swing窗口"); //实例化窗体对象
JPanel pan = new JPanel(); //实例化JPanel对象
pan.add(new JLabel("标签--A"));
pan.add(new JLabel("标签--B"));
pan.add(new JLabel("标签--C"));
pan.add(new JButton("按钮--A"));
pan.add(new JButton("按钮--B"));
pan.add(new JButton("按钮--C"));
f.add(pan); //将JPanel加入到窗体中
f.pack();
f.setLocation(300,200); //设置显示位置
f.setVisible(true);
}

}

3.JSplitPane

全文 >>

Java数据库——CallableStatement接口

 

建立一个过程,建立的时候要加DELIMITER //

 

 

IN——只能输入,不能输出,修改之后保留修改的数据

INOUT——可以的输入,也可以输出,修改时输出的是修改后的数据,但是再次输出的时候是最先的数据

OUT——只能输出,不能输入

 

调用myproc存储过程

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
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Scanner;

public class CallableStatement_demo {

//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根
Connection conn = null; //数据库连接
CallableStatement cstmt = null; //数据库操作
String sql = "{CALL myproc(?,?,?)}"; //调用过程

Class.forName(DBDRIVER); //加载驱动程序
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
cstmt = conn.prepareCall(sql); //实例化PreparedStatement
cstmt.setInt(1, 70); //设置第一个参数是70
cstmt.setInt(2, 80); //设置第二个参数是70
cstmt.registerOutParameter(2,Types.INTEGER); //设置返回值类型
cstmt.registerOutParameter(3,Types.INTEGER);
cstmt.execute();
System.out.println("INOUT的返回值:"+cstmt.getInt(2));
System.out.println("OUT的返回值:"+cstmt.getInt(3));
cstmt.close();
conn.close();
}

}

 

Java数据库——JDBC和JDBC 2.0 API

**JDBC(Java Database Connectivity)**,Java数据库连接,提供了一种与平台无关的用于执行SQL语句的标准Java API,可以方便地实现多种关系型数据库的统一操作,它由一组用Java语言编写的类和接口组成。

 

JDBC的主要操作类及接口

 

JDBC 2.0 API

 

可滚动的结果集

让结果集滚动起来

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
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Scanner;

public class JDBC20_demo {

//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根
Connection conn = null; //数据库连接
PreparedStatement pstmt = null; //数据库操作
ResultSet rs = null; //保存结果集

String sql = "SELECT id,name,password,age,sex,birthday "+ " FROM user";
Class.forName(DBDRIVER); //加载驱动程序
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
//实例化PreparedStatement
pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = pstmt.executeQuery(); //查询

System.out.println("第二条数据:");
rs.absolute(1); //输出第2条,从0开始
print(rs,1);

System.out.println("第一条数据:");
rs.beforeFirst(); //输出第1条
print(rs,1);

System.out.println("第二条数据:");
rs.afterLast(); //输出最后1条
print(rs,-1);
}

public static void print(ResultSet rs,int re) throws Exception{
if(re>0){
rs.next(); //由前向后输出
}else{
rs.previous(); //有后向前输出
}
int id = rs.getInt(1);
String name = rs.getString(2);
String pass = rs.getString(3);
int age = rs.getInt(4);
String sex = rs.getString(5);
java.util.Date d = rs.getDate(6);
System.out.println("编号:"+ id);
System.out.println("姓名:"+name);
System.out.println("密码:"+pass);
System.out.println("年龄:"+age);
System.out.println("性别:"+sex);
System.out.println("生日:"+d);
}

}

 

使用结果集插入数据

 

**  直接在user表中增加数据**

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
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Scanner;

public class JDBC20_demo {

//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根

Connection conn = null; //数据库连接
PreparedStatement pstmt = null; //数据库操作
ResultSet rs = null; //保存结果集

String sql = "SELECT id,name,password,age,sex,birthday "+ " FROM user";
Class.forName(DBDRIVER); //加载驱动程序
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
//实例化PreparedStatement
pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = pstmt.executeQuery(); //实例化ResulitSet对象
rs.moveToInsertRow(); //移动到可以插入的数据行
rs.updateString("name", "张三");
rs.updateString("password", "zhangsan");
rs.updateInt("age", 14);
rs.updateString("sex", "女");
rs.updateDate("birthday", new java.sql.Date(new java.util.Date().getTime()));
rs.insertRow(); //插入数据
rs.close();
pstmt.close();
conn.close();

}

public static void print(ResultSet rs,int re) throws Exception{
if(re>0){
rs.next(); //由前向后输出
}else{
rs.previous(); //有后向前输出
}
int id = rs.getInt(1);
String name = rs.getString(2);
String pass = rs.getString(3);
int age = rs.getInt(4);
String sex = rs.getString(5);
java.util.Date d = rs.getDate(6);
System.out.println("编号:"+ id);
System.out.println("姓名:"+name);
System.out.println("密码:"+pass);
System.out.println("年龄:"+age);
System.out.println("性别:"+sex);
System.out.println("生日:"+d);
}

}

 

全文 >>

Java数据库——事务处理

 

在数据库中执行5条SQL语句,这些SQL语句本身需要保持一致,即要么同时成功,要么同时失败

事务基本操作

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
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Scanner;

public class JDBC20_demo {

//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根

Connection conn = null; //数据库连接
Statement stmt = null; //数据库操作

Class.forName(DBDRIVER); //加载驱动程序
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
conn.setAutoCommit(false); //取消自动提交
//实例化PreparedStatement
stmt = conn.createStatement(); //实例化对象
//加入5条SQL语句
stmt.addBatch("INSERT INTO user(name,password,age,sex,birthday)"+"VALUES('lisi','lisimima',14,'男','1987-09-23')");
stmt.addBatch("INSERT INTO user(name,password,age,sex,birthday)"+"VALUES('lisi','lisimima',14,'男','1987-09-23')");
stmt.addBatch("INSERT INTO user(name1,password,age,sex,birthday)"+"VALUES('lisi','lisimima',14,'男','1987-09-23')");
stmt.addBatch("INSERT INTO user(name,password,age,sex,birthday)"+"VALUES('lisi','lisimima',14,'男','1987-09-23')");
stmt.addBatch("INSERT INTO user(name,password,age,sex,birthday)"+"VALUES('lisi','lisimima',14,'男','1987-09-23')");
try{
int temp[] = stmt.executeBatch(); //批量执行
System.out.println("更新了"+temp.length+"条数据。");
conn.commit(); //提交事务
}catch(Exception e){
try{
conn.rollback();
}catch(Exception ex){
ex.printStackTrace();
}
}
stmt.close();
conn.close();
}

public static void print(ResultSet rs,int re) throws Exception{
if(re>0){
rs.next(); //由前向后输出
}else{
rs.previous(); //有后向前输出
}
int id = rs.getInt(1);
String name = rs.getString(2);
String pass = rs.getString(3);
int age = rs.getInt(4);
String sex = rs.getString(5);
java.util.Date d = rs.getDate(6);
System.out.println("编号:"+ id);
System.out.println("姓名:"+name);
System.out.println("密码:"+pass);
System.out.println("年龄:"+age);
System.out.println("性别:"+sex);
System.out.println("生日:"+d);
}
}

 

Java数据库——使用元数据分析数据库

在JDBC中提供了DatabaseMetaData和ResultSetMetaData接口来分析数据库的元数据。

 

DatabaseMetaData

 

使用DatabaseMetaData取得数据库的元信息

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
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Scanner;

public class DatabaseMetaData_demo {

//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根
Connection conn = null; //数据库连接
DatabaseMetaData dmd = null; //数据库元数据
ResultSet rs = null; //保存结果集

Class.forName(DBDRIVER); //加载驱动程序
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
dmd = conn.getMetaData(); //实例化元数据
System.out.println("数据库名称:"+dmd.getDatabaseProductName());
System.out.println("数据库版本:"+dmd.getDriverMajorVersion()+"."+dmd.getDriverMinorVersion());
rs = dmd.getPrimaryKeys(null, null, "user"); //得到表的主键
while(rs.next()){
System.out.println("表类型:"+rs.getString(1));
System.out.println("表模式:"+rs.getString(2));
System.out.println("表名称:"+rs.getString(3));
System.out.println("列名称:"+rs.getString(4));
System.out.println("主键序列号:"+rs.getString(5));
System.out.println("主键名称:"+rs.getString(6));
}

conn.close();
}

}

 

ResultSetMetaData

 

 

Java数据库——处理大数据对象

处理大数据对象

CLOB中可以存储海量文字

BLOB中可以存储海量二进制数据

如果程序中要想处理这样的大对象操作,则必须使用PreparedStatement完成,所有的内容要通过IO流的方式从大文本字段中保存和读取。

 

 

写入大文本数据

 

汉字的编码要改成gbk

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
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.*;
import java.text.SimpleDateFormat;

public class Clob_demo {

//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根
Connection conn = null; //数据库连接
PreparedStatement pstmt = null; //数据库操作

String name = "张三";
String sql = "INSERT INTO userclob(name,note) VALUES (?,?) ";
Class.forName(DBDRIVER); //加载驱动程序
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
pstmt = conn.prepareStatement(sql); //实例化PreparedStatement
//声明一个File对象,用于找到要操作的大文本文件
File f = new File("/home/common/software/database/zhangsan.txt");
InputStream input = null; //通过输入流读取内容
input = new FileInputStream(f); //通过输入流读取文件
pstmt.setString(1, name); //设置第一个&ldquo;?&rdquo;的内容
pstmt.setAsciiStream(2,input, (int)f.length()); //设置输入流
pstmt.executeUpdate(); //执行数据库更新操作
pstmt.close(); //操作关闭
conn.close(); //数据库关闭
}

}

 

读取大文本字段

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
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Scanner;

public class Clob_demo {

//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根

Connection conn = null; //数据库连接
PreparedStatement pstmt = null; //数据库操作
ResultSet rs = null; //保存结果集

int id = 2;
String sql = "SELECT name,note FROM userclob WHERE id=?";
Class.forName(DBDRIVER); //加载驱动程序
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
pstmt = conn.prepareStatement(sql); //实例化PreparedStatement
pstmt.setInt(1, id); //设置查询的id
rs = pstmt.executeQuery(); //查询

while(rs.next()){
String name = rs.getString(1);
StringBuffer note = new StringBuffer();
System.out.println("姓名:"+name);
InputStream input = rs.getAsciiStream(2); //接收全部的文本数据
Scanner scan = new Scanner(input); //接收数据
scan.useDelimiter("\r\n"); //将文件换行作为分隔符
while(scan.hasNext()){
note.append(scan.next()).append("\n"); //不断读取内容
}
System.out.println("内容:"+note);
input.close();
}

pstmt.close(); //操作关闭
conn.close(); //数据库关闭
}

}

 

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
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Scanner;

public class Clob_demo {

//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mysql_demo";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "123456";

public static void main(String[] args) throws Exception{
// TODO 自动生成的方法存根
// Connection conn = null; //数据库连接
// PreparedStatement pstmt = null; //数据库操作
//
// String name = "张三";
// String sql = "INSERT INTO userclob(name,note) VALUES (?,?) ";
// Class.forName(DBDRIVER); //加载驱动程序
// //连接MySQL数据库时,要写上连接的用户名和密码
// conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
// pstmt = conn.prepareStatement(sql); //实例化PreparedStatement
// //声明一个File对象,用于找到要操作的大文本文件
// File f = new File("/home/common/software/database/无标题文档");
// InputStream input = null; //通过输入流读取内容
// input = new FileInputStream(f); //通过输入流读取文件
// pstmt.setString(1, name); //设置第一个&ldquo;?&rdquo;的内容
// pstmt.setAsciiStream(2,input, (int)f.length()); //设置输入流
// pstmt.executeUpdate(); //执行数据库更新操作
// pstmt.close(); //操作关闭
// conn.close(); //数据库关闭

// Connection conn = null; //数据库连接
// PreparedStatement pstmt = null; //数据库操作
// ResultSet rs = null; //保存结果集
//
// int id = 2;
// String sql = "SELECT name,note FROM userclob WHERE id=?";
// Class.forName(DBDRIVER); //加载驱动程序
// //连接MySQL数据库时,要写上连接的用户名和密码
// conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
// pstmt = conn.prepareStatement(sql); //实例化PreparedStatement
// pstmt.setInt(1, id); //设置查询的id
// rs = pstmt.executeQuery(); //查询
//
// while(rs.next()){
// String name = rs.getString(1);
// StringBuffer note = new StringBuffer();
// System.out.println("姓名:"+name);
// InputStream input = rs.getAsciiStream(2); //接收全部的文本数据
// Scanner scan = new Scanner(input); //接收数据
// scan.useDelimiter("\r\n"); //将文件换行作为分隔符
// while(scan.hasNext()){
// note.append(scan.next()).append("\n"); //不断读取内容
// }
// System.out.println("内容:"+note);
// input.close();
// }
//
// pstmt.close(); //操作关闭
// conn.close(); //数据库关闭

Connection conn = null; //数据库连接
PreparedStatement pstmt = null; //数据库操作
ResultSet rs = null; //保存结果集

int id = 2;
String sql = "SELECT name,note FROM userclob WHERE id=?";
Class.forName(DBDRIVER); //加载驱动程序
//连接MySQL数据库时,要写上连接的用户名和密码
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
pstmt = conn.prepareStatement(sql); //实例化PreparedStatement
pstmt.setInt(1, id); //设置查询的id
rs = pstmt.executeQuery(); //查询

while(rs.next()){
String name = rs.getString(1); //取出name列的内容
Clob c = rs.getClob(2); //取出大文本数据
String note = c.getSubString(1, (int)c.length()); //CLOB开始的位置为1
System.out.println("姓名:"+name);
System.out.println("内容:"+note);
c.truncate(100);
System.out.println("部分的读取内容:"+c.getSubString(1, (int)c.length()));
}

pstmt.close(); //操作关闭
conn.close(); //数据库关闭
}

}

 

全文 >>

MySQL学习笔记——存储过程

MySQL存储过程是一个事先编译好并存储在数据库中的一组 SQL 语句集合,类似于程序中的子程序或函数。

存储过程可以接受参数、执行一系列 SQL 语句,并返回结果。存储过程可以大大简化复杂的查询和数据处理操作,并提高数据库性能和安全性。

假设有3张表,歌曲表song,歌手表singer,歌曲和歌手的关联表song_singer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 歌曲
create table `default`.song(
id int PRIMARY KEY auto_increment,
name varchar(256) UNIQUE
) engine=InnoDB default charset=utf8;

# 歌手
create table `default`.singer(
id int PRIMARY KEY auto_increment,
name varchar(256) UNIQUE
) engine=InnoDB default charset=utf8;

# 关联表
create table `default`.song_singer(
id int PRIMARY KEY auto_increment,
song_id int,
singer_id int,
UNIQUE KEY unique_index_name (song_id, singer_id)
) engine=InnoDB default charset=utf8;

现在要写一个存储过程,同时添加歌曲,歌手,歌曲和歌手的关联表数据

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
CREATE PROCEDURE add_song_and_singer(
IN song_name VARCHAR(256) CHARACTER SET utf8 COLLATE utf8_general_ci,
IN singer_name VARCHAR(256) CHARACTER SET utf8 COLLATE utf8_general_ci
)
BEGIN

DECLARE result_code INTEGER DEFAULT 0; -- 定义返回结果并赋初值0
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET result_code=1; -- 在执行过程中出任何异常设置result_code为1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET result_code = 2; -- 如果表中没有下一条数据则置为2

START TRANSACTION;

# 写入歌曲
INSERT INTO song (name) VALUES (song_name);
SET @new_song_id = LAST_INSERT_ID();

# 写入歌手
INSERT INTO singer (name) VALUES (singer_name);
SET @new_singer_id = LAST_INSERT_ID();

# 写入关联表
INSERT INTO song_singer (song_id, singer_id) VALUES (@new_song_id, @new_singer_id);

-- 可以根据不同的业务逻辑错误返回不同的result_code,这里只定义了1和0
IF result_code = 1 THEN
# 回滚
ROLLBACK;
select 'transaction roll back';
ELSE
# 提交事务
COMMIT;
END IF;

END;

调用存储过程

1
2
call add_song('发如雪', '周杰伦');

如果过程中任何SQL失败,则输出

1
2
transaction roll back

参考:MySQL 存储过程

全文 >>

Play学习笔记——Hello World

参考

1
2
https://github.com/lupingqiu/metadata-scala-play

在project文件夹下添加

build.properties

1
2
sbt.version=1.2.1

plugins.sbt

1
2
3
4
5
6
7
8
9
// The Typesafe repository
resolvers += "Typesafe repository" at "https://repo.typesafe.com/typesafe/releases/"

// Typesafe snapshots
resolvers += "Typesafe Snapshots" at "https://repo.typesafe.com/typesafe/snapshots/"

// Use the Play sbt plugin for Play projects
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.12")

运行

1
2
3
sbt
run -Dhttp.port=8080