文章目录
一、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语句增、删、改、查进行封装,使代码可读性强,逻辑性强