可读 有两种说法
①. 是指 文件属性是 -R 的(文件可读属性)
可执行文件一般指 .exe、.com的文件,是可以独立执行完成预定任务的一个程序
什么是数据库?
数据库是以某种文件结构存储的一系列信息表,这种文件结构使您能够访问这些表、选择表中的列、对表进行排序以及根据各种标准选择行.数据库通常有多个 索引与这些表中的许多列相关联,所以我们能尽可能快地访问这些表.
以员工记录为例,您可以设想一个含有员工姓名、地址、工资、扣税以及津贴等内容的表.让我们考虑一下这些内容可能如何组织在一起.您可以设想一个表包含员工姓名、地址和电话号码.您希望保存的其它信息可能包括工资、工资范围、上次加薪时间、下次加薪时间、员工业绩评定等内容.
这些内容是否应保存在一个表格中?几乎可以肯定不应该如此.不同类别的员工的工资范围可能没有区别;这样,您可以仅将员工类型储存在员工记录表中,而将工资范围储存在另一个表中,通过类型编号与这个表关联.考虑以下情况:
Key Lastname SalaryType SalaryType Min Max
第一范式:表中的每个表元应该只有一个值(永远不可能是一个数组).(1NF)
从数据库中获取数据
假设我们希望生成一个包含员工及其工资范围的表,在我们设计的一个练习中将使用这个表.这个表格不是直接存在在数据库中,但可以通过向数据库发出一个查询来构建它.我们希望得到如下所示的一个表:
Name Min Max
我们发现,获得这些表的查询形式如下所示
SELECT DISTINCTROW Employees.Name, SalaryRanges.Min,
SalaryRanges.Max FROM Employees INNER JOIN SalaryRanges ON Employees.SalaryKey = SalaryRanges.SalaryKey
ORDER BY SalaryRanges.Min;
数据库的种类
PC 上的数据库,如 dBase、Borland Paradox、Microsoft Access 和 FoxBase.
所有这些数据库产品都支持多种相对类似的 SQL 方言,所以呢,所有数据库最初看起来好象可以互换.每种数据库都有不同的性能特征,而且每一种都有不同的用户界面和编程接口.
ODBC
如果我们能够以某种方式编写不依赖于特定厂商的数据库的代码,并且能够不改变自己的调用程序即可从这些数据库中得到相同的结果,那将是一件很好的事.如果我们可以仅为所有这些数据库编写一些封装,使它们具有相似的编程接口,这种对数据库编程独立于供应商的特性将很容易实现.
什么是 JDBC?
JDBC 是对 ODBC API 进行的一种面向对象的封装和重新设计,它易于学习和使用,并且它真正能够使您编写不依赖厂商的代码,用以查询和操纵数据库.尽管它与所有 Java API 一样,都是面向对象的,但它并不是很高级别的对象集.
安装和使用 JDBC
将 \jdbc-odbc\classes; 路径添加到您的 PATH 环境变量中.
将 \jdbc-odbc\classes; 路径添加到您的 CLASSPATH 环境变量中.
JDBC 驱动程序的类型
Java 程序连接数据库的方法实际上有四种:
① JDBC-ODBC 桥和 ODBC 驱动程序 -- 在这种方式下,这是一个本地解决方案,因为 ODBC 驱动程序和桥代码必须出现在用户的每台机器中.从根本上说这是一个临时解决方案.
两层模型和三层模型
当数据库和查询它的应用程序在同一台机器上,而且没有服务器代码的干预时,我们将生成的程序称为两层模型.一层是应用程序,而另一层是数据库.在 JDBC-ODBC 桥系统中通常是这种情况.
当一个应用程序或 applet 调用服务器,服务器再去调用数据库时,我们称其为三层模型.当您调用称为"服务器"的程序时通常是这种情况.
编写 JDBC 代码访问数据库
用 ODBC 注册您的数据库
连接数据库
所有与数据库有关的对象和方法都在 java.sql 包中,所以呢在使用 JDBC 的程序中必须加入 "import java.sql.* ". JDBC 要连接 ODBC 数据库,您必须首先加载 JDBC-ODBC 桥驱动程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
该语句加载驱动程序,并创建该类的一个实例.然后,要连接一个特定的数据库,您必须创建 Connect 类的一个实例,并使用 URL 语法连接数据库.
String url = "jdbc:odbc:Northwind";
Connection con = DriverManager.getConnection(url);
请注意,您使用的数据库名是您在 ODBC 设置面板中输入的"数据源"名称.
URL 语法可能因数据库类型的不同而变化极大.
jdbc:subprotocol:subname
第一组字符代表连接协议,并且始终是 jdbc.还可能有一个子协议,在此处,子协议被指定为 odbc.它规定了一类数据库的连通性机制.如果您要连接其它机器上的数据库服务器,可能也要指定该机器和一个子目录:
jdbc:bark//doggie/elliott
最后,您可能要指定用户名和口令,作为连接字符串的一部分:
jdbc:bark//doggie/elliot;UID=GoodDog;PWD=woof
访问MSSQL Server方法:(驱动程序需要:msutil.jar,msbase.jar,mssqlServer.jar)
DBDriver=com.microsoft.jdbc.sqlserver.SQLServerDriver
username=sa
password=
maxcon=10
mincon=1
poolName=SkyDev
利用我们开发的数据库类,使用方法如下:
DbObject DbO = new DbObject(new SqlServerConnectionFactory("localhost",
Connection con = DbO.getConnection();
//类代码(不含连接工厂实现)
package skydev.modules.data;
public final class SqlServerConnectionFactory
extends ConnectionFactory {
private final String dbDriver =
"com.microsoft.jdbc.sqlserver.SQLServerDriver";
private String host;
private int port;
private String databaseName;
public SqlServerConnectionFactory() {
super.setDriverName(dbDriver);
}
/**
*
* @param host 数据库所在的主机名:如"localhost"
* @param databaseName 数据库名称
* @param userName 用户名
* @param password 口令
*/
public SqlServerConnectionFactory(String host,
int port,
String databaseName,
String userName,
String password) {
this.setHost(host);
this.setPort(port);
this.setDatabaseName(databaseName);
this.setUserName(userName);
this.setPassword(password);
init();
private void init() {
super.setUrl("jdbc:microsoft:sqlserver://" + host.trim() + ":" +
new Integer(port).toString() + ";DatabaseName=" +
databaseName.trim());
......
//------------------------------------------------------------------------------------
访问MySQL的方法:
DBDriver=com.mysql.jdbc.Driver
URL=jdbc:mysql://localhost/demo
username=
poolName=zhengmao
访问数据库
一旦连接到数据库,就可以请求表名以及表列的名称和内容等信息,而且您可以运行 SQL 语句来查询数据库或者添加或修改其内容.可用来从数据库中获取信息的对象有:
DatabaseMetaData 有关整个数据库的信息:表名、表的索引、数据库产品的名称和版本、数据库支持的操作.
ResultSet 关于某个表的信息或一个查询的结果.您必须逐行访问数据行,但是您可以任何顺序访问列.
ResultSetMetaData 有关 ResultSet 中列的名称和类型的信息.
尽管每个对象都有大量的方法让您获得数据库元素的极为详细的信息,但在每个对象中都有几种主要的方法使您可获得数据的最重要信息.然而,如果您希望看到比此处更多的信息,建议您学习文档以获得其余方法的说明.
ResultSet
ResultSet 对象是 JDBC 中最重要的单个对象.从本质上讲,它是对一个一般宽度和未知长度的表的一种抽象.几乎所有的方法和查询都将数据作为 ResultSet 返回.ResultSet 包含任意数量的命名列,您可以按名称访问这些列.它还包含一个或多个行,您可以按顺序自上而下逐一访问.在您使用 ResultSet 之前,必须查询它包含多少个列.此信息存储在 ResultSetMetaData 对象中.
//从元数据中获得列数
ResultSetMetaData rsmd;
rsmd = results.getMetaData();
numCols = rsmd.getColumnCount();
当您获得一个 ResultSet 时,它正好指向第一行之前的位置.您可以使用 next() 方法得到其他每一行,当没有更多行时,该方法会返回 false.由于从数据库中获取数据可能会导致错误,您必须始终将结果集处理语句包括在一个 try 块中.
您可以多种形式获取 ResultSet 中的数据,这取决于每个列中存储的数据类型.另外,您可以按列序号或列名获取列的内容.请注意,列序号从 1 开始,而不是从 0 开始.ResultSet 对象的一些最常用方法如下所示.
getInt(int); 将序号为 int 的列的内容作为整数返回.
getInt(String); 将名称为 String 的列的内容作为整数返回.
getFloat(int); 将序号为 int 的列的内容作为一个 float 型数返回.
getFloat(String); 将名称为 String 的列的内容作为 float 型数返回.
getDate(int); 将序号为 int 的列的内容作为日期返回.
getDate(String); 将名称为 String 的列的内容作为日期返回.
next(); 将行指针移到下一行.如果没有剩余行,则返回 false.
Close(); 关闭结果集.
getMetaData(); 返回 ResultSetMetaData 对象.
ResultSetMetaData
您使用 getMetaData() 方法从 ResultSet 中获取 ResultSetMetaData 对象.您可以使用此对象获得列的数目和类型以及每一列的名称.
getColumnCount(); 返回 ResultSet 中的列数.
getColumnName(int); 返回列序号为 int 的列名.
getColumnLabel(int); 返回此列暗含的标签.
isCurrency(int); 如果此列包含带有货币单位的一个数字,则返回 true.
isReadOnly(int); 如果此列为只读,则返回 true.
isAutoIncrement(int); 如果此列自动递增,则返回 true.这类列通常为键,而且始终是只读的.
getColumnType(int); 返回此列的 SQL 数据类型.这些数据类型包括
BIGINT
BINARY
BIT
CHAR
DATE
DECIMAL
DOUBLE
FLOAT
INTEGER
LONGVARBINARY
LONGVARCHAR
NULL
NUMERIC
OTHER
REAL
SMALLINT
TIME
TIMESTAMP
TINYINT
VARBINARY
VARCHAR
DatabaseMetaData
DatabaseMetaData 对象可为您提供整个数据库的信息.您主要用它获取数据库中表的名称,以及表中列的名称.由于不同的数据库支持不同的 SQL 变体,所以呢,也有多种方法查询数据库支持哪些 SQL 方法.
getCatalogs() 返回该数据库中的信息目录列表.使用 JDBC-ODBC Bridge 驱动程序,您可以获得用 ODBC 注册的数据库列表.这很少用于 JDBC-ODBC 数据库.
getTables(catalog, schema,tableNames, columnNames) 返回表名与 tableNames 相符而且列名与 columnNames 相符的所有表的说明.
getColumns(catalog, schema,tableNames, columnNames) 返回表名与 tableNames 相符而且列名与 columnNames 相符的所有表列说明.
getURL(); 获得您所连接的 URL 名称.
getDriverName(); 获得您所连接的数据库驱动程序的名称.
获取有关表的信息
results =dma.getTables(catalog, schema, tablemask, types[]);
其中参数的意义是:
Catalog 要在其中查找表名的目录名.对于 JDBC-ODBC 数据库以及许多其他数据库而言,可将其设置为 null.这些数据库的目录项实际上是它在文件系统中的绝对路径名称.
Schema 要包括的数据库"方案".许多数据库不支持方案,而对另一些数据库而言,它代表数据库所有者的用户名.一般将它设置为 null.
Tablemask 一个掩码,用来描述您要检索的表的名称.如果您希望检索所有表名,则将其设为通配符 %.请注意,SQL 中的通配符是 % 符号,而不是一般 PC 用户的 * 符号.
types[] 这是描述您要检索的表的类型的 String 数组.数据库中通常包括许多用于内部处理的表,而对作为用户的您没什么价值.如果它是空值,则您会得到所有这些表.如果您将其设为包含字符串"TABLES"的单元素数组,您将仅获得对用户有用的表格.
一个简单的 JDBC 程序
我们已经学习了 JDBC 的所有基本功能,现在我们可以编写一个简单的程序,该程序打开数据库,打印它的表名以及某一表列的内容,然后对该数据库执行查询.此程序如下所示:
package skydevkit;
import java.sql.*;
public class JdbcOdbc_test {
ResultSet results;
DatabaseMetaData dma;
Connection con;
public JdbcOdbc_test() throws SQLException {
try {
//加载 JDBC-ODBC 桥驱动程序
con = DriverManager.getConnection(url);//连接数据库
dma = con.getMetaData();//获取数据库的元数据
System.out.println("Connected to:" + dma.getURL());
System.out.println("Driver " + dma.getDriverName());
} catch (Exception e) {
System.out.println(e);
Statement stmt = con.createStatement();
results = stmt.executeQuery("select * from 客户;");
ResultSetMetaData resultMetaData = results.getMetaData();
int cols = resultMetaData.getColumnCount();
String resultRow = "";
for (int i = 1; i cols; i++) {
resultRow += resultMetaData.getColumnName(i) + ";";
System.out.println(resultRow);
while (results.next()) {
resultRow = "";
resultRow += results.getString(i) + ";";
} catch (NullPointerException e) {
System.out.println(e.getMessage());
System.out.println("query exception");
} finally {
results.close();
补充高级内容
关于调用SQLServer存储过程的例子:(用到了我们开发的数据库连接类)
CREATE PROCEDURE [dbo].[sp_getStudentByName](@name char(10))
AS
GO
CallableStatement pstmt = null;
System.out.println("TestDB1()............");
/* try {
pstmt = con.prepareCall("{call sp_getStudentById(?)}");
pstmt.setInt(1, 1);
}*/
pstmt = con.prepareCall("{call sp_getStudentByName(?)}"); //注意参数如何传递
pstmt.setString(1, "Tom");
使用输出参数:
CREATE PROCEDURE [dbo].[sp_insertStudent](@name char(10),@age int,@id int OUTPUT) AS
insert into Students([Name],[Age]) values (@name,@age)
select @id=@@IDENTITY
pstmt = con.prepareCall("{call sp_insertStudent(?,?,?)}");
pstmt.setString(1, "zengqingsong");
pstmt.executeUpdate();
System.out.println(id);
使用返回参数的例子:
select @id=@@IDENTITY –测试输出参数
pstmt = con.prepareCall("{?=call sp_insertStudent(?,?,?)}");
pstmt.registerOutParameter(1, Types.INTEGER);
int ret = pstmt.executeUpdate(); //执行影响的行数
System.out.println(ret);
PostgreSQL和MySQL比较,它更加庞大一点,因为它是用来替代Oracle而设计的.所以在企业应用中采用PostgreSQL是一个明智的选择.
现在MySQL被Oracle收购之后,有传闻Oracle正在逐步的封闭MySQL,,鉴于此,将来我们也许会选择PostgreSQL而不是MySQL作为项目的后端数据库.
①.、驱动
Go实现的支持PostgreSQL的驱动也很多,因为国外很多人在开发中使用了这个数据库.
支持database/sql驱动,纯Go写的
在下面的示例中我采用了第一个驱动,因为它目前使用的人最多,在github上也比较活跃.
数据库建表语句:
复制代码
CREATE TABLE userinfo
(
uid serial NOT NULL,
username character varying(100) NOT NULL,
Created date,
CONSTRAINT userinfo_pkey PRIMARY KEY (uid)
)
WITH (OIDS=FALSE);
CREATE TABLE userdeatail
uid integer,
intro character varying(100),
profile character varying(100)
WITH(OIDS=FALSE);
看下面这个Go如何操作数据库表数据:增删改查
package main
import (
"database/sql"
"fmt"
_ "github.com/bmizerany/pq"
func main() {
db, err := sql.Open("postgres", "user=astaxie password=astaxie dbname=test sslmode=disable")
checkErr(err)
//插入数据
//pg不支持这个函数,因为他没有类似MySQL的自增ID
id, err := res.LastInsertId()
fmt.Println(id)
//更新数据
res, err = stmt.Exec("astaxieupdate", 1)
affect, err := res.RowsAffected()
fmt.Println(affect)
//查询数据
rows, err := db.Query("SELECT * FROM userinfo")
for rows.Next() {
var uid int
var username string
var department string
var created string
err = rows.Scan(uid, username, department, created)
fmt.Println(uid)
fmt.Println(username)
fmt.Println(department)
fmt.Println(created)
//删除数据
stmt, err = db.Prepare("delete from userinfo where uid=$1")
res, err = stmt.Exec(1)
affect, err = res.RowsAffected()
db.Close()
func checkErr(err error) {
if err != nil {
panic(err)
还有pg不支持LastInsertId函数,因为PostgreSQL内部没有实现类似MySQL的自增ID返回,其他的代码几乎是一模一样
本教程介绍了使用 Godatabase/sql及其标准库中的包访问关系数据库的基础知识.
您将使用的database/sql包包括用于连接数据库、执行事务、取消正在进行的操作等的类型和函数.
在本教程中,您将创建一个数据库,然后编写代码来访问该数据库.您的示例项目将是有关老式爵士乐唱片的数据存储库.
首先,为您要编写的代码创建一个文件夹.
①.、打开命令提示符并切换到您的主目录.
在 Linux 或 Mac 上:
在 Windows 上:
运行go mod init命令,为其提供新代码的模块路径.
此命令创建一个 go.mod 文件,您添加的依赖项将在其中列出以供跟踪.
注意: 在实际开发中,您会指定一个更符合您自己需求的模块路径.有关更多信息,请参阅一下文章.
GO语言(二十五):管理依赖项(上)
GO语言(二十六):管理依赖项(中)
GO语言(二十七):管理依赖项(下)
此时此刻呢,您将创建一个数据库.
在此步骤中,您将创建要使用的数据库.您将使用 DBMS 本身的 CLI 创建数据库和表,以及添加数据.
您将创建一个数据库,其中包含有关黑胶唱片上的老式爵士乐录音的数据.
这里的代码使用MySQL CLI,但大多数 DBMS 都有自己的 CLI,具有类似的功能.
①.、打开一个新的命令提示符.
在命令行,登录到您的 DBMS,如下面的 MySQL 示例所示.
将以下 SQL 代码粘贴到文件中,然后保存文件.
在此 SQL 代码中:
(1)删除名为album表. 首先执行此命令可以让您更轻松地稍后重新运行脚本.
您将使用以下形式的source命令:
此时此刻呢,您将编写一些 Go 代码进行连接,以便进行查询.
现在你已经有了一个包含一些数据的数据库,开始你的 Go 代码.
找到并导入一个数据库驱动程序,该驱动程序会将您通过database/sql包中的函数发出的请求转换为数据库可以理解的请求.
①.、在您的浏览器中,访问SQLDrivers wiki 页面以识别您可以使用的驱动程序.
在此代码中:
(1)将您的代码添加到main包中,以便您可以独立执行它.
导入驱动程序后,您将开始编写代码以访问数据库.
现在编写一些 Go 代码,让您使用数据库句柄访问数据库.
您将使用指向结构的指针sql.DB,它表示对特定数据库的访问.
编写代码
①.、进入 main.go,在import您刚刚添加的代码下方,粘贴以下 Go 代码以创建数据库句柄.
该Config结构使代码比连接字符串更容易阅读.
为了简化代码,您调用log.Fatal结束执行并将错误打印到控制台.在生产代码中,您会希望以更优雅的方式处理错误.
文件的顶部现在应该如下所示:
①.、开始跟踪 MySQL 驱动程序模块作为依赖项.
使用go get 添加 github.com/go-sql-driver/mysql 模块作为您自己模块的依赖项.使用点参数表示"获取当前目录中代码的依赖项".
连接成功了!
此时此刻呢,您将查询一些数据.
以上就是土嘎嘎小编为大家整理的go语言使用jdbc驱动相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!