20.JDBC java数据库连接

20.JDBC java数据库连接,第1张

20.JDBC java数据库连接 1. JDBC定义

JDBC(java database connectivity)Java数据库连接,是Java语言中用来规范客户端程序如何来访问数据库[关系型数据库]的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

我们通常说的JDBC是面向关系型数据库的。

2. JDBC访问数据库

JDBC访问数据库需要用到的类、接口、方法?

2.1  java.sql包DriverManager类

      负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接。驱动程序,会将自身加载到DriverManager中去。

2.1.1 数据驱动程序(Driver)

根据所连接的数据库不同需要下载对应数据库的驱动程序。

例如:MySQL数据库----MySQL :: Download MySQL Connector/J (Archived Versions)

mysql-connector-java-5.1.38-bin.jar

通过java的反射机制,来给DriverManager,提供被加载的数据库驱动名称。

Class.forName(“数据库驱动名称【包名+类名】”);

数据库驱动名称来自mysql-connector-java-5.1.38-bin.jar中Driver的java类的全名称。

Class.forName(“com.mysql.jdbc.Driver”);

2.1.2向调用者返回相应的数据库连接

DriverManager类中的静态方法getConnection(url,username,password)向调用者返回相应的数据库连接

static  Connection   getConnection(url,username,password)

参数url---指定被连接的数据库位置

【jdbc:mysql://数据库服务器IP:端口/数据库名称】

参数username---登陆数据库服务器的用户名

参数password----登陆数据库服务器的密码

2.2 java.sql包Connection接口

数据库连接,负责与进行数据库间通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement。

1.产生用以执行SQL的Statement。

    [用以执行SQL查询和更新(针对静态SQL语句和单次执行)]

Statement  createStatement()

select   * from  t_user  where uid=12;[拼接字符串]

2.产生用以执行SQL的PreparedStatement。

        [用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)]

       PreparedStatement  prepartatement(Sql)

       参数sql---包含动态参数的SQL语句

       select   * from  t_user  where uid=?;【需要给sql动态传递参数值】

       ?---占位符

2.3 java.sql包Statement接口

用以执行SQL查询和更新(针对静态SQL语句和单次执行)

        以执行SQL更新【insert / update /delete】

        int executeUpdate(SQL)

        参数SQL---[insert / update /delete]字符串类型的sql语句。

        以执行SQL查询【select】

         ResultSet    executeQuery(SQL)

      参数SQL---[select]字符串类型的sql语句。

2.4 java.sql包PreparedStatement接口

用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)

          以执行SQL更新【insert / update /delete】

          int executeUpdate()

          以执行SQL查询【select】

          ResultSet    executeQuery()

          注意:PreparedStatement需要执行的sql语句

  1. sql语句是在创建PreparedStatement对象的时候传入执行,不是在调用executeUpdate()/executeQuery()的时候传入。
  2. PreparedStatement对象所执行的sql语句中有“?【占位符】”

          有一组填补sql语句占位符的方法

           setInt(参数1,参数2)  int--int

           setLong(参数1,参数2)  long---bigint

           setDouble(参数1,参数2) double--double

           setString(参数1,参数2)  String--varchar/char

           .....................

           参数1---SQL语句中“?”的位置【从1开始】

           参数2---SQL语句中“?”具体数据值

  2.5.java.sql包ResultSet接口

 数据库结果集的数据表,通常通过执行查询数据库的语句生成。

ResultSet 对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。next 方法将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。

默认的 ResultSet 对象不可更新,仅有一个向前移动的指针。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。

boolean  next()--将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false。在 while 循环中使用它来迭代结果集。

 由于通过next方法将指针移动到下一行,我们现在就可以取出指针指向的当前行的数据值。要获取当前行中保存的数据值,就需要一列一列的取出数据值,所以ResultSet会有一组获取指定列数据的方法。

getXXXX(int colindex)---int colindex[当前需要获取数据值的列在当前行中的位置【从0开始】]

getXXXX(String colname)--String colname[当前需要获取数据值的列名称]

1 [int]--[id]

Zhangsan  [varchar]--[name]

23 [int]--[age]

2[int]--[id]

Lisi  [varchar]--[name]

