2020.8.22JDBC原理以及Dao分层

1.JDBC访问数据库步骤

public class BaseDao{

public connection getConnection(){

//加载驱动:

Class.forName("com.mysql.jdbc.Driver");

String url="jdbc:mysql:192.168l.183.31/数据库名;

//驱动管理获取连接

Connection connection=DriverManager.getConnection(url,"用户名","密码");

return connection;

}

//查询表结构方法

public void showTables(){

Connection connection=getConnection;

Statement stmt=connection.createStatement;

String str="show tables";

RestultSet rs=stmt.executeQuery(sql)

while(rs.next()){

system.out.println(rs.getString("Tables_in_Myschool"))//用标签查询表结构

//system.out.println(rs.getString("1"))//用索引查询表结构

    }

}

//通用查询方法

public ResultSet query(String sql) throwsException{

Connection connection =getConnection();

Statement stmt=connection.createStatement();

ResultSet rs=stmt.executeQuery(sql);

return rs;

    }

//查询方法进阶一

public ResultSet query(String sql,int id,String name) throwsException{

Connection connection =getConnection();

PreparedStatement pst=connection.prepareStatement(sql)

pst.setObject(1,id);

pst.setObject(2,name);

ResultSet rs=pst.executeQuery();

return rs;

    }

//增删改方法

public int update(String sql)throws Exception{

Connection connection=getConnection();

Statement  stmt=connection.createStatement;

int num=stmt.executeUpate(sql);

return num

    }

}

注:此时需要对要查询的表创建一个类,定义它的字段

例如要查询student表

public class student{

private int StudentNo;

private int GradeId;

private String StudentName;

private String sex;

private int GradeId;

private String Phone;

private String Address;

private String BornDate;

private String Email;

private String IdentityCard;

@Override

public String toString() {

return "Student{" +

"StudentNo=" + StudentNo +

", StudentName='" + StudentName + '\'' +

", sex='" + sex + '\'' +

", GradeId=" + GradeId +

", Phone='" + Phone + '\'' +

", Address='" + Address + '\'' +

", BornDate='" + BornDate + '\'' +

", Email='" + Email + '\'' +

", IdentityCard='" + IdentityCard + '\'' +

'}';

}

 

public int getStudentNo() {

return StudentNo;

}

 

public void setStudentNo(int studentNo) {

StudentNo = studentNo;

}

 

public String getStudentName() {

return StudentName;

}

 

public void setStudentName(String studentName) {

StudentName = studentName;

}

 

public String getSex() {

return sex;

}

 

public void setSex(String sex) {

this.sex = sex;

}

 

public int getGradeId() {

return GradeId;

}

 

public void setGradeId(int gradeId) {

GradeId = gradeId;

}

 

public String getPhone() {

return Phone;

}

 

public void setPhone(String phone) {

Phone = phone;

}

 

public String getAddress() {

return Address;

}

 

public void setAddress(String address) {

Address = address;

}

 

public String getBornDate() {

return BornDate;

}

 

public void setBornDate(String bornDate) {

BornDate = bornDate;

}

 

public String getEmail() {

return Email;

}

 

public void setEmail(String email) {

Email = email;

}

 

public String getIdentityCard() {

return IdentityCard;

}

 

public void setIdentityCard(String identityCard) {

IdentityCard = identityCard;

}

}

再定义测试类:

public class BaseDaoTest{

//获取连接

@Test

public getConnection ()throws Exception{

    BaseDao dao=new BaseDao();

    Connection connection=dao.getConnection();

}

//显示表结构

@Test

public void showTables(){

BaseDao dao=new BaseDao();

dao.showTables();

}

//通用查询,例如查询学生类

@test

public void query()throws Exception{

BaseDao dao=new BaseDao();

String sql="select * from student";

ResultSet rs=dao.query(sql);

ArrayList<Student>subList=new ArrayList<>();

while(rs.next()){

Student s=new Student();

//注意这里的StudentNo要跟数据库中的字段名相同,类型也要一致,一一对应

s.setStudentNo(rs.getInt("StudentNo"));

s.setStudentName(rs.getString("StudentName"));

s.estPhone(rs.getString("Phone"));

s.setSex(rs.getString("Sex"));

s.setGradeId(rs.getInt("GradeId"));

s.setAddress(rs.getString("Address"));

s.setEmail(rs.getString("Email"));

s.setBornDate(rs.getString("BornDate"));

s.setIdentityCard(rs.getString("IdentityCard"));

subList.add(s);

    }

for(Student student: subList){

system.out.println(student);

}

//进阶查询学生表

@test

public void query()throws Exception{

BaseDao dao=new BaseDao();

String sql="select * from student where StudentNo=? or StudentName like ?";

ResultSet rs=dao.query(sql,1001,"李%");

ArrayList<Student>subList=new ArrayList<>();

while(rs.next()){

Student s=new Student();

//注意这里的StudentNo要跟数据库中的字段名相同,类型也要一致,一一对应

s.setStudentNo(rs.getInt("StudentNo"));

s.setStudentName(rs.getString("StudentName"));

s.estPhone(rs.getString("Phone"));

s.setSex(rs.getString("Sex"));

s.setGradeId(rs.getInt("GradeId"));

s.setAddress(rs.getString("Address"));

s.setEmail(rs.getString("Email"));

s.setBornDate(rs.getString("BornDate"));

s.setIdentityCard(rs.getString("IdentityCard"));

subList.add(s);

    }

for(Student student: subList){

system.out.println(student);

}

//增

@Test

public void update()throws Exception{

    BaseDao dao=new BaseDao();

    String sql="insert into Student(StudentNo,StudentName)

values(1,"王五")";

int num=dao.update(sql);

system.out.println(num>0?"插入成功":"插入失败");

}

//创建数据库和表

public void testDao()throws Exception{

BaseDao dao=new BaseDao();

Connection connection=dao.getconnection();

Statement stmt=connection.createStatement();

String createDatabase="create database if not exists user";

stmt.excute(createDatebase);

String createTable="create table if not exists user_info

(uid int(11) auto_incremnet primary key, name varchar(30))";

stmt.excute(createTable);

    }

}

//进阶查询2

//1.在BaseDao添加新的方法

public void close(Connection connection,Statement stmt,ResultSet rs)throws Exception{

if(connection!=null){

connection.close();

    }

if(stmt!=null){

    stmt.close();

    }

if(rs!=null){

    rs.close();

    }

}

//2.在BaseDaoTest中的getConnection方法中添加

dao.close(connection,null,null);

并在query方法最后加上:   dao.close(null,null,rs);

3.//创建新的类PstDao

public class PstDao{

//建立连接

public static Connection getConnection(String url,String user,String pwd)

Class.forName("com.mysql.jdbc.Driver");

return DriverManager.getConnection(url,user,pwd);

return null;

}

//关闭数据流

public static void close(Connection connection,PreparedStatement pst,ResultSet rs){

if(connection!=null){

connection.close();}

if(pst!=null){

    pst.close();

    }

if(rs!=null){

    rs.close();

    }

//查询

public static ResultSet query(String sql,String url,String user,String pwd,Object ...params){

Connection connection=getConnection(url,user,pwd);

PreparedStatement pst=null;

ResultSet rs=null;

pst=connection.prepareStatement(sql);

for(int i=0;i<params.length;i++){

pst.setObject(i+1,params[i]);

        } 

rs=pst.executeQuery();

return rs;

    }

}

//4.创建PstDaoTest类

public class PstDaoTest{

@Test

public void query()throws SQLException{

        String sql="select SubjectName,.StudentResult from subject s left join result r on s.SubjcteNo=r.SubjectNo where StudentResult>? and 

SubjectName in("体育","英语")";

String url="jdbc:mysql://192.168.183.31:3306/Myschool";

ResultSet rs=PstDao.query(sql,url,"root","ok",60,"体育","英语");

while(rs.next()){

System.out.print(rs.getString("SubjectName"));

System.out.print(rs.getString("SudentResult"));

}

rs.close();

        }

 

    }

//进阶查询3

public class PstDao{

//建立连接

private static string Driver="com.mysql.jdbc.Driver"

private static String url="jdbc:mysql://192.168.183.31:3306/Myschool";

private static String user="root";

private static String pwd="ok";

public static Connection getConnection()

Class.forName(driver);

return DriverManager.getConnection(url,user,pwd);

return null;

}

//关闭数据流

public static void close(Connection connection,PreparedStatement pst,ResultSet rs){

if(connection!=null){

connection.close();}

if(pst!=null){

    pst.close();

    }

if(rs!=null){

    rs.close();

    }

//查询

public static ResultSet query(String sql,Object ...params){

Connection connection=getConnection();

PreparedStatement pst=null;

ResultSet rs=null;

pst=connection.prepareStatement(sql);

for(int i=0;i<params.length;i++){

pst.setObject(i+1,params[i]);

        } 

rs=pst.executeQuery();

return rs;

    }

}

//4.创建PstDaoTest类

public class PstDaoTest{

@Test

public void query()throws SQLException{

        String sql="select SubjectName,.StudentResult from subject s left join result r on s.SubjcteNo=r.SubjectNo where StudentResult>? and 

SubjectName in("体育","英语")";

String url="jdbc:mysql://192.168.183.31:3306/Myschool";

ResultSet rs=PstDao.query(sql,60,"体育","英语");

while(rs.next()){

System.out.print(rs.getString("SubjectName"));

System.out.print(rs.getString("SudentResult"));

}

rs.close();

        }

 

    }

5.//用pstdao类修改数据库数据

在PstDao类中加入修改方法

public static int update(String sql,Object ...params){

Connection connection=getConnection();

PreparedStatement pst=null;

try{

pst=getConnection().prepareStatement(sql);

for(int i=0; i<params.length;i++){

pst.setObject(i+1,params[i]);

    }

return pst.executeUpdate();

    }catch(SQLException e){

    e.printStackTrace();

}finally{

try{

    if(pst!=null){

    pst.close();

}

if(connection!=null){

connection.close();

    }

}

return -1;

}

在PstDaoTest中调用方法

public void update(){

String sql="update account set cash=cash-? where name=?";

int num=PstDao.update(sql,1000,"ICBC");

System.out.println(num>0? "更新成功":"更新失败");

}

6.为了使数据可以更改,需要配置文件

在根目录文件夹下面创建 resource包

并将包标记为resouces,在包里面创建一个file文件

定义为db.properties

内容为:driver=com.mysql.jdbc.Driver

url=jdbc:mysql://192.168.183.31:3306/Myschool

user=root

pwd=ok

新建一个Prop类

public class Prop{

private static Properties p=new Properties();

public static String getP(String param){

    try{

    p.load(new FileInputStream("resource/db.properties"));

            } catch(IOException e){

            e.printStackTrace()}  ;

    }

return p.getProperty(param);

}

最后将PstDao修改

private static String driver=Prop.getP("driver");

private static String url=Prop.getP("url");

private static String user=Prop.getP("user");

private static String pwd=Prop.getP("pwd");

再修改getConnection方法

Class.forName(driver);

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值