JDBC的学习(一)

JDBC的学习(一)

概念

所谓英文简写的意思是:Java DataBase Connectivity ,即 Java数据库的连接,用Java语言来操作数据库

本质

简单的来说,就是写这个JDBC的公司定义的一套操作关系型数据库的规则,所以由此可知它就像一个接口一样,
然后像MySql或者Oracle这些厂商来提供”实现类“——驱动jar包,这样就可以利用Java来进行操作数据库操作

java.sql:所有与JDBC访问数据库相关的接口和类
javax.sql:数据库扩展包,提供数据库额外的功能。如:连接池
数据库的驱动:由各大数据库厂商提供,需要额外去下载,是对JDBC接口实现的类

步骤

1.导入驱动jar包(在项目中新建一个目录将jar包复制粘贴到该目录下)

2.用java注册驱动(注:从JDBC3开始,目前已经普遍使用的版本。可以不用注册驱动而直接使用。Class.forName这句话可以省略。建议是写上此语句)

Mysql例: Class.forName("com.mysql.jdbc.Driver");
Oracle例:Class.forName("oracle.jdbc.driver.OracleDriver");

3.获取数据库的连接对象

例: Connection con =DriverManger.getConnection(url:"jdbc:mysql://locallhost:3306/数据库名",user"",password:"")
	***DriverManger是驱动管理对象***
	功能:1.注册驱动     Class.forName("com.mysql.jdbc.Driver");
		(其实是根据deregisterDriver这个注册驱动的方法来实现的;且从mysql5之后的驱动jar包j会自动进行注册  驱动)
	    2.获取数据库连接
	      .参数:url  user  password
		  .mysql语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
		
	***Connection是数据库连接对象***
		1.获取执行sql的对象
		  .Statement createStatement()
		  .PreparedStaement preparStatement(String sql)
		2.管理事务 
		  .开启事务:setAutoCommit(boolean autoCommit): 调用该方法设置参数为false,即开启事务
		  .提交事务:commit()
		  .回滚事务:rollback()

4.定义sql语句

例: String sql =" /*写上你要做的sql语句*/";

5.获取执行sql语句的对象,即Statement

例: Statement stmt = con.createStatement();
	Statement是执行sql的对象

6.执行sql,接受返回结果

例: int count = stmt.executeUpdate(sql);
  /*执行DML语句(常用)、DDL语句*/
    boolean execute(String sql):可以执行任意的sql (不常用)
    ResultSet excuteQuery(String sql):执行DQL语句;返回结果集对象

7.处理结果

例: System.out.println(count);//受影响的行数,然后根据受影响的行数来判断DML语句是否执行成功

8.释放资源

例: stmt.close();
	con.close();

9.ResultSet和PreparStatement对象

ResultSet是结果集对象,即封装查询结果的
	**boolean next()方法**:游标向下移动一行;返回值为boolean
	**getXxx(参数)方法**:获取数据;Xxx代表数据类型;比如:getInt()、getString()、getDouble()
						通过传参可以进行获取相应的数据;比如:int中的数据就是列的编号,String中的数据就是列的名称
	正确的步骤应该是:1.游标向下移动一行
				   2,判断是否有数据(利用循环简化判断)
				   3.获取数据
PreparStatement是执行sql的对象,功能比父类Statement更为强大

实例代码

以下为菜鸟教程中的代码!

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class DbUtil {

    public static final String URL = "jdbc:mysql://localhost:3306/imooc";
    public static final String USER = "liulx";
    public static final String PASSWORD = "123456";

    public static void main(String[] args) throws Exception {
        //1.加载驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        //2. 获得数据库连接
        Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);
        //3.操作数据库,实现增删改查
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT user_name,age FROM imooc_goddess");
        //如果有数据,rs.next()返回true
        while(rs.next()){
            System.out.println(rs.getString("user_name")+" 年龄:"+rs.getInt("age"));
        }
    }
}

进行增删改查