24  [int]--[age]

3[int]--[id]

Wangwu  [varchar]--[name]

25  [int]--[age]

通过ResultSet对象得到第一行数据值

int  id=ResultSet对象.getInt(0);

int  id=ResultSet对象.getInt(“id”);

//id==1

String name=ResultSet对象.getString(1);

String name=ResultSet对象.getString(“name”);

//name==zhangsan

int  age=ResultSet对象.getInt(2);

int  age=ResultSet对象.getInt(“age”);

//age==23

3.JDBC访问数据库的流程

4.测试基于Statement接口的数据库访问

1.创建java项目

2.创建lib

3.复制驱动包

把mysql-connector-java-5.1.38-bin.jar复制到lib文件夹下

4.导入数据库驱动

5.加载数据库驱动

public class DBConnection {

   //定义数据库启动名称

   private static final String DRIVERNAME="com.mysql.jdbc.Driver";

   //静态代码块

   static{

      //加载数据库驱动

      try {

          Class.forName(DRIVERNAME);

      } catch (ClassNotFoundException e) {

          e.printStackTrace();

      }

   }

}

6.得到数据库连接  

 

  

   //定义数据库地址url 【jdbc:mysql://数据库服务器IP:端口/数据库名称】

   private static final String url="jdbc:mysql://127.0.0.1:3306/test";

   //定义数据库登录账号

   private static final String username="root";

   //定义数据库登录密码

      private static final String password="123456";

   

   public static Connection getConnection(){

      Connection conn=null;

      //得到数据库连接

      //DriverManager.getConnection(url, user, password);需要url、账户、密码,因此需要定义

      try {

          conn=DriverManager.getConnection(url, username, password);

      } catch (SQLException e) {

          e.printStackTrace();

      }

      return conn;

   }

}



测试是否连接到

import java.sql.Connection;

public class MainTest {

   public static void main(String[] args) {

      Connection connection = DBConnection.getConnection();

      System.out.println(connection);

   }

}

输出:

com.mysql.jdbc.JDBC4Connection@6433a2//成功

7.创建数据库中的数据表

在MySQL-Front中创建数据表

create table t_user(

user_id int primary key auto_increment,

user_name varchar(20),

user_pass varchar(20),

user_age int,

user_sex bit,

user_hei double,

user_day datetime

);

8.建一个用户信息类

import java.util.Date;



public class UserInfo {

   private int userid;

   private String username;

   private String pass;

   private int userage;

   private boolean usersex;

   private double userhei;

   private Date userday;

   public int getUserid() {

      return userid;

   }

   public void setUserid(int userid) {

      this.userid = userid;

   }

   public String getUsername() {

      return username;

   }

   public void setUsername(String username) {

      this.username = username;

   }

   public String getPass() {

      return pass;

   }

   public void setPass(String pass) {

      this.pass = pass;

   }

   public int getUserage() {

      return userage;

   }

   public void setUserage(int userage) {

      this.userage = userage;

   }

   public boolean isUsersex() {

      return usersex;

   }

   public void setUsersex(boolean usersex) {

      this.usersex = usersex;

   }

   public double getUserhei() {

      return userhei;

   }

   public void setUserhei(double userhei) {

      this.userhei = userhei;

   }

   public Date getUserday() {

      return userday;

   }

   public void setUserday(Date userday) {

      this.userday = userday;

   }

}

9.得到statement对象

      Connection接口---- Statement  createStatement()

9.1 执行更新(添加修改删除)

int executeUpdate(SQL)

(1)添加信息

import java.sql.Connection;

import java.sql.Statement;



public class UserService {

   

   public boolean insertUser(UserInfo userinfo){

      boolean flag=false;

      try{

          //得到数据库连接

          Connection connection = DBConnection.getConnection();

          

          Statement statement=connection.createStatement();

           

         

          String sql="insert into t_user values(null, '"+userinfo.getUsername()+"','"+

            userinfo.getPass()+"',"+userinfo.getUserage()+","+

            userinfo.isUsersex()+","+userinfo.getUserhei()+",'"+userinfo.getUserday()+"');";

          int executeUpdate = statement.executeUpdate(sql);

          //得到的int值大于等于0成功,小于等于0失败

          if(executeUpdate>0){

             flag=true;

          }

          statement.close();

          connection.close();

      }catch(Exception e){

          e.printStackTrace();

      }

      return flag;

   } 

  

}

