JDBC使用
1、准备
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
private String user = "root";
private String password = "admin";
// 默认情况(localhost:3306)可以省略
private String url = "jdbc:mysql:///mysqltest";
2.创建连接别执行语句:
Connection conn = null;
Statement st = null;
// 建立连接
conn = DriverManager.getConnection(url, user, password);
// 创建Statement对象
st = conn.createStatement();
// 准备SQL
String sql = "INSERT INTO test VALUES (null,'abc')";
// 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如
// SQL DDL 语句)。
// 执行一条插入数据的SQL语句
int ret = st.executeUpdate(sql);
3.关闭资源:
// 关闭资源
try {
if (st != null)
st.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
在JDBC中代码的实现基本是一样的!都是这三步,上面是一个静态sql大体方法,对于JDBC的静态操作是比较简单的。
下面是一个完整的实例:
public class DmlTest {
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private String user = "root";
private String password = "admin";
// 默认情况(localhost:3306)可以省略
private String url = "jdbc:mysql:///mysqltest";
@Test
public void testInsert() {
Connection conn = null;
Statement st = null;
try {
// 建立连接
conn = DriverManager.getConnection(url, user, password);
// 创建Statement对象
st = conn.createStatement();
// 准备SQL
String sql = "INSERT INTO test VALUES (null,'abc')";
// 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如
// SQL DDL 语句)。
// 执行一条插入数据的SQL语句
int ret = st.executeUpdate(sql);
System.out.println(ret);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (st != null)
st.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Test
public void testUpdate(){
Connection conn=null;
Statement st=null;
try{
//得到连接
conn=DriverManager.getConnection(url,user,password);
//创建statement对象
st=conn.createStatement();
//拼SQL
String sql="UPDATE test SET name = '123'";
//执行SQL
int ret=st.executeUpdate(sql);
System.out.println(ret);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
//释放资源
if(st!=null) st.close();
if(conn!=null) conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
一个查询的例子
public void testProductSelect() {
// request.getParameter("searchName");
String searchName = "罗技M";
Connection conn = null;
Statement st = null;
// 准备一个结果集
ResultSet rs = null;
try {
conn = DriverManager.getConnection(url, user, password);
st = conn.createStatement();
String sql = "SELECT * FROM product WHERE productname LIKE '%"
+ searchName + "%'";
rs = st.executeQuery(sql);
List<Product> ret = new ArrayList<Product>();
while (rs.next()) {
Product p = new Product();
// 以 Java 编程语言中 long 的形式检索此 ResultSet 对象的当前行中指定列的值。
// columnIndex - 第一个列是 1,第二个列是 2
p.setId(rs.getLong("id"));
p.setName(rs.getString("productname"));
p.setProductDir(rs.getLong("dir_id"));
p.setSalePrice(rs.getBigDecimal("saleprice"));
p.setSupplier(rs.getString("supplier"));
p.setBrand(rs.getString("brand"));
p.setCutoff(rs.getBigDecimal("cutoff"));
p.setCostPrice(rs.getBigDecimal("costprice"));
ret.add(p);
}
for (Product p : ret) {
System.out.println(p);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (st != null)
st.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
工具类:
吧一些常用的东西集合起来编写一个工具类,方便以后使用
下面就是一个MYSQL的工具类:
/**
* JDBC工具类
*
* @author Administrator
*
*/
public final class JdbcUtil {
private static JdbcUtil instance = new JdbcUtil();
private String url = "jdbc:mysql:///mysqltest";
private String user = "root";
private String password = "admin";
private JdbcUtil() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static JdbcUtil getInstance() {
return instance;
}
/**
* 得连接对象
* @return
*/
public Connection getConnection() {
try {
return DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 关闭资源
* @param conn
* @param st
* @param rs
*/
public void close(Connection conn, Statement st, ResultSet rs) {
try {
if (rs != null)
rs.close();
if (st != null)
st.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
由于这是一个工具类只需要调用里面的部分方法,说以吧把他写成final的,自己不自己给实例出来,对外提供一个getInstance ()方法得到实例,由于是static 的所以在项目一开始就会存在
PreparedStatement
PreparedStatement解决SQL注入的危险,避免万能密码,里面得参数使用占位符代替,然后再使用 setXXX(parameterIndex, x)方法;设置参数,并侧的有优化的功能,因为他是一句预编译的语句。在MySQL 中不支持PreparedStatement的存储优化。
下面是一段PreparedStatement插入的代码:
public class PreparedStatementTest {
private JdbcUtil util = null;
public PreparedStatementTest() {
util = JdbcUtil.getInstance();
}
@Test
public void testInsert(){
Connection conn=null;
PreparedStatement ps=null;
try{
//获得连接对象
conn=util.getConnection();
//组织SQL语句
String sql="INSERT INTO test(name) VALUES (?)";
//创建PreparedStatement对象
ps=conn.prepareStatement(sql);
//设置参数
ps.setString(1,"test1");
//执行SQL
ps.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
util.close(conn, ps, null);
}
}
@Test
public void testSelect(){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
//获得连接对象
conn=util.getConnection();
//组织SQL语句
String sql="SELECT * FROM test WHERE id = ?";
//创建PreparedStatement对象
ps=conn.prepareStatement(sql);
//设置参数
ps.setLong(1,7l);
//执行SQL
rs=ps.executeQuery();
if(rs.next()){
System.out.println(rs.getString("name"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
util.close(conn, ps, rs);
}
}
}
大文件的存取
在打文件的存去中会使用Blob这个类型,有255,16M,4G这三个容量,同时Text也有对应属性,在读取中使用流读取存入!
public class BlobTest {
private JdbcUtil util;
public BlobTest() {
util = JdbcUtil.getInstance();
}
@Test
public void testWrite() {
Connection conn = null;
PreparedStatement ps = null;
InputStream is = null;
try {
// 得到连接对象
conn = util.getConnection();
// 组织SQL
String sql = "INSERT INTO pics(pic) VALUES (?)";
ps = conn.prepareStatement(sql);
String path = "E:\\javaworkspace2\\jdbc\\src\\cd\\itcast\\jdbc\\day2\\test\\blob\\mt.bmp";
is = new FileInputStream(path);
// 设置值
ps.setBlob(1, is);
// 执行SQL
ps.executeUpdate();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
util.close(conn, ps, null);
}
}
@Test
public void testRead() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String path = "E:\\javaworkspace2\\jdbc\\src\\cd\\itcast\\jdbc\\day2\\test\\blob\\ymd.bmp";
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
// 得到连接对象
conn = util.getConnection();
// 组织SQL
String sql = "SELECT pic FROM pics WHERE id = ?";
ps = conn.prepareStatement(sql);
// 设置值
ps.setLong(1, 1l);
// 执行SQL
rs = ps.executeQuery();
if (rs.next()) {
Blob b = rs.getBlob("pic");
bis = new BufferedInputStream(b.getBinaryStream());
bos = new BufferedOutputStream(new FileOutputStream(path));
byte[] buffer = new byte[1024];
int len = 0;
while ((len = bis.read(buffer, 0, 1024)) != -1) {
bos.write(buffer, 0, len);
}
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
util.close(conn, ps, null);
}
}
}
1、准备
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
private String user = "root";
private String password = "admin";
// 默认情况(localhost:3306)可以省略
private String url = "jdbc:mysql:///mysqltest";
2.创建连接别执行语句:
Connection conn = null;
Statement st = null;
// 建立连接
conn = DriverManager.getConnection(url, user, password);
// 创建Statement对象
st = conn.createStatement();
// 准备SQL
String sql = "INSERT INTO test VALUES (null,'abc')";
// 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如
// SQL DDL 语句)。
// 执行一条插入数据的SQL语句
int ret = st.executeUpdate(sql);
3.关闭资源:
// 关闭资源
try {
if (st != null)
st.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
在JDBC中代码的实现基本是一样的!都是这三步,上面是一个静态sql大体方法,对于JDBC的静态操作是比较简单的。
下面是一个完整的实例:
public class DmlTest {
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private String user = "root";
private String password = "admin";
// 默认情况(localhost:3306)可以省略
private String url = "jdbc:mysql:///mysqltest";
@Test
public void testInsert() {
Connection conn = null;
Statement st = null;
try {
// 建立连接
conn = DriverManager.getConnection(url, user, password);
// 创建Statement对象
st = conn.createStatement();
// 准备SQL
String sql = "INSERT INTO test VALUES (null,'abc')";
// 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如
// SQL DDL 语句)。
// 执行一条插入数据的SQL语句
int ret = st.executeUpdate(sql);
System.out.println(ret);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (st != null)
st.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Test
public void testUpdate(){
Connection conn=null;
Statement st=null;
try{
//得到连接
conn=DriverManager.getConnection(url,user,password);
//创建statement对象
st=conn.createStatement();
//拼SQL
String sql="UPDATE test SET name = '123'";
//执行SQL
int ret=st.executeUpdate(sql);
System.out.println(ret);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
//释放资源
if(st!=null) st.close();
if(conn!=null) conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
一个查询的例子
public void testProductSelect() {
// request.getParameter("searchName");
String searchName = "罗技M";
Connection conn = null;
Statement st = null;
// 准备一个结果集
ResultSet rs = null;
try {
conn = DriverManager.getConnection(url, user, password);
st = conn.createStatement();
String sql = "SELECT * FROM product WHERE productname LIKE '%"
+ searchName + "%'";
rs = st.executeQuery(sql);
List<Product> ret = new ArrayList<Product>();
while (rs.next()) {
Product p = new Product();
// 以 Java 编程语言中 long 的形式检索此 ResultSet 对象的当前行中指定列的值。
// columnIndex - 第一个列是 1,第二个列是 2
p.setId(rs.getLong("id"));
p.setName(rs.getString("productname"));
p.setProductDir(rs.getLong("dir_id"));
p.setSalePrice(rs.getBigDecimal("saleprice"));
p.setSupplier(rs.getString("supplier"));
p.setBrand(rs.getString("brand"));
p.setCutoff(rs.getBigDecimal("cutoff"));
p.setCostPrice(rs.getBigDecimal("costprice"));
ret.add(p);
}
for (Product p : ret) {
System.out.println(p);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (st != null)
st.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
工具类:
吧一些常用的东西集合起来编写一个工具类,方便以后使用
下面就是一个MYSQL的工具类:
/**
* JDBC工具类
*
* @author Administrator
*
*/
public final class JdbcUtil {
private static JdbcUtil instance = new JdbcUtil();
private String url = "jdbc:mysql:///mysqltest";
private String user = "root";
private String password = "admin";
private JdbcUtil() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static JdbcUtil getInstance() {
return instance;
}
/**
* 得连接对象
* @return
*/
public Connection getConnection() {
try {
return DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 关闭资源
* @param conn
* @param st
* @param rs
*/
public void close(Connection conn, Statement st, ResultSet rs) {
try {
if (rs != null)
rs.close();
if (st != null)
st.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
由于这是一个工具类只需要调用里面的部分方法,说以吧把他写成final的,自己不自己给实例出来,对外提供一个getInstance ()方法得到实例,由于是static 的所以在项目一开始就会存在
PreparedStatement
PreparedStatement解决SQL注入的危险,避免万能密码,里面得参数使用占位符代替,然后再使用 setXXX(parameterIndex, x)方法;设置参数,并侧的有优化的功能,因为他是一句预编译的语句。在MySQL 中不支持PreparedStatement的存储优化。
下面是一段PreparedStatement插入的代码:
public class PreparedStatementTest {
private JdbcUtil util = null;
public PreparedStatementTest() {
util = JdbcUtil.getInstance();
}
@Test
public void testInsert(){
Connection conn=null;
PreparedStatement ps=null;
try{
//获得连接对象
conn=util.getConnection();
//组织SQL语句
String sql="INSERT INTO test(name) VALUES (?)";
//创建PreparedStatement对象
ps=conn.prepareStatement(sql);
//设置参数
ps.setString(1,"test1");
//执行SQL
ps.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
util.close(conn, ps, null);
}
}
@Test
public void testSelect(){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
//获得连接对象
conn=util.getConnection();
//组织SQL语句
String sql="SELECT * FROM test WHERE id = ?";
//创建PreparedStatement对象
ps=conn.prepareStatement(sql);
//设置参数
ps.setLong(1,7l);
//执行SQL
rs=ps.executeQuery();
if(rs.next()){
System.out.println(rs.getString("name"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
util.close(conn, ps, rs);
}
}
}
大文件的存取
在打文件的存去中会使用Blob这个类型,有255,16M,4G这三个容量,同时Text也有对应属性,在读取中使用流读取存入!
public class BlobTest {
private JdbcUtil util;
public BlobTest() {
util = JdbcUtil.getInstance();
}
@Test
public void testWrite() {
Connection conn = null;
PreparedStatement ps = null;
InputStream is = null;
try {
// 得到连接对象
conn = util.getConnection();
// 组织SQL
String sql = "INSERT INTO pics(pic) VALUES (?)";
ps = conn.prepareStatement(sql);
String path = "E:\\javaworkspace2\\jdbc\\src\\cd\\itcast\\jdbc\\day2\\test\\blob\\mt.bmp";
is = new FileInputStream(path);
// 设置值
ps.setBlob(1, is);
// 执行SQL
ps.executeUpdate();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
util.close(conn, ps, null);
}
}
@Test
public void testRead() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String path = "E:\\javaworkspace2\\jdbc\\src\\cd\\itcast\\jdbc\\day2\\test\\blob\\ymd.bmp";
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
// 得到连接对象
conn = util.getConnection();
// 组织SQL
String sql = "SELECT pic FROM pics WHERE id = ?";
ps = conn.prepareStatement(sql);
// 设置值
ps.setLong(1, 1l);
// 执行SQL
rs = ps.executeQuery();
if (rs.next()) {
Blob b = rs.getBlob("pic");
bis = new BufferedInputStream(b.getBinaryStream());
bos = new BufferedOutputStream(new FileOutputStream(path));
byte[] buffer = new byte[1024];
int len = 0;
while ((len = bis.read(buffer, 0, 1024)) != -1) {
bos.write(buffer, 0, len);
}
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
util.close(conn, ps, null);
}
}
}