java 从零开始,学习笔记之基础入门<JDBC>(二十三)

JDBC

JDBC基本连接知识:

没有使用加工厂的链接

(没有使用加工厂的链接)

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class Conn {

public static void main(String[] args) {

// addUser("cw", "77777777777");

// selectAll();

//deleteUserById(5);

updateUserById(2,"神马","都是浮云");

}

public static void selectAll() {

Connection conn = null;

try {

// forName方法写上驱动类的完整路径

// 表示的是一个类加载器通过包名+类名来加载对应的类

// 类加载器会通过反射来加载字符串指定的类的实例

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

// 创建一个数据库连接

String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=sofeem";

conn = DriverManager.getConnection(url, "sa", "1234");

System.out.println(conn);

// 可以通过创建的conn去访问数据库建立了程序和数据库之间的连接

// 查询tb_user表中的所有信息

// 创建一个statement对象sql语句发送到数据库执行

Statement st = conn.createStatement();

String sql = "select * from tb_user";

// 执行查询返回执行之后的结果集创建结果集的对象来接收返回回来的多条数据

// 如果是查询操作,则调用executeQuery 方法

// 如果是增加、删除、修改操作则调用executeUpdate()方法

ResultSet rs = st.executeQuery(sql);

// 从结果集中取出对应的值

while (rs.next()) {

System.out.println("用户id:" + rs.getString("uid"));

System.out.println("用户姓名:" + rs.getString("uname"));

System.out.println(rs.getString("upass"));

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

// 往用户表中增加一条记录

public static void addUser(String name, String pass) {

Connection conn = null;

Statement st = null;

PreparedStatement ps = null;

try {

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

conn = DriverManager.getConnection(

"jdbc:sqlserver://localhost:1433;databaseName=sofeem",

"sa", "1234");

ps = conn

.prepareStatement("insert into tb_user(uname,upass) values(?,?)");

// 给问好赋值

ps.setString(1, name);

ps.setString(2, pass);

// 执行

ps.executeUpdate();

// 增加完成就完了,没有结果集的返回

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

// 根据id进行删除一条记录

public static void deleteUserById(int id) {

Connection conn = null;

PreparedStatement ps = null;

try {

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

conn = DriverManager.getConnection(

"jdbc:sqlserver://localhost:1433;databaseName=sofeem",

"sa", "1234");

// 创建sql语句预编译对象

String sql = "delete from tb_user where uid=?";

ps = conn.prepareStatement(sql);

// 给问好赋值

ps.setInt(1, id);

ps.executeUpdate();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

// 关闭数据库连接

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

// 根据uid来更新用户名和密码

public static void updateUserById(int id, String name, String pass) {

Connection conn = null;

PreparedStatement ps=null;

try {

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

conn = DriverManager.getConnection(

"jdbc:sqlserver://192.168.0.179:1433;databaseName=sofeem",

"sa", "1234");

String sql="update tb_user set uname=?,upass=? where uid=?";

ps=conn.prepareStatement(sql);

ps.setString(1, name);

ps.setString(2, pass);

ps.setInt(3, id);

ps.executeUpdate();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

}finally{

try {

ps.close();

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

// PreparedStatement Statement的区别?

/*

* 1 Pss 都是对sql语句到数据库中执行返回对应的数据,但是 Ps 有对sql语句进行预编译的过程,而s是直接执行

* 2 Ps执行sql语句的效率高于s执行sql语句的效率

* 如果在多次执行同一个操作的时候,那么Ps处理sql语句只需要编译一次,第二次处理sql语句就直接使用已经编译好的sql语句

* 如果使用的是s,则每次处理相同的操作的时候,每次都需要对sql语句进行编译再到数据库中执行

* 3 Ps的安全性高于s

* 正是因为Ps能够对sql语句进行预编译,所以它能够防止sql语句注入攻击,而s是直接执行sql语句,没有预编译过程

* 不能够防止sql注入

*

* */

}

使用加工厂的链接

(使用加工厂的链接)

package com.ibm.jdbc;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class CopyOfConn {

public static void main(String[] args) {

// addUser("aaaa", "bbbbbbbbbb");

selectAll();

// deleteUserById(5);

// updateUserById(2,"神马","都是浮云");

}

public static void selectAll() {

Connection conn = null;

try {

conn=ConnFactory.getConn();

Statement st = conn.createStatement();

String sql = "select * from tb_user";

ResultSet rs = st.executeQuery(sql);

while (rs.next()) {

System.out.println("用户id:" + rs.getString("uid"));

System.out.println("用户姓名:" + rs.getString("uname"));

System.out.println(rs.getString("upass"));

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

ConnFactory.closeConn(conn,null);

}

}

// 往用户表中增加一条记录

public static void addUser(String name, String pass) {

Connection conn = null;

PreparedStatement ps = null;

try {

conn=ConnFactory.getConn();

ps = conn

.prepareStatement("insert into tb_user(uname,upass) values(?,?)");

// 给问好赋值

ps.setString(1, name);

ps.setString(2, pass);

// 执行

ps.executeUpdate();

// 增加完成就完了,没有结果集的返回

}catch (SQLException e) {

e.printStackTrace();

} finally {

ConnFactory.closeConn(conn, ps);

}

}

// 根据id进行删除一条记录

public static void deleteUserById(int id) {

Connection conn = null;

PreparedStatement ps = null;

try {

conn=ConnFactory.getConn();

String sql = "delete from tb_user where uid=?";

ps = conn.prepareStatement(sql);

// 给问好赋值

ps.setInt(1, id);

ps.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

} finally {

// 关闭数据库连接

ConnFactory.closeConn(conn, ps);

}

}

// 根据uid来更新用户名和密码

public static void updateUserById(int id, String name, String pass) {

Connection conn = null;

PreparedStatement ps=null;

try {

conn =ConnFactory.getConn();

String sql="update tb_user set uname=?,upass=? where uid=?";

ps=conn.prepareStatement(sql);

ps.setString(1, name);

ps.setString(2, pass);

ps.setInt(3, id);

ps.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

}finally{

ConnFactory.closeConn(conn, ps);

}

}

// PreparedStatement Statement的区别?

/*

* 1 Pss 都是对sql语句到数据库中执行返回对应的数据,但是 Ps 有对sql语句进行预编译的过程,而s是直接执行

* 2 Ps执行sql语句的效率高于s执行sql语句的效率

* 如果在多次执行同一个操作的时候,那么Ps处理sql语句只需要编译一次,第二次处理sql语句就直接使用已经编译好的sql语句

* 如果使用的是s,则每次处理相同的操作的时候,每次都需要对sql语句进行编译再到数据库中执行

* 3 Ps的安全性高于s

* 正是因为Ps能够对sql语句进行预编译,所以它能够防止sql语句注入攻击,而s是直接执行sql语句,没有预编译过程

* 不能够防止sql注入

*

* */

}

(加工厂)

package com.ibm.conn;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

public class ConnFactory {

static Connection conn;

private static final String URL="jdbc:sqlserver://localhost:1433;databaseName=ibm";

private static final String USER="sa";

private static final String PASS="123";

static{

try {

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

public static Connection getConn(){

if(conn==null){

try {

conn=DriverManager.getConnection(URL,USER,PASS);

} catch (SQLException e) {

e.printStackTrace();

}

}

returnconn;

}

public static void closeConn(Connection conn,PreparedStatement ps,ResultSet rs){

if(conn!=null){

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

if(ps!=null){

try {

ps.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

if(rs!=null){

try {

rs.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

System.out.println(getConn());

}

}

DTO_DAO_实现增删改查

package com.ibm.conn;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

public class ConnFactory {

static Connection conn;

private static final String URL="jdbc:sqlserver://localhost:1433;databaseName=ibm";

private static final String USER="sa";

private static final String PASS="123";

static{

try {

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

public static Connection getConn(){

if(conn==null){

try {

conn=DriverManager.getConnection(URL,USER,PASS);

} catch (SQLException e) {

e.printStackTrace();

}

}

returnconn;

}

public static void closeConn(Connection conn,PreparedStatement ps,ResultSet rs){

if(conn!=null){

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

if(ps!=null){

try {

ps.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

if(rs!=null){

try {

rs.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

System.out.println(getConn());

}

}

package com.ibm.dao;

import java.util.List;

import com.ibm.vo.PersonVO;

public interface PDAO {

//在此接口中声明增删改查的方法

public void addPerson(PersonVO pv);

public void delePerson(int pid);

public void updatePerson(PersonVO pv,int id);

public List<PersonVO> selectPerson();

//模糊查询

public List<PersonVO> selectLikePerson(String name);

//分页

public List<PersonVO> selectByFenYe(int pagenum,int pagesize);

}

package com.ibm.dao.impl;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import com.ibm.conn.ConnFactory;

import com.ibm.dao.PDAO;

import com.ibm.vo.PersonVO;

public class PersonDaoImpl implements PDAO{

Connection conn;//申明一个全局的链接数据库的属性

PreparedStatement ps;

ResultSet rs;

List<PersonVO> list;

@Override

public void addPerson(PersonVO pv) {

String sql="insert into tb_person(pname,ppass,pbirth)values(?,?,?)";

ps=getPs(sql);

try {

ps.setString(1, pv.getPname());

ps.setString(2, pv.getPpass());

ps.setString(3, pv.getPbirth());

ps.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

}finally{

ConnFactory.closeConn(conn, ps, null);

}

}

@Override

public void delePerson(int pid) {

String sql="delete from tb_person where pid=?";

ps=getPs(sql);

try {

ps.setInt(1, pid);

ps.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

}finally{

ConnFactory.closeConn(conn, ps, null);

}

}

@Override

public void updatePerson(PersonVO pv, int id) {

String sql="update tb_person set pname=?,ppass=? where pid=? ";

ps=getPs(sql);

try {

// PersonVO pv1= new PersonVO();

ps.setString(1, pv.getPname());

ps.setString(2, pv.getPpass());

ps.setInt(3, id);

ps.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

}finally {

ConnFactory.closeConn(conn, ps, null);

}

}

@Override

public List<PersonVO> selectPerson() {

list = new ArrayList<PersonVO>();

String sql="select * from tb_person";

ps=getPs(sql);

try {

rs=ps.executeQuery();

while(rs.next()){

PersonVO pv= new PersonVO();

pv.setPid(rs.getInt("pid"));

pv.setPname(rs.getString("pname"));

pv.setPpass(rs.getString("ppass"));

pv.setPbirth(rs.getString("pbirth"));

list.add(pv);

}

} catch (SQLException e) {

e.printStackTrace();

}finally {

ConnFactory.closeConn(conn, ps, rs);

}

return list;

}

@Override

public List<PersonVO> selectLikePerson(String name) {

//创建集合对象来存放模糊查询到的结果值

list = new ArrayList<PersonVO>();

String sql="select * from tb_person where pname like '%"+name+"%'";

ps=getPs(sql);

try {

rs=ps.executeQuery();

while(rs.next()){

PersonVO pv=new PersonVO();

pv.setPid(rs.getInt("pid"));

pv.setPname(rs.getString("pname"));

pv.setPpass(rs.getString("ppass"));

pv.setPbirth(rs.getString("pbirth"));

list.add(pv);

}

} catch (SQLException e) {

e.printStackTrace();

}finally{

ConnFactory.closeConn(conn, ps, rs);

}

return list;

}

public PreparedStatement getPs(String sql){

PreparedStatement ps1=null;

conn=ConnFactory.getConn();

try {

ps1=conn.prepareStatement(sql);

} catch (SQLException e) {

e.printStackTrace();

}

return ps1;

}

@Override

public List<PersonVO> selectByFenYe(int pagenum, int pagesize) {

//取到总的记录数

int totalCount=getAllCount();

//定义一个能够分的总的页数

int totalPage=0;

if(totalCount%pagesize==0){

totalPage=totalCount/pagesize;

}else{

totalPage=totalCount/pagesize+1;

}

if(pagenum<1){

pagenum=1;

}

if(pagenum>totalPage){

pagenum+=1;

}

int n=(pagenum-1)*pagesize;

list = new ArrayList<PersonVO>();

String sql="select top (?) * from tb_person where pid not in" +

"(select top (?) pid from tb_person order by pid)";

ps=getPs(sql);

try {

ps.setInt(1, pagesize);

ps.setInt(2, n);

rs=ps.executeQuery();

while(rs.next()){

PersonVO pv=new PersonVO();

pv.setPid(rs.getInt("pid"));

pv.setPname(rs.getString("pname"));

pv.setPpass(rs.getString("ppass"));

pv.setPbirth(rs.getString("pbirth"));

list.add(pv);

}

} catch (SQLException e) {

e.printStackTrace();

}finally{

ConnFactory.closeConn(conn, ps, rs);

}

return list;

}

public int getAllCount(){

int count=0;

String sql="select count(*) from tb_person";

ps=getPs(sql);

try {

rs=ps.executeQuery();

while(rs.next()){

count=rs.getInt(1);

}

} catch (SQLException e) {

e.printStackTrace();

}

return count;

}

}

package com.ibm.test;

import java.util.List;

import com.ibm.dao.PDAO;

import com.ibm.dao.impl.PersonDaoImpl;

import com.ibm.vo.PersonVO;

public class Test {

public static void main(String[] args) {

//创建对象并赋值

PersonVO pv = new PersonVO();

pv.setPname("admin");

pv.setPpass("123");

pv.setPbirth("2012-2-14");

//调用增加的方法将创建的pv对象传递到增加方法中去

PDAO pdao = new PersonDaoImpl();

pdao.addPerson(pv);

//模糊查询

// List<PersonVO> l=pdao.selectLikePerson("a");

// for(PersonVO s:l){

// System.out.println(s.getPid()+s.getPname()+s.getPpass()+s.getPbirth());

// }

//删除记录

// pdao.delePerson(6);

//更新记录

// pv.setPname("yyyy");

// pv.setPpass("123");

// pdao.updatePerson(pv,5);

//查询所有记录

// List<PersonVO> ll= pdao.selectPerson();

// for(PersonVO s:ll){

// System.out.println("用户ID:"+s.getPid()+"\t\t用户名:"+s.getPname()+"\t\t密码:"+s.getPpass()+"\t\t出生日期:"+s.getPbirth());

// }

//

// List<PersonVO>ls = pdao.selectByFenYe(-3,2);

// for(PersonVO s:ls){

// System.out.println("用户ID:"+s.getPid()+"\t\t用户名:"+s.getPname()+"\t\t密码:"+s.getPpass()+"\t\t出生日期:"+s.getPbirth());

// }

//

}

}

package com.ibm.vo;

public class PersonVO {

privateintpid;

private String pname;

private String ppass;

private String pbirth;

public void setPid (int pid ){

this.pid = pid;

}

publicint getPid(){

return pid;

}

public String getPname() {

return pname;

}

public void setPname(String pname) {

this.pname = pname;

}

public String getPpass() {

returnppass;

}

public void setPpass(String ppass) {

this.ppass = ppass;

}

public String getPbirth() {

return pbirth;

}

public void setPbirth(String pbirth) {

this.pbirth = pbirth;

}

}

事务提交

package com.ibm.dao.impl;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import com.ibm.conn.ConnFactory;

public class TransactionDemo {

Connection conn;

PreparedStatement ps;

public PreparedStatement getPs(String sql){

conn=ConnFactory.getConn();

try {

ps=conn.prepareStatement(sql);

//把链接设置为不自动提交

conn.setAutoCommit(false);

} catch (SQLException e) {

e.printStackTrace();

}

return ps;

}

//对账户中的存款进行先取出400在存入800

public void show(int qq,int cq,int id) throws SQLException{

String sql="update tb_account set amoney=(amoney-?) where aid=?";

ps=getPs(sql);

ps.setFloat(1, qq);

ps.setInt(2, id);

ps.executeUpdate();

String sql2="update tb_account set amoney=(amoney+?) where aid=?";

ps=getPs(sql2);

ps.setFloat(1, cq);

ps.setInt(2,id);

ps.executeUpdate();

//执行两个操作的Ps对象是两个不同的对象

//手动提交事务

//只要两个ps操作有一个出现异常,那么事务回滚,事务全部失败

//事务要么全部成功,要么全部失败

conn.commit();//提交表示结束链接

// conn.setAutoCommit(true);

}

public static void main(String[] args) {

try {

new TransactionDemo().show(400, 800, 1);

} catch (SQLException e) {

e.printStackTrace();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值