public class DbUtil {
    public static final String URL = "jdbc:mysql://localhost:3306/imooc";
    public static final String USER = "liulx";
    public static final String PASSWORD = "123456";
    private static Connection conn = null;
    static{
        try {
            //1.加载驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            //2. 获得数据库连接
            conn = DriverManager.getConnection(URL,PASSWORD);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection(){
        return conn;
    }
}

//模型
package liulx.model;

import java.util.Date;

public class Goddess {

    private Integer id;
    private String user_name;
    private Integer sex;
    private Integer age;
    private Date birthday; //注意用的是java.util.Date
    private String email;
    private String mobile;
    private String create_user;
    private String update_user;
    private Date create_date;
    private Date update_date;
    private Integer isDel;
    //getter setter方法。。。
}

//---------dao层--------------
package liulx.dao;

import liulx.db.DbUtil;
import liulx.model.Goddess;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class GoddessDao {
    //增加
    public void addGoddess(Goddess g) throws SQLException {
        //获取连接
        Connection conn = DbUtil.getConnection();
        //sql
        String sql = "INSERT INTO imooc_goddess(user_name,sex,age,birthday,email,mobile,"+
            "create_user,create_date,update_user,update_date,isdel)"
                +"values("+"?,?,CURRENT_DATE(),?)";
        //预编译
        PreparedStatement ptmt = conn.prepareStatement(sql); //预编译SQL,减少sql执行

        //传参
        ptmt.setString(1,g.getUser_name());
        ptmt.setInt(2,g.getSex());
        ptmt.setInt(3,g.getAge());
        ptmt.setDate(4,new Date(g.getBirthday().getTime()));
        ptmt.setString(5,g.getEmail());
        ptmt.setString(6,g.getMobile());
        ptmt.setString(7,g.getCreate_user());
        ptmt.setString(8,g.getUpdate_user());
        ptmt.setInt(9,g.getIsDel());

        //执行
        ptmt.execute();
    }

    public void updateGoddess(){
        //获取连接
        Connection conn = DbUtil.getConnection();
        //sql,每行加空格
        String sql = "UPDATE imooc_goddess" +
                " set user_name=?,sex=?,age=?,birthday=?,email=?,mobile=?,"+
                " update_user=?,update_date=CURRENT_DATE(),isdel=? "+
                " where id=?";
        //预编译
        PreparedStatement ptmt = conn.prepareStatement(sql); //预编译SQL,减少sql执行

        //传参
        ptmt.setString(1,g.getUpdate_user());
        ptmt.setInt(8,g.getIsDel());
        ptmt.setInt(9,g.getId());

        //执行
        ptmt.execute();
    }

    public void delGoddess(){
        //获取连接
        Connection conn = DbUtil.getConnection();
        //sql,每行加空格
        String sql = "delete from imooc_goddess where id=?";
        //预编译SQL,减少sql执行
        PreparedStatement ptmt = conn.prepareStatement(sql);

        //传参
        ptmt.setInt(1,id);

        //执行
        ptmt.execute();
    }

    public List<Goddess> query() throws SQLException {
        Connection conn = DbUtil.getConnection();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT user_name,age FROM imooc_goddess");

        List<Goddess> gs = new ArrayList<Goddess>();
        Goddess g = null;
        while(rs.next()){
            g = new Goddess();
            g.setUser_name(rs.getString("user_name"));
            g.setAge(rs.getInt("age"));

            gs.add(g);
        }
        return gs;
    }

    public Goddess get(){
        Goddess g = null;
        //获取连接
        Connection conn = DbUtil.getConnection();
        //sql,每行加空格
        String sql = "select * from  imooc_goddess where id=?";
        //预编译SQL,减少sql执行
        PreparedStatement ptmt = conn.prepareStatement(sql);
        //传参
        ptmt.setInt(1,id);
        //执行
        ResultSet rs = ptmt.executeQuery();
        while(rs.next()){
            g = new Goddess();
            g.setId(rs.getInt("id"));
            g.setUser_name(rs.getString("user_name"));
            g.setAge(rs.getInt("age"));
            g.setSex(rs.getInt("sex"));
            g.setBirthday(rs.getDate("birthday"));
            g.setEmail(rs.getString("email"));
            g.setMobile(rs.getString("mobile"));
            g.setCreate_date(rs.getDate("create_date"));
            g.setCreate_user(rs.getString("create_user"));
            g.setUpdate_date(rs.getDate("update_date"));
            g.setUpdate_user(rs.getString("update_user"));
            g.setIsDel(rs.getInt("isdel"));
        }
        return g;
    }
}

关于PreparedStatement

PreparedSatement的好处

1.prepareStatement()会先将SQL语句发送给数据库预编译。PreparedStatement会引用着预编译后的结果。可以多次传入不同的参数给PreparedStatement对象并执行。减少SQL编译次数,提高效率。
2.安全性更高,没有SQL注入的隐患。
3.提高了程序的可读性

使用PreparedStatement的步骤:

1)编写SQL语句,未知内容使用?占位:"SELECT * FROM user WHERE name=? AND password=?";
2)获得PreparedStatement对象
3)设置实际参数:setXxx(占位符的位置,真实的值)
4)执行参数化SQL语句
5)关闭资源

相关文章

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个...
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:...
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程...