JDBCmybatishibernate比较
Posted 奇葩小六
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBCmybatishibernate比较相关的知识,希望对你有一定的参考价值。
JDBC连接数据库的流程及其原理
1:在开发环境中加载指定数据库的驱动程序。
2:在Java程序中加载驱动程序。
Class.forName(“com.mysql.jdbc.Driver”)
3:创建数据连接对象
通过DriverManager类创建数据库连接对象Connection。DriverManager类作用于Java程序和JDBC驱动程序之间,用于检查所 加载的驱动程序是否可以建立连接,然后通过它的getConnection方法,根据数据库的URL、用户名和密码,创建一个 JDBCConnection对象。
如:Connection connection = DriverManager.geiConnection(“连接数据库的URL","用户名","密码”)。
4:创建Statement对象
Statement类的主要是用于执行静态SQL语句并返回它所生成结果的对象。通过Connection对象的createStatement()方法可以 创建一个Statement对象。例如:Statement statament = connection.createStatement();
5:调用Statement对象的相关方法执行相对应的SQL语句
通过execuUpdate()方法用来数据的更新,包括插入和删除等操作,通过调用Statement对象的executeQuery()方法进行数据 的查询,而查询结果会得到ResulSet对象,ResulSet表示执行查询数据库后返回的数据的集合,ResulSet对象具有可以指向当前 数据行的指针。通过该对象的next()方法,使得指针指向下一行,然后将数据以列号或者字段名取出。如果当next()方法返回null,则表示下一行中没有数据存在。
例:ResultSet resultSel = statement.executeQuery( "select * from staff" );
6、关闭数据库连接
使用完数据库或者不需要访问数据库时,通过Connection的close() 方法及时关闭数据连接。
代码:
private Connection conn;
private static DataSource ds;
static {
try {
Properties prop = new Properties();
InputStream in = DBUtil.class.getResourceAsStream("/db.properties");
prop.load(in);
ds = BasicDataSourceFactory.createDataSource(prop);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Connection getConnection() throws Exception {
return ds.getConnection();
}
public DBUtil() {}
mybatis工作流程
1:加载mybatis的xml文件
a.使用类加载器加载mybatis的配置文件
InputStream config = _Test1SelectOne.class.getClassLoader().getResourceAsStream("conf.xml");
b.使用mybatis的Resources类加载
Reader config = Resources.getResourceAsReader("conf.xml");
2:生成SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder.build(config);
3:建立SqlSession
SqlSession session = factory.openSession();
4:调用Mybatis提供的API
session.selectOne(methodName,param)
5:查询MAP配置
6:返回结果
7:关闭SQLSession
代码:
xml中配置如下:
<!-- 加载配置文件 -->
<properties resource="db.properties"></properties>
<!-- 获取配置信息 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="com/chinasoft/mapper/usermapper.xml" /><!-- 不能用.只能用/ -->
</mappers>
测试代码:
String reSource = "sqlmapconfig.xml";// 文本
try {
// 加载主配置文件
Reader reader = Resources.getResourceAsReader(reSource);
// 创建会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(reader);
// 打开会话
SqlSession session = factory.openSession();
String statm = "com.chinasoft.bean" + ".selectDeptBydeptno";
Dept dept = session.selectOne(statm, 20);
System.out.println(dept);
} catch (IOException e) {
e.printStackTrace();
}
hibernate工作流程
1:加载配置文件
Configuration cfg=new Configuration().configure();
2:获得sessionfactory
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sf=cfg.buildSessionFactory(serviceRegistry);
3:创建session
Session session=sf.openSession();
4:创建事务
Transaction tx=session.beginTransaction();
5:操作
District dis=new District(100,"海淀区");
session.save(dis);
6:提交 回滚
tx.commit();//tx.rollback();
7:释放资源
session.close();
sf.close();
xml中配置:
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/user?characterEncoding=utf-8</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> -->
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup <property name="hbm2ddl.auto">update</property> -->
<mapping resource="com/chinasoft/hibernate/Student.hbm.xml" /></session-factory>
除了上面的配置,还需要配置如下代码,将数据库和bean连接起来
<hibernate-mapping>
<class name="com.chinasoft.entity.Student" table="student">
<id name="stuNo" />
<property name="stuName" />
<property name="stuAge" />
</class>
</hibernate-mapping>
测试代码:
// 創建会话工廠
Configuration config = new Configuration();
SessionFactory sessionFactory = config.configure()
.buildSessionFactory();
// 创建会话
Session session = sessionFactory.openSession();
// 创建事务
Transaction ts = session.beginTransaction();
// 创建查询
Query query = session.createQuery("from Student");
// 获得查询结果集
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student);
}
// 事务提交
ts.commit();
// 会话关闭
session.close();
总结:
JDBC:
个人认为主要的特点是原生,效率高(用得好的情况下),使用起来也比较灵活 ,缺点呢也很明显,开发起来代码比较罗嗦,可扩展性不够好。
Hibernate与Mybatis对比总结
两者相同点
Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。
Hibernate和MyBatis都支持JDBC和JTA事务处理。
Mybatis优势
MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
MyBatis容易掌握,而Hibernate门槛较高。
Hibernate优势
Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
以上是关于JDBCmybatishibernate比较的主要内容,如果未能解决你的问题,请参考以下文章
Java 11:OSGi:生成 EntityManager,无法构建 Hibernate SessionFactory java.lang.ClassNotFoundException:org.hib