测试类:

import java.sql.Connection;

import java.sql.Date;

public class MainTest {

public static void main(String[] args) {

   //添加信息

UserService userservice = new UserService();

   UserInfo userinfo = new UserInfo();

   userinfo.setUsername("zhangsan");

   userinfo.setPass("123456");

   userinfo.setUserage(23);

   userinfo.setUsersex(true);

   userinfo.setUserhei(168.9);

userinfo.setUserday(new Date(System.currentTimeMillis()));

   boolean flag=userservice.insertUser(userinfo);

   if(flag){

      System.out.println("添加成功");

      }     */

   }

}

(2)修改信息

和添加一样,只需修改sql语句 

  

   public boolean updateUser(UserInfo userinfo){

      boolean flag=false;

      try{

          //得到数据库连接

          Connection connection = DBConnection.getConnection();

          

          Statement statement=connection.createStatement();

           

          String sql="update t_user set user_name='"+userinfo.getUsername()+

                   "',user_pass='"+userinfo.getPass()+"',user_age="+userinfo.getUserage()+

                   ",user_sex="+userinfo.isUsersex()+",user_hei="+userinfo.getUserhei()+

                   ",user_day='"+userinfo.getUserday()+"' where user_id="+userinfo.getUserid()+";";

          int executeUpdate = statement.executeUpdate(sql);

          //得到的int值大于等于0成功,小于等于0失败

          if(executeUpdate>0){

             flag=true;

          }

          statement.close();

          connection.close();

      }catch(Exception e){

          e.printStackTrace();

      }

      return flag;

   }



   //修改信息

      UserService userservice = new UserService();

      UserInfo userinfo = new UserInfo();

      userinfo.setUserid(2);

      userinfo.setUsername("lisi");

      userinfo.setPass("333");

      userinfo.setUserage(45);

      userinfo.setUsersex(false);

      userinfo.setUserhei(170);

      userinfo.setUserday(new Date(System.currentTimeMillis()));

      boolean flag=userservice.updateUser(userinfo);

      if(flag){

          System.out.println("修改成功");

      }

     

    

(3)删除信息  

 

   public boolean deleteUser(int userid){

      boolean flag=false;

      try{

         

          Connection connection = DBConnection.getConnection();

          Statement statement=connection.createStatement();

          String sql="delete from t_user where user_id="+userid+";";

          int executeUpdate = statement.executeUpdate(sql);

          //得到的int值大于等于0成功,小于等于0失败

          if(executeUpdate>0){

             flag=true;

          }

          statement.close();

          connection.close();

      }catch(Exception e){

          e.printStackTrace();

      }

      return flag;

   } 



//删除用户信息

      UserService userservice = new UserService();

      UserInfo userinfo = new UserInfo();

      boolean flag=userservice.deleteUser(1);

      if(flag){

          System.out.println("删除成功");

      }





9.2 执行查询

