1. 服务器的技术
JDBC的编程
JDBC+JSP+servlet+mySQL
在服务端维护数据。
2. 什么是JDBC
JDBC(Java DataBase Connectivity)是 使用 Java 存取数据库系统的标准解决方案,它将不同数据库间各自差异API与标准 SQL语句分开看待, 实现数据库无关的 Java操作接口。
开发人员使用 JDBC统一的API接口,并专注于标准 SQL 语句。 就可以避免直接处理底层数据库驱动程序与相关操作接口的差异性。
3. JDBC程序的工作原理
JDBC API
提供者:Sun
作用:定义与数据库建立连接、执行SQL语句、处理结果的方法
内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中
DriverManager类
提供者:Sun
作用:载入各种不同的JDBC驱动程序
JDBC驱动程序
提供者:数据库厂商
作用:针对具体的数据库产品实现JDBC API中的方法
Connection -------------> 数据库
1. 数据库的用户名
2. 密码
3. 数据库所在的机器的IP地址和端口号。
该语句必须要通过statement来执行,获得执行的结果。
4. 安装MySQL数据库
http://jingyan.baidu.com/article/f79b7cb3a25e759144023ee7.html
然后安装 Naticat 8 for MySQL.
1. 在MySQL中添加数据库
1. 打开 开始->所有程序->MySQL->MySQL Server5.5->MySQL5.5 command line client。
在这里,出现一个问题: 闪一下就消失了。
解决方法:
1. ->MySQL5.5 command line client,右键查看属性。
拷贝出来,内容是这样:"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql.exe" "--defaults-file=C:\Program Files\MySQL\MySQL Server 5.6\my.ini" "-uroot" "-p"
指定的配置文件是 my.ini文件,到C:\Program Files\MySQL\MySQL Server 5.6中,没有发现这个文件,只有my-default.ini。
把 my-default.ini重命令为my.ini,再次打开,成功了。
2. 在弹出的命令窗口中创建数据库。
mysql命令: http://wenku.baidu.com/view/8d8f4819964bcf84b9d57bc1.html
用数据库管理工具SQLyog,可以很方便的添加数据库,表等操作。
5. JDBC程序访问数据库的步骤
步骤一:加载JDBC驱动程序
步骤二:提供连接参数
步骤三:建立一个数据库的连接
步骤四:创建一个statement
步骤五:执行SQL语句
步骤六:处理结果
步骤七:关闭JDBC对象
Step1:加载JDBC驱动程序
根据不同的数据库加载对应厂商提供的驱动程序:
把厂商提供的驱动程序Jar包添加到classpath
在Java代码中显示加载数据库驱动程序类
try {
Class.forName("com.mysql.jdbc.Driver"); //step1
} catch (ClassNotFoundException cnfe) {
System.out.println("Error loading driver: " + cnfe);
}
不同数据库厂商的驱动类名不同
Oracle10g:oracle.jdbc.driver.OracleDriver
MySQL5:com.mysql.jdbc.Driver
SQLServer2005:com.microsoft.sqlserver.jdbc.SQLServerDriver
Step2:提供连接参数
Connection 是数据库连接的具体代表对象,一个Connection 对象就代表一个数据库连接,可以使用 DriverManager 的getConneciton()方法传入指定的连接URL、用户名和密码
驱动程序会自动通过DriverManager.registerDriver() 方法注册,这样DriverManager就可以跟厂商的驱动程序通信了。
java.sql.SQLException 是在处理 JDBC 时经常遇到的一个受检异常对象。
PreparedStatement的使用
PreparedStatement用于执行动态SQL语句
如果有些操作只是SQL语句中某些参数会有所不同,其余的SQL子句皆相同,则可以先把SQL语句预编译并存储在 PreparedStatement,然后可以使用此对象多次高效地执行该语句。
动态SQL语句:SQL中会变动的部分用?作为参数占位符。
SELECT * FROM emp WHERE empno=?
给参数占位符传递值
PreparedStatement提供的setXxx(int parameterIndex, 值)方法
Step4:关闭JDBC对象
数据库操作的代价是昂贵的。所以,在操作完成后要把所使用的JDBC对象全都显示关闭,以释放JDBC资源。
1.JdbcUtils.java
List<UserInfo> list = jdbcUtils.findMoreRefResult(sql,null, UserInfo.class);
就可从localhost连接下的json数据库的person表中 取出数据。
2. UserInfo.java
定义3个变量:id,username,pswd.
然后自动实现它的toString,get/set方法,就可以了。
JDBC的编程
JDBC+JSP+servlet+mySQL
在服务端维护数据。
2. 什么是JDBC
JDBC(Java DataBase Connectivity)是 使用 Java 存取数据库系统的标准解决方案,它将不同数据库间各自差异API与标准 SQL语句分开看待, 实现数据库无关的 Java操作接口。
开发人员使用 JDBC统一的API接口,并专注于标准 SQL 语句。 就可以避免直接处理底层数据库驱动程序与相关操作接口的差异性。
3. JDBC程序的工作原理
JDBC API
提供者:Sun
作用:定义与数据库建立连接、执行SQL语句、处理结果的方法
内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中
DriverManager类
提供者:Sun
作用:载入各种不同的JDBC驱动程序
JDBC驱动程序
提供者:数据库厂商
作用:针对具体的数据库产品实现JDBC API中的方法
Connection -------------> 数据库
1. 数据库的用户名
2. 密码
3. 数据库所在的机器的IP地址和端口号。
该语句必须要通过statement来执行,获得执行的结果。
4. 安装MySQL数据库
http://jingyan.baidu.com/article/f79b7cb3a25e759144023ee7.html
然后安装 Naticat 8 for MySQL.
1. 在MySQL中添加数据库
1. 打开 开始->所有程序->MySQL->MySQL Server5.5->MySQL5.5 command line client。
在这里,出现一个问题: 闪一下就消失了。
解决方法:
1. ->MySQL5.5 command line client,右键查看属性。
拷贝出来,内容是这样:"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql.exe" "--defaults-file=C:\Program Files\MySQL\MySQL Server 5.6\my.ini" "-uroot" "-p"
指定的配置文件是 my.ini文件,到C:\Program Files\MySQL\MySQL Server 5.6中,没有发现这个文件,只有my-default.ini。
把 my-default.ini重命令为my.ini,再次打开,成功了。
2. 在弹出的命令窗口中创建数据库。
mysql命令: http://wenku.baidu.com/view/8d8f4819964bcf84b9d57bc1.html
用数据库管理工具SQLyog,可以很方便的添加数据库,表等操作。
5. JDBC程序访问数据库的步骤
步骤一:加载JDBC驱动程序
步骤二:提供连接参数
步骤三:建立一个数据库的连接
步骤四:创建一个statement
步骤五:执行SQL语句
步骤六:处理结果
步骤七:关闭JDBC对象
Step1:加载JDBC驱动程序
根据不同的数据库加载对应厂商提供的驱动程序:
把厂商提供的驱动程序Jar包添加到classpath
在Java代码中显示加载数据库驱动程序类
try {
Class.forName("com.mysql.jdbc.Driver"); //step1
} catch (ClassNotFoundException cnfe) {
System.out.println("Error loading driver: " + cnfe);
}
不同数据库厂商的驱动类名不同
Oracle10g:oracle.jdbc.driver.OracleDriver
MySQL5:com.mysql.jdbc.Driver
SQLServer2005:com.microsoft.sqlserver.jdbc.SQLServerDriver
Step2:提供连接参数
连接URL
不同数据库产品的连接URL不同
Oracle10g:jdbc:oracle:thin:@主机名:端口:数据库SID
jdbc:oracle:thin:@localhost:1521:ORCL
MySQL5:jdbc:mysql://主机名:端口/数据库名
jdbc:mysql://localhost:3306/test
SQLServer2005:jdbc:sqlserver://主机名:端口:DatabaseName=库名
jdbc:sqlserver://localhost:1433:DatabaseName=BookDB
数据库的用户名和密码
Step3:建立一个数据库的连接
Connection 是数据库连接的具体代表对象,一个Connection 对象就代表一个数据库连接,可以使用 DriverManager 的getConneciton()方法传入指定的连接URL、用户名和密码
驱动程序会自动通过DriverManager.registerDriver() 方法注册,这样DriverManager就可以跟厂商的驱动程序通信了。
java.sql.SQLException 是在处理 JDBC 时经常遇到的一个受检异常对象。
PreparedStatement的使用
PreparedStatement用于执行动态SQL语句
如果有些操作只是SQL语句中某些参数会有所不同,其余的SQL子句皆相同,则可以先把SQL语句预编译并存储在 PreparedStatement,然后可以使用此对象多次高效地执行该语句。
动态SQL语句:SQL中会变动的部分用?作为参数占位符。
SELECT * FROM emp WHERE empno=?
给参数占位符传递值
PreparedStatement提供的setXxx(int parameterIndex, 值)方法
Step4:关闭JDBC对象
数据库操作的代价是昂贵的。所以,在操作完成后要把所使用的JDBC对象全都显示关闭,以释放JDBC资源。
1.JdbcUtils.java
public class JdbcUtils {
// 表示定义数据库的用户名
private final String USERNAME = "root";
// 定义数据库的密码
private final String PASSWORD = "ymangu123456";
// 定义数据库的驱动信息
private final String DRIVER = "com.mysql.jdbc.Driver";
// 定义访问数据库的地址
private final String URL = "jdbc:mysql://localhost:3306/json";
// 定义数据库的链接
private Connection connection;
// 定义sql语句的执行对象
private PreparedStatement pstmt;
// 定义查询返回的结果集合
private ResultSet resultSet;
public JdbcUtils() {
try {
Class.forName(DRIVER);
System.out.println("注册驱动成功!!");
} catch (Exception e) {
}
}
// 定义获得数据库的链接
public Connection getConnection() {
try {
connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (Exception e) {
// TODO: handle exception
}
return connection;
}
/**
* 完成对数据库的表的添加删除和修改的操作
*/
public boolean updateByPreparedStatement(String sql, List<Object> params)
throws SQLException {
boolean flag = false;
int result = -1;// 表示当用户执行添加删除和修改的时候所影响数据库的行数
pstmt = connection.prepareStatement(sql);
int index = 1;
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i));
}
}
result = pstmt.executeUpdate();
flag = result > 0 ? true : false;
return flag;
}
/**
* 查询返回单条记录
*/
public Map<String, Object> findSimpleResult(String sql, List<Object> params)
throws SQLException {
Map<String, Object> map = new HashMap<String, Object>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();// 返回查询结果
ResultSetMetaData metaData = resultSet.getMetaData();
int col_len = metaData.getColumnCount();// 获得列的名称
while (resultSet.next()) {
for (int i = 0; i < col_len; i++) {
String cols_name = metaData.getColumnName(i + 1);
Object cols_value = resultSet.getObject(cols_name);
if (cols_value == null) {
cols_value = "";
}
map.put(cols_name, cols_value);
}
}
return map; }
/**
* 查询返回多行记录
*/
public List<Map<String, Object>> findMoreResult(String sql,
List<Object> params) throws SQLException {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int cols_len = metaData.getColumnCount();
while (resultSet.next()) {
Map<String, Object> map = new HashMap<String, Object>();
for (int i = 0; i < cols_len; i++) {
String cols_name = metaData.getColumnName(i + 1);
Object cols_value = resultSet.getObject(cols_name);
if (cols_value == null) {
cols_value = "";
}
map.put(cols_name, cols_value);
}
list.add(map);
}
return list;
}
// jdbc的封装可以用反射机制来封装:
public <T> T findSimpleRefResult(String sql, List<Object> params,
Class<T> cls) throws Exception {
T resultObject = null;
int index = 1;
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int cols_len = metaData.getColumnCount();
while (resultSet.next()) {
// 通过反射机制创建实例
resultObject = cls.newInstance();
for (int i = 0; i < cols_len; i++) {
String cols_name = metaData.getColumnName(i+1);
Object cols_value = resultSet.getObject(cols_name);
if (cols_value == null) {
cols_value = "";
}
Field field = cls.getDeclaredField(cols_name);
field.setAccessible(true);// 打开javabean的访问private权限
field.set(resultObject, cols_value);
}
}
return resultObject;
}
/**
* 通过反射机制访问数据库
*/
public <T> List<T> findMoreRefResult(String sql, List<Object> params,
Class<T> cls) throws Exception {
List<T> list = new ArrayList<T>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int cols_len = metaData.getColumnCount();
while (resultSet.next()) {
T resultObject = cls.newInstance();
for (int i = 0; i < cols_len; i++) {
String cols_name = metaData.getColumnName(i + 1);
Object cols_value = resultSet.getObject(cols_name);
if (cols_value == null) {
cols_value = "";
}
Field field = cls.getDeclaredField(cols_name);
field.setAccessible(true);
field.set(resultObject, cols_value);
}
list.add(resultObject);
}
return list;
}
public void releaseConn() {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JdbcUtils jdbcUtils = new JdbcUtils();
jdbcUtils.getConnection();
// String sql = "insert into userinfo(username,pswd) values(?,?)";
// List<Object> params = new ArrayList<Object>();
// params.add("123");
// try {
// boolean flag = jdbcUtils.updateByPreparedStatement(sql, params);
// System.out.println(flag);
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
String sql = "select * from person where id=?";
List<Object> params = new ArrayList<Object>();
params.add(1);
try {
// List<UserInfo> list = jdbcUtils.findMoreRefResult(sql,
// null, UserInfo.class);
UserInfo user=jdbcUtils.findSimpleRefResult(sql,
params, UserInfo.class);
// Map<String,Object> map=jdbcUtils.findSimpleResult(sql, params);
System.out.println(user);
} catch (Exception e) {
// TODO: handle exception
} finally {
jdbcUtils.releaseConn();
}
}
}
查询多个对象时用:String sql = "select * from userinfo ";
List<UserInfo> list = jdbcUtils.findMoreRefResult(sql,null, UserInfo.class);
就可从localhost连接下的json数据库的person表中 取出数据。
2. UserInfo.java
定义3个变量:id,username,pswd.
然后自动实现它的toString,get/set方法,就可以了。