使用JDBC封装ORM框架
只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。当前ORM框架主要有五种:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink,JFinal。
JDBC怎么操作数据库?
1、加载驱动类
Class.forName(drivename);
2、建立连接
Connection conn = DriverManager.getConnection(url,username,password);
3、创建语句集
PreparedStatement pstm = conn.prepareStatement(sql);
4、执行
ResultSet rs = pstm.executeQuery();
5、获取结果集
while(rs.next()){
System.out.println(rs.getLong(“id”));
System.out.println(rs.getString(“name”));
}
6、关闭连接
rs.close();
pstm.close();
conn.close();
思考
1、没有mybatis是半自动ORM框架,需要程序员去关注SQL,且需要学配置文件(Mapping.xml)
2、Hibernate是全自动ORM框架,不需要程序员关注SQL
3、Spring JDBC是全手动,既需要程序员关注SQL,又需要去写配置文件
三者的优劣,灵活性Spring JDBC最高,mybatis次之;Hibernate开发效率最高,mybatis次之。在可以牺牲小部分灵活性,且对开发效率影响不大得前提下,mybatis成为了程序员的追捧之物。
如何封装
在JDBC操作操作数据库的步骤,你可以思考,1-2步的操作是固定的,3语句集也是必须的,4执行也是必要的操作,这几步都是不可避免的操作。而第五步获取处理结果集,我们可以将它封装成ORM,下面代码演示:
List<Object> result = new ArrayList<Object>();//声明一个Object的list
int len = rs.getMetaData().getColumnCount();//获取字段的总数
while(rs.next()){
Class clazz = Member.class;//找一个我们要匹配的实体类
Object obj = clazz.newInstance();//通过反射机制把实体类创建出来
for (int i = 1;i <= len;i++){
String columnName = rs.getMetaData().getColumnName(i);//获得字段名
Field field = clazz.getDeclaredField(columnName);//获取实体类声明的字段
field.setAccessible(true);//取消了Java的权限控制检查
Object type = field.getType();//获得字段类型
if (type == Integer.class){//类型判断,如果是int
field.set(obj,rs.getInt(columnName));//往字段里塞值
}else if (type == String.class){
field.set(obj,rs.getString(columnName));
}
}
result.add(obj);//将实体类添加到list
System.out.println(JSON.toJSON(obj));//以json格式将实体类输出
}
数据库表
数据库名:test 表名:user 字段如下:
完整代码如下
实体类:
package com.xxxxf.spring.jdbc;
public class User{
Integer id ;
String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试类:
package com.xxxxf.spring.jdbc;
import com.alibaba.fastjson.JSON;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class JdbcTest {
public static void main(String[] args) throws Exception {
//原生的JDBC如何操作
// 可以将1-2封装成了DataSource,放入了连接池,目的是为了提高程序的响应速度
//1、加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//2、建立连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");
//3、创建语句集
PreparedStatement pstm = conn.prepareStatement("select * from user");
//4、执行
ResultSet rs = pstm.executeQuery();
// 将5封装做成ORM的过程(Object relation Mapping对象关系映射)
// 自动变成我们显而易见的普通的我们写的java对象(实体类)
//5、获取结果集
int len = rs.getMetaData().getColumnCount();
List<Object> result = new ArrayList<Object>();
while(rs.next()){
Class clazz = User.class;
Object obj = clazz.newInstance();
for (int i = 1;i <= len;i++){
String columnName = rs.getMetaData().getColumnName(i);
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
Object type = field.getType();
if (type == Integer.class){//类型判断
field.set(obj,rs.getInt(columnName));
}else if (type == String.class){
field.set(obj,rs.getString(columnName));
}
}
// System.out.println(rs.getLong("id"));
// System.out.println(rs.getString("name"));
result.add(obj);
System.out.println(JSON.toJSON(obj));
}
//6、关闭连接
rs.close();
pstm.close();
conn.close();
}
}
到此为止,通过不到100行代码,我们封装了一个ORM框架,是不是很nice呢?后期我会通过Spring JDBC再封装一个类似Hibernate、mybatis的ORM框架