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

Hibernate参考文档

儿童二类疫苗是否有必要接种

ORM 解决方案(JPA;Hibernate)与 JDBC

Hibernate

hibernate配置