ResultSet   接口

      ResultSet    executeQuery(sql)


   public List selectAll(){

      List userlist=null;

      try{

          Connection connection = DBConnection.getConnection();

          Statement statement=connection.createStatement();

          String sql="select*from t_user;";

          ResultSet executeQuery = statement.executeQuery(sql);

          userlist = new ArrayList();

          while(executeQuery.next()){

             int userid = executeQuery.getInt("user_id");

String username = executeQuery.getString("user_name");

String userpass = executeQuery.getString("user_pass");

             int userage = executeQuery.getInt("user_age");

boolean usersex = executeQuery.getBoolean("user_sex");

double userhei = executeQuery.getDouble("user_hei");

             Date userday = executeQuery.getDate("user_day");

             UserInfo userInfo = new UserInfo();

             userInfo.setUserid(userid);

             userInfo.setUsername(username);

             userInfo.setPass(userpass);

             userInfo.setUserage(userage);

             userInfo.setUsersex(usersex);

             userInfo.setUserhei(userhei);

             userInfo.setUserday(userday);

             userlist.add(userInfo);

          }

          executeQuery.close();

          statement.close();

          connection.close();

      }catch(Exception e){

          e.printStackTrace();

      }

      return userlist;

  

   } 



      //查询所有

      UserService userservice = new UserService();

      List userlist = userservice.selectAll();

      for(UserInfo userinfo:userlist){

      System.out.println(userinfo.getUserid()+"t"+userinfo.getPass()+"t"+userinfo.getUsername());

      }

  


   public UserInfo selectById(int uid){

      UserInfo userInfo=null;

      try{

          Connection connection = DBConnection.getConnection();

          Statement statement=connection.createStatement();

          String sql="select*from t_user where user_id="+uid+";";

          ResultSet executeQuery = statement.executeQuery(sql);

          if(executeQuery.next()){

             int userid = executeQuery.getInt("user_id");

             String username = executeQuery.getString("user_name");

             String userpass = executeQuery.getString("user_pass");

             int userage = executeQuery.getInt("user_age");

             boolean usersex = executeQuery.getBoolean("user_sex");

             double userhei = executeQuery.getDouble("user_hei");

             Date userday = executeQuery.getDate("user_day");

             userInfo = new UserInfo();

             userInfo.setUserid(userid);

             userInfo.setUsername(username);

             userInfo.setPass(userpass);

             userInfo.setUserage(userage);

             userInfo.setUsersex(usersex);

             userInfo.setUserhei(userhei);

             userInfo.setUserday(userday);

            

          }

          statement.close();

          connection.close();

      }catch(Exception e){

          e.printStackTrace();

      }

      return userInfo;

   }



      //根据id查询

      UserService userservice = new UserService();

      UserInfo selectById = userservice.selectById(2);

      if(selectById!=null){

      System.out.println(selectById.getUserid()+"t"+selectById.getPass()+"t"+selectById.getUsername());

      }
5.测试基于PreparedStatement接口的数据库访问

从创建项目到数据库连接都是一样的。

import java.sql.Connection;

import java.sql.Date;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;







public class UserService {

   

   public boolean insertUser(UserInfo userinfo){

      boolean flag=false;

      try{

          //得到数据库连接

          Connection connection = DBConnection.getConnection();         

          String sql="insert into t_user values(null,?,?,?,?,?,?);";

          //先?再补

          PreparedStatement prepareStatement = connection.prepareStatement(sql);

          prepareStatement.setString(1, userinfo.getUsername());

          prepareStatement.setString(2, userinfo.getPass());

          prepareStatement.setInt(3, userinfo.getUserage());

          prepareStatement.setBoolean(4, userinfo.isUsersex());

          prepareStatement.setDouble(5, userinfo.getUserhei());

          prepareStatement.setDate(6, userinfo.getUserday());

          int executeUpdate = prepareStatement.executeUpdate();

          //得到的int值大于等于0成功,小于等于0失败

          if(executeUpdate>0){

             flag=true;

          }

          prepareStatement.close();

          connection.close();

      }catch(Exception e){

          e.printStackTrace();

      }

      return flag;

   } 

  

  

   

   public boolean updateUser(UserInfo userinfo){

      boolean flag=false;

      try{

     

          Connection connection = DBConnection.getConnection();

          String sql="update t_user set user_name=?,user_pass=?,user_age=?,user_sex=?,user_hei=?,user_day=? where user_id=?;";

          //先?再补

          PreparedStatement prepareStatement = connection.prepareStatement(sql);

          prepareStatement.setString(1, userinfo.getUsername());

          prepareStatement.setString(2, userinfo.getPass());

          prepareStatement.setInt(3, userinfo.getUserage());

          prepareStatement.setBoolean(4, userinfo.isUsersex());

          prepareStatement.setDouble(5, userinfo.getUserhei());

          prepareStatement.setDate(6, userinfo.getUserday());

          prepareStatement.setInt(7, userinfo.getUserid());

          int executeUpdate = prepareStatement.executeUpdate();

         

          //得到的int值大于等于0成功,小于等于0失败

          if(executeUpdate>0){

             flag=true;

          }

          prepareStatement.close();

          connection.close();

      }catch(Exception e){

          e.printStackTrace();

      }

      return flag;

   } 

  

  

  

  

  

   

