java-JDBC

1、为项目导入mysql-jdbc包

下载地址:https://how2j.cn/frontdownload?bean.id=224
通常都会把项目用到的jar包统一放在项目的lib目录下
IDEA中打开 File -> Project Structure (Ctrl + Shift + Alt + S),在Libraries 中添加

2、JDBC连接基本流程

初始化驱动->建立数据库连接->创建statement语句->执行SQL语句

package jdbc;
  
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
  
public class TestJDBC {
    public static void main(String[] args) {
  
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
  
        try (
            Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8",
                "root", "admin");
            Statement s = c.createStatement();             
        )
        {
            String sql = "insert into hero values(null," + "'提莫'" + "," + 313.0f + "," + 50 + ")";
            s.execute(sql);
              
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

2、JDBC查询

查询结果放入ResultSet中

注:在取第二列的数据的时候,用的是rs.get(2) ,而不是get(1). 这个是整个Java自带的api里唯二的地方,使用基1的,即2就代表第二个。

            String sql3 = "select * from hero";
            ResultSet rs = statement.executeQuery(sql3);
            System.out.println(rs);
            while(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                float hp = rs.getFloat(3);
                int damage = rs.getInt(4);
                System.out.printf("%d\t%s\t%f\t%d%n",id,name,hp,damage);
            }

3、JDBC插入数据

当需要插入字符串时,sql语句需要拼接,单引号和双引号冗余在一起,可读性很差。

String sql = "insert into hero values(null,"+"'提莫'"+","+313.0f+","+50+")";

因此可以使用PrepareStatement

4、PrepareStatement预编译

和 Statement一样,PreparedStatement也是用来执行sql语句的
与创建Statement不同的是,需要根据sql语句创建PreparedStatement
除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接

注: 这是JAVA里唯二的基1的地方,另一个是查询语句中的ResultSet也是基1的。

String sql7 = "insert into hero values(null,?,?,?)";
PreparedStatement ps = connection.prepareStatement(sql7)
ps.setString(1,"盖伦");
ps.setFloat(2,313.0f);
ps.setInt(3,50);
ps.execute();

4、execute与executeUpdate的区别

增删改 查询 返回值
execute 支持 支持 返回boolean类型,true表示执行的是查询语句,false表示执行的是insert,delete,update等等
executeUpdate 支持 不支持 返回的是int,表示有多少条数据受到了影响

5、获取自增id

    public static void gerAutoID(){
        String sql = "insert into hero values(null,?,?,?)";
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        try(Connection connection = DriverManager.getConnection(url,admin,pass);
            PreparedStatement preparedStatement = connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS)
        )
        {
            preparedStatement.setString(1,"亚瑟");
            preparedStatement.setFloat(2,616.6f);
            preparedStatement.setInt(3,100);
            preparedStatement.execute();
            ResultSet rs = preparedStatement.getGeneratedKeys();
            if(rs.next()){
                int id = rs.getInt(1);
                System.out.println(id);
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
    }

6、获取表的元数据

元数据概念:
和数据库服务器相关的数据,比如数据库版本,有哪些表,表有哪些字段,字段类型是什么等等。

    public static void getYSJ(){
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        try(Connection connection = DriverManager.getConnection(url,admin,pass))
        {
            DatabaseMetaData dbmd = connection.getMetaData();
            //获取数据库服务器产品名称
            System.out.println(dbmd.getDatabaseProductName());
            //获取产品版本号
            System.out.println(dbmd.getDatabaseMinorVersion());
            // 获取数据库服务器用作类别和表名之间的分隔符 如test.user
            System.out.println(dbmd.getCatalogSeparator());
            //获取驱动版本
            System.out.println(dbmd.getDriverVersion());
            //获取可用数据库名称
            ResultSet rs = dbmd.getCatalogs();
            while(rs.next()){
                System.out.println("数据库名称\t" + rs.getString(1));
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
    }

7、JDBC事务

在事务中的多个操作,要么都成功,要么都失败
通过 c.setAutoCommit(false);关闭自动提交
使用 c.commit();进行手动提交

此外,MySQL表中,只有当表的类型是INNODB的时候,才支持事务
修改表的类型为INNODB:
alter table hero ENGINE = innodb;

    public static void transaction(){
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        try(
                Connection connection = DriverManager.getConnection(url,admin,pass);
                Statement statement = connection.createStatement()
                ){
            //有事务的前提下
            //在事务中的多个操作,要么都成功,要么都失败
            connection.setAutoCommit(false);
            String sql1 = "update hero set hp = hp + 1 where id = 2";
            statement.execute(sql1);
            String sql2 = "updata hero set hp = hp + 1 where id = 3";
            statement.execute(sql2);
            connection.commit();
        }catch (SQLException e){
            e.printStackTrace();
        }
    }

8、JDBC ORM

ORM=Object Relationship Database Mapping (对象和关系数据库的映射)
简单说,一个对象,对应数据库里的一条记录
https://how2j.cn/k/jdbc/jdbc-orm/391.html

9、JDBC DAO

DAO=Data Access Object
数据访问对象
实际上就是运用了练习-ORM中的思路,把数据库相关的操作都封装在这个类里面,其他地方看不到JDBC的代码

public class HeroDAO implements DAO{
    public HeroDAO(){
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
    }

    public Connection getConnection() throws SQLException{
        String url = "jdbc:mysql://localhost:3306/how2j?characterEncoding=utf-8";
        String admin = "root";
        String pass = "root";
        return DriverManager.getConnection(url,admin,pass);
    }
    @Override
    public void add(Hero5 hero) {
        String sql = "insert into hero values(null,?,?,?)";
        try(
                Connection connection = getConnection();
                PreparedStatement ps = connection.prepareStatement(sql)
                ){
            ps.setString(1,hero.name);
            ps.setFloat(2,hero.hp);
            ps.setInt(3,hero.damage);
            ps.execute();
        }catch (SQLException e){
            e.printStackTrace();
        }
    }

    @Override
    public void delete(int id) {
        try (
                Connection connection = getConnection();
                Statement statement = connection.createStatement()
                ){
            String sql = "delete from hero where id = "+id;
            statement.execute(sql);
        }catch (SQLException e){
            e.printStackTrace();
        }
    }

    @Override
    public Hero5 get(int id) {
        Hero5 hero = null;
        try(
                Connection connection = getConnection();
                Statement statement = connection.createStatement();
                ){
            String sql = "select * from hero where id = "+id;
            ResultSet rs = statement.executeQuery(sql);
            if(rs.next()){
                hero = new Hero5();
                hero.id = id;
                hero.name = rs.getString(2);
                hero.hp = rs.getFloat("hp");
                hero.damage = rs.getInt("damage");
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
        return hero;
    }

    @Override
    public List<Hero5> list() {
        return list(0,Short.MAX_VALUE);
    }

    @Override
    public List<Hero5> list(int start, int count) {
        List<Hero5> heros = new ArrayList<>();
        String sql = "select * from hero order by id desc limit ?,?";
        try(
                Connection connection = getConnection();
                PreparedStatement ps = connection.prepareStatement(sql)
                ){
            ps.setInt(1,start);
            ps.setInt(2,count);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                Hero5 hero = new Hero5();
                hero.id = rs.getInt("id");
                hero.name = rs.getString("name");
                hero.hp = rs.getFloat("hp");
                hero.damage = rs.getInt("damage");
                heros.add(hero);
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
        return heros;
    }

10、数据库连接池

参考:https://how2j.cn/k/jdbc/jdbc-connection-pool/610.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 一、JDBC概述 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于...
    丛鹏阅读 289评论 0 0
  • 一、注入攻击 在用户登录的时候,我们往往需要输入账号和密码,通过账号和密码和数据库中保存的账号密码进行匹配,匹配成...
    丛鹏阅读 259评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,621评论 18 399
  • 1.jdbc是什么,它有什么用? java database connection 让java程序员可以直接通过j...
    yeller阅读 569评论 0 2
  • 一. Java基础部分.................................................
    wy_sure阅读 3,810评论 0 11