0
点赞
收藏
分享

微信扫一扫

浅识ORM并使用

落拓尘嚣 2022-04-17 阅读 26
java

文章目录


一、ORM是什么?

ORM全称是:Object Relational Mapping(对象关系映射),其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来。举例来说就是,我定义一个对象,那就对应着一张表,这个对象的实例,就对应着表中的一条记录。

简单说,一个对象,对应数据库里的一条记录

二、使用

Dome1 根据id返回一个对象

提供方法get(int id)
返回一个对象

代码如下(示例):
英雄类及属性

public class Hero {
    //增加id属性
    public int id;
    public String name;
    public float hp;
    public int damage;
}

JDBC类

public class TestJDBC {
//通过get()方法返回对象
    public static Hero get(int id) {
//初始化hero对象
        Hero hero = null;
//初始化驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
//使用try-with-resourced方法
        try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8","root", "admin");
             Statement s = c.createStatement();) {
//根据形参id 定义sql语句
            String sql = "select * from hero where id = " + id;
//执行查询:executeQuery()方法会把数据库响应的查询结果存放在ResultSet类对象中供我们使用。即语句:ResultSet rs=s.executeQuery(sql);
            ResultSet rs = s.executeQuery(sql);

// 因为id是唯一的,ResultSet最多只能有一条记录
// 所以使用if代替while
            if (rs.next()) {
                hero = new Hero();
                String name = rs.getString(2);
                float hp = rs.getFloat("hp");
                int damage = rs.getInt(4);
                hero.name = name;
                hero.hp = hp;
                hero.damage = damage;
                hero.id = id;
            }

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return hero;

    }

    public static void main(String[] args) {

        Hero h = get(5);
//h这个对象则代表数据表hero中id=5的这条记录
        System.out.println(h.name);

    }
}

Demo2 根据ORM的思想方法进行插入、删除、更新、查询

把一个Hero对象插入到数据库中
public static void add(Hero h)
把这个Hero对象对应的数据删除
public static void delete(Hero h)
更新这条Hero对象
public static void update(Hero h)
把所有的Hero数据查询出来
转换为Hero对象后,放在一个集合中返回
public static List list();

代码如下:

public class TestJDBC {
//get()方法在上一个Dome中已经说明很清楚了,得到一个对象
    public static Hero get(int id) {
        Hero hero = null;
        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 = "select * from hero where id = " + id;
   
            ResultSet rs = s.executeQuery(sql);
   
            // 因为id是唯一的,ResultSet最多只能有一条记录
            // 所以使用if代替while
            if (rs.next()) {
                hero = new Hero();
                String name = rs.getString(2);
                float hp = rs.getFloat("hp");
                int damage = rs.getInt(4);
                hero.name = name;
                hero.hp = hp;
                hero.damage = damage;
                hero.id = id;
            }
   
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return hero;
   
    }

//add()方法,通过传入对象,添加一条新的记录
    public static void add(Hero h) {
   
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
   
        String sql = "insert into hero values(null,?,?,?)";
        try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8",
                "root", "admin");
//PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
                PreparedStatement ps = c.prepareStatement(sql);) {
   
            // 设置参数
            //insert into hero values(null,?,?,?)中
            //第一个?= ps.setString(1, h.name);
            //第二个?= ps.setFloat(2, h.hp);
            //第三个?=ps.setInt(3, h.damage);
            ps.setString(1, h.name);
            ps.setFloat(2, h.hp);
            ps.setInt(3, h.damage);
   
            ps.execute();
   
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
   
    }

    public static void delete(Hero h) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
 
        String sql = "delete from hero where id = ?";
        try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8",
                "root", "admin");
   
                PreparedStatement ps = c.prepareStatement(sql);) {
   
            // 设置参数
            ps.setInt(1, h.id);
   
            ps.execute();
   
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
   
    public static void update(Hero h) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
   
        String sql = "update hero set name = ? , hp =? , damage = ? where id = ?";
        try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8",
                "root", "admin");
   
                PreparedStatement ps = c.prepareStatement(sql);) {
   
            // 设置参数
            ps.setString(1, h.name);
            ps.setFloat(2, h.hp);
            ps.setInt(3, h.damage);
            ps.setInt(4, h.id);
   
            ps.execute();
   
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
   
    }
   
    public static List<Hero> list() {
        List<Hero> heros = new ArrayList<>();
        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 = "select * from hero";
   
            ResultSet rs = s.executeQuery(sql);
   
            while (rs.next()) {
                Hero hero = new Hero();
                int id = rs.getInt(1);
                String name = rs.getString(2);
                float hp = rs.getFloat("hp");
                int damage = rs.getInt(4);
                hero.name = name;
                hero.hp = hp;
                hero.damage = damage;
                hero.id = id;
                heros.add(hero);//每执行一次sql就会把hero对象添加到heros容器中
            }
   
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //返回heros数组
        return heros;
    }
       
    public static void main(String[] args) {
        List<Hero> hs =list();
        System.out.println("数据库中总共有" + hs.size() + " 条数据");
        Hero h = new Hero();
        h.name = "新的英雄";
        System.out.println("新加一条数据");
        add(h);
        hs =list();
        System.out.println("数据库中总共有" + hs.size() + " 条数据");
        System.out.println("取出id=101的数据,它的name是:");
        h = get(101);
        System.out.println(h.name);
        System.out.println("把名字改为 英雄101,并且更新到数据库");
        h.name="英雄101";
        update(h);
        System.out.println("取出id=101的数据,它的name是:");
        h = get(101);
        System.out.println(h.name);
        System.out.println("删除id=101的数据");
        delete(h);
        hs =list();
        System.out.println("数据库中总共有" + hs.size() + " 条数据");
           
    }
       
}

总结:显然通过使用orm对sql语句增、删、改、查进行封装,使代码可读性强,逻辑性强

举报

相关推荐

浅识DAO并使用

浅识ACID

浅识C指针

浅识Flutter目录结构介绍

浅识分布式系统

orm使用

0 条评论