ComTechnology - 后端 - JDBC-Mybatis-Hibernate
JDBC
JDBC.jar 4.0
1.JDBC
Java DateBase Connection
制作到数据库的连接。
创建 SQL 或 MySQL 语句。
执行 SQL 或 MySQL 查询数据库。
查看和修改所产生的记录。
JDBC API: 提供了应用程序对 JDBC 管理器的连接。
JDBC Driver API: 提供了 JDBC 管理器对驱动程序连接。
常见的 JDBC 组件
JDBC 的 API 提供了以下接口和类:
DriverManager :驱动管理,管理并筛选使用相关数据库驱动
Driver :
Connection : 通信上下文,所有与数据库的通信仅通过这个连接对象进行
Statement : SQL Execution
ResultSet : 结果
SQLException :
2.Instance
api:java.sql.*
private static final String JDBC_Driver = "com.mysql.jdbc.Driver";
private static final String DB_URL = "jdbc:mysql://localhost/EMP";
private static final String username = "username";
private static final String password = "password";
Connection conn = null;
Statement stmt = null;
try{
//1.Register JDBC driver
Class.foraName("com.mysql.jdbc.Driver");
//2.Open a connection
conn = DriverManager.getConnection(DB_URL,username,password);
//3.Execution
stmt = conn.createStatement();
String sql = "select * from tablename";
//4.result
ResultSet rs = stmt.executeQuery(sql);
//5.Extract data from result set
int id = rs.getInt("id");
//6.Clean-up environment
rs.close();
stmt.close();
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
DriverManager/Connection/Statement/ResultSet
Class.forName();
getConnection();
createStatement();
executeQuery();
close();
注册驱动;
获取连接; -创建连接对象
创建声明;
执行语句; -返回ResultSet
释放资源;
3.Register JDBC Driver
注册 JDBC 驱动程序:这一步会导致 JVM 加载所需的驱动程序到内存中执行,因此它可以实现JDBC 请求
注册一个驱动程序中最常用的方法是使用 Java 的Class.forName() 方法来动态加载驱动程序的类文件到内存中,它会自动将其注册。
这种方法更优越一些,因为它允许你对驱动程序的注册信息进行配置,便于移植。
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
不兼容的JVM
2).第二种方法是使用静态 staticDriverManager.registerDriver() 方法
MySQL com.mysql.jdbc.Driver jdbc:mysql://hostname/ databaseName
ORACLE oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@hostname:port Number:databaseName
4.Statement
Statement 可以正常访问数据库,适用于运行静态 SQL 语句。 Statement 接口不接受参数。
PreparedStatement 计划多次使用 SQL 语句, PreparedStatement 接口运行时接受输入的参数。
CallableStatement 适用于当你要访问数据库存储过程的时候, CallableStatement 接口运行时也接受输入的参数。
boolean execute(String SQL)
int executeUpdate(String SQL)
ResultSet executeQuery(String SQL)
下面的代码片段展示了基于存储过程如何使用 Connection.prepareCall() 方法来实例化 CallableStatement 对象
存储过程调用
{call procedure(?,...)}
callableStatement = conn.prepareCall (SQL);
5.结果集
ResultSet 接口的方法可细分为三类-
导航方法:用于移动光标。
获取方法:用于查看当前行被光标所指向的列中的数据。
更新方法:用于更新当前行的列中的数据。这些更新也会更新数据库中的数据。
光标的移动基于 ResultSet 的属性。用相应的语句生成 ResultSet 对象时,同时生成 ResultSet 的属性。
JDBC 提供了连接方法通过下列创建语句来生成你所需的 ResultSet 对象:
createStatement(int RSType, int RSConcurrency);
prepareStatement(String SQL, int RSType, int RSConcurrency);
prepareCall(String sql, int RSType, int RSConcurrency);
第一个参数表示 ResultSet 对象的类型,第二个参数是两个 ResultSet 常量之一,该常量用于判断该结果集是只读的还是可修改的
public int getInt(String columnName) throws SQLException
返回当前行中名为 columnName 的列的 int 值。
public int getInt(int columnIndex) throws SQLException
返回当前行中指定列的索引的 int 值。列索引从 1 开始,意味着行中的第一列是 1 ,第二列是 2 ,以此类推
6.transation
如果你的 JDBC 连接是处于自动提交模式下,该模式为默认模式,那么每句 SQL 语句都是在其完成时提交到数据库。
对简单的应用程序来说这种模式相当好,但有三个原因你可能想关闭自动提交模式,并管理你自己的事务-
为了提高性能
为了保持业务流程的完整性
使用分布式事务
你可以通过事务在任意时间来控制以及更改应用到数据库。它把单个 SQL 语句或一组 SQL 语句作为一个逻辑单元,如果其中任一语句失败,则整个事务失败。
若要启用手动事务模式来代替 JDBC 驱动程序默认使用的自动提交模式的话,使用 Connection 对象的的 setAutoCommit()方法
setSavepoint(String savepointName) 定义了一个新的还原点
releaseSavepoint(Savepoint savepointName): 删除一个还原点
Mybatis
MyBatis的功能架构:
我们把Mybatis的功能架构分为三层:
API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
2.映射文件
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
3.Mapper XML
Mapper XML 文件
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。
SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
cache – 给定命名空间的缓存配置。
cache-ref – 其他命名空间缓存配置的引用。
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
sql – 可被其他语句引用的可重用语句块。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
<select id="selectPerson" parameterType="int" resultType="hashmap">
select * from tablename where id = #{id}
</select>
4.MyBatis 动态SQL
由 毛泽萝拉 创建, 最后一次修改 2016-08-12 21:20:52
动态 SQL
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
if
choose (when, otherwise)
trim (where, set)
foreach
5.API
SqlSessions
SqlSessionFactoryBuilder
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)
mybatis-config.xml
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
...
<dataSource type="POOLED">
...
</environment>
<environment id="production">
<transactionManager type="MANAGED">
...
<dataSource type="JNDI">
...
</environment>
</environments>
SqlSessionFactory
SqlSessionFactory 有六个方法可以用来创建 SqlSession 实例。通常来说,如何决定是你 选择下面这些方法时:
Transaction (事务): 你想为 session 使用事务或者使用自动提交(通常意味着很多 数据库和/或 JDBC 驱动没有事务)?
Connection (连接): 你想 MyBatis 获得来自配置的数据源的连接还是提供你自己
Execution (执行): 你想 MyBatis 复用预处理语句和/或批量更新语句(包括插入和 删除)?
Hibernate
什么是 ORM?
ORM 表示 Object-Relational Mapping (ORM),是一个方便在关系数据库和类似于 Java, C# 等面向对象的编程语言中转换数据的技术
2.架构
配置对象
配置对象是你在任何 Hibernate 应用程序中创造的第一个 Hibernate 对象,并且经常只在应用程序初始化期间创造。它代表了 Hibernate 所需一个配置或属性文件。配置对象提供了两种基础组件。
数据库连接:由 Hibernate 支持的一个或多个配置文件处理。这些文件是 hibernate.properties 和 hibernate.cfg.xml。
类映射设置:这个组件创造了 Java 类和数据库表格之间的联系。
SessionFactory 对象
Session 对象
Transaction 对象
3.Cconfiguration
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- Assume test is the database name -->
<property name="hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name="hibernate.connection.username">
root
</property>
<property name="hibernate.connection.password">
root123
</property>
<!-- List of XML mapping files -->
<mapping resource="Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
3.Session
瞬时状态: 一种新的持久性实例,被 Hibernate 认为是瞬时的,它不与 Session 相关联,在数据库中没有与之关联的记录且无标识符值。
持久状态:可以将一个瞬时状态实例通过与一个 Session 关联的方式将其转化为持久状态实例。持久状态实例在数据库中没有与之关联的记录,有标识符值,并与一个 Session 关联。
脱管状态:一旦关闭 Hibernate Session,持久状态实例将会成为脱管状态实例。
4.Mapper
classname.hbm.xml
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
</hibernate-mapping>
POJOs名称与列字段名称映射
5.缓存 一级 Session的缓存/二级 SessionFactory的缓存 保持数据
6.锁-LockMode
悲观锁 transaction锁 独占数据库的整个开销
乐观锁 表级字段锁 通过判别表字段进行加锁 version
<version> 映射文件标签
原文地址:https://www.cnblogs.com/DedoChen/p/8597965.html