   public boolean deleteUser(int userid){

      boolean flag=false;

      try{

          Connection connection = DBConnection.getConnection();

          String sql="delete from t_user where user_id=?;";

          PreparedStatement prepareStatement = connection.prepareStatement(sql);

          prepareStatement.setInt(1, userid);

          int executeUpdate = prepareStatement.executeUpdate();

          //得到的int值大于等于0成功,小于等于0失败

          if(executeUpdate>0){

             flag=true;

          }

          prepareStatement.close();

          connection.close();

      }catch(Exception e){

          e.printStackTrace();

      }

      return flag;

   } 

  

   

   public List selectAll(){

      List userlist=null;

      try{

          Connection connection = DBConnection.getConnection();

          String sql="select*from t_user;";

          PreparedStatement prepareStatement = connection.prepareStatement(sql);

          ResultSet executeQuery = prepareStatement.executeQuery(sql);

          userlist = new ArrayList();

          while(executeQuery.next()){

             int userid = executeQuery.getInt("user_id");

             String username = executeQuery.getString("user_name");

             String userpass = executeQuery.getString("user_pass");

             int userage = executeQuery.getInt("user_age");

             boolean usersex = executeQuery.getBoolean("user_sex");

             double userhei = executeQuery.getDouble("user_hei");

             Date userday = executeQuery.getDate("user_day");

             UserInfo userInfo = new UserInfo();

             userInfo.setUserid(userid);

             userInfo.setUsername(username);

             userInfo.setPass(userpass);

             userInfo.setUserage(userage);

             userInfo.setUsersex(usersex);

             userInfo.setUserhei(userhei);

             userInfo.setUserday(userday);

             userlist.add(userInfo);

          }

          executeQuery.close();

          prepareStatement.close();

          connection.close();

      }catch(Exception e){

          e.printStackTrace();

      }

      return userlist;

  

   } 

  

  

  

   

   public UserInfo selectById(int uid){

      UserInfo userInfo=null;

      try{

          Connection connection = DBConnection.getConnection();

         

          String sql="select*from t_user where user_id=?;";

          PreparedStatement prepareStatement = connection.prepareStatement(sql);

          prepareStatement.setInt(1, uid);

          ResultSet executeQuery = prepareStatement.executeQuery();

          if(executeQuery.next()){

             int userid = executeQuery.getInt("user_id");

             String username = executeQuery.getString("user_name");

             String userpass = executeQuery.getString("user_pass");

             int userage = executeQuery.getInt("user_age");

             boolean usersex = executeQuery.getBoolean("user_sex");

             double userhei = executeQuery.getDouble("user_hei");

             Date userday = executeQuery.getDate("user_day");

             userInfo = new UserInfo();

             userInfo.setUserid(userid);

             userInfo.setUsername(username);

             userInfo.setPass(userpass);

             userInfo.setUserage(userage);

             userInfo.setUsersex(usersex);

             userInfo.setUserhei(userhei);

             userInfo.setUserday(userday);

            

          }

          prepareStatement.close();

          connection.close();

      }catch(Exception e){

          e.printStackTrace();

      }

      return userInfo;

   } 

}



import java.sql.Connection;

import java.sql.Date;

import java.util.List;



public class MainTest {



   public static void main(String[] args) {

      

     

      

     

      

     

      

     

      

     

   }

}

6.Statement与PreparedStatement的区别

Statement接口

PreparedStatement接口

继承关系

是Statement接口的子接口

使用范围

当执行相似SQL(结构相同,具体值不同)语句的次数比较少

当执行相似sql语句的次数比较多(例如用户登陆,对表频繁 *** 作..)语句一样,只是具体的值不一样,被称为动态SQL

优点

语法简单

语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)

缺点

采用硬编码效率低,安全性较差。

执行非相似SQL语句时,速度较慢。

原理

硬编码,每次执行时相似SQL都会进行编译

相似SQL只编译一次,减少编译次数6

建议使用右边第二种,PreparedStatement接口,使用占位符?,第一种非常容易写错。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5607158.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存