Java数据库框架⼩结
⽂章⽬录
前⾯⼀篇提到了java体系⾥的web开发历史⼩结。这次我们转过头来看下Spring全家桶⾥⾯的⼀个重要组成部分: Spring Data。
这个部分是Spring框架针对Java对各个数据源操作、应⽤的框架。我们先只关注关系型数据库。同样的,我们从最早的Java数据库访问说起,这是我根据我⾃⼰接触到的内容整理的,不⼀定和各位的顺序相同。
原⽣数据库操作
我还记得⼤概⼗年前写数据库操作代码时,⼤致流程如下(具体的代码不到了):
1. 创建⼀个数据源(DataSource)对象,这个对象⼀般会以⼀个连接串来构成,这个链接串包括协议,IP地址,端⼝号,数据库名等信
息。
2. 调⽤数据源对象的createConnection()⽅法,创建⼀个与数据库的链接对象(Connector)。
3. 调⽤Connector对象的open⽅法,打开数据库连接。
4. 准备好操作的SQL,⼀般可以是字符串。
5. 准备数据返回对象(POJO)。
6. 调⽤Connector对象的execute⽅法,执⾏数据库语句。
7. 调⽤Connector的close⽅法,关闭链接,释放资源。
8. ⼀般还需要在应⽤测维护⼀个Transaction(事务)对象,来控制数据库操作的⼀致性。
当时写⼀个数据库的操作模块还是蛮复杂的。我个⼈理解后续的框架发展主要朝着两⽅⾯发展:
连接、事务的管理框架
ORM,也就是SQL执⾏⽅⾯的框架
各个框架在这两个⽅向上不断的进⾏封装和优化。
过程优化
JDBC
JAVA体系⾥封装上述过程的最早的就是JDBC了吧。从JDBC的名称:Java DataBase Connectivity可以看出来,JDBC是负责与数据库连接的。当然,JDBC不仅仅完成连接⼯作。
JDBC其实最起码包含了两部分内容:
JDBC驱动:每个数据库对外提供的API肯定是不⼀样的,⽽JDBC就是针对某种特定数据库做的⼀些API封装。
JDBC对上层应⽤提供的API:包括DriverManager、Connection、Statement、Result、PreparedStatement等对象和操作API。ORM
在原⽣代码中,我们需要写⼀段SQL来查询数据库,数据库会返回⼀些数据结果回来。这些数据结果不是⼀个⼀个的对象,可能是流数据等等其他结构的数据。我们需要对这些数据进⾏解析并专门创建⼀个对象(POJO)来进⾏结果的保存。那么,这部分⼯作实际上是⽐较枯燥的,也业务也⽆关,⽽且容易出错,⽽ORM模型就是出来解决这个问题的。
ORM:Object Relation Mapping,就是想在⾯向对象模型和关系型模型间建⽴⼀个映射⽽关系:
由ORM模型框架将这部分转换逻辑写好,我们只需要在两端建表和创建类即可,⽽不需要进⾏中间的解析和封装。
ORM也是可以表达两层含义:
ORM规范,也就是⼤家需要遵循的⼀套规则,不包括实现。
ORM实现框架,这就是各个⼚商根据规范做出来的实现了,像现在常⽤的Hibernate,Mybatis都是实现了ORM规范的ORM框架(不仅仅是)。
实现
我个⼈习惯将JDBC理解成数据库连接的操作、管理等内容。ORM就对应数据库操作部分。
Hibernate
这些框架基本上都是通过配置来实现了,通过容器来加载配置,通过反射机制来在运⾏阶段加载依赖。这个也不是我想讲的重点,就直接贴⼀下配置了:
l:
<hibernate-configuration>
<!-- 通常,⼀个session-factory节点代表⼀个数据库 -->
<session-factory>
<!-- 1. 数据库连接配置 -->
<property name="tion.driver_class"&sql.jdbc.Driver</property>
<property name="tion.url">jdbc:mysql:///zhongfucheng</property>
<property name="tion.username">root</property>
<property name="tion.password">root</property>
<!-- 数据库⽅法配置, hibernate在运⾏的时候,会根据不同的⽅⾔⽣成符合当前数据库语法的sql -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 2. 其他相关配置 -->
<!-- 2.1 显⽰hibernate在运⾏时候执⾏的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- 2.3 ⾃动建表 -->
<property name="hibernate.hbm2ddl.auto">create</property>
<!--3. 加载所有映射-->
<mapping resource="com/test/l"/>
</session-factory>
</hibernate-configuration>
上⾯的l就是实现ORM的映射配置⽂件:
<hibernate-mapping package="st">
<!--类名为User,表名也为User-->
<class name="User"table="user">
<!--主键映射,属性名为id,列名也为id-->
<id name="id"column="id">
<!--根据底层数据库主键⾃动增长-->
<generator class="native"/>
</id>
<!--⾮主键映射,属性和列名⼀⼀对应-->
<property name="username"column="username"/>
<property name="cellphone"column="cellphone"/>
<property name="password"column="password"/>
</class>
</hibernate-mapping>
再创建⼀个Java对象(POJO):
public class User
{
private int id;
private String username;
private String password;
private String cellphone;
//各种setter和getter
}
Hibernate会通过配置加载,把这个POJO与数据库中的User表对应上,在代码⾥就可以直接操作了。同时,Hibernate也封装了JDBC等相关的API,直接使⽤transaction类操作就⾏了。
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
jpa mybatispublic class UserDao {
public static void main(String[] args){
//创建对象
User user =new User();
user.setPassword("123");
user.setCellphone("122222");
user.setUsername("nihao");
//获取加载配置管理类
Configuration configuration =new Configuration();
//不给参数就默认加载l⽂件,
/
/创建Session⼯⼚对象
SessionFactory factory = configuration.buildSessionFactory();
//得到Session对象
Session session = factory.openSession();
//使⽤Hibernate操作数据库,都要开启事务,得到事务对象
Transaction transaction = Transaction();
//开启事务
transaction.begin();
//把对象添加到数据库中
session.save(user);
//提交事务
transactionmit();
//关闭Session
session.close();
}
}
Mybatis
Hibernate⾥默认数据库表和POJO⼀⼀对应。理念是不需要你⼿写SQL,⽽mybatis就是想让程序员们更加好的使⽤⾃⼰的数据库、SQL 知识,⼿写SQL。再映射⼀个ResultMap作为结果集的POJO来进⾏处理。
同样,先配置框架,数据库连接等基本信息,在l⽂件⾥:
<configuration>
<settings>
<!-- 打印查询语句 -->
<setting name="logImpl"value="STDOUT_LOGGING"/>
</settings>
<!-- 和Spring整合后environment配置都会被⼲掉 -->
<environments default="development">
<environment id="development">
<!-- 使⽤jdbc事务管理,⽬前由mybatis来管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池,⽬前由mybatis来管理 -->
<dataSource type="POOLED"><!--有关于mysql数据库的各种信息-->
<property name="driver"value="sql.jdbc.Driver"/>
<property name="url"value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username"value="root"/>
<property name="password"value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--将操作配置⽂件l系添加进mapper-->
<mapper resource="l"/>
</mappers>
</configuration>
配置⽂件⾥的mappers对应了ORM映射关系,或者说SQL查询返回的对象与POJO的映射关系,那么l可以是:<mapper namespace="user"><!-- 注意,因为这边没有⽤到mapper接⼝,所以这⾥的namespace不需要是完全的类名 -->
<!-- 通过id查询⽤户 -->
<select id="findUserById"parameterType="int"resultType="com.mvc.User">
<include refid="selectStr"/> id = #{id}
</select>
<!--通过name查⼀个list的⽤户,模糊匹配-->
<select id="findUserByName"parameterType="java.lang.String"resultType="com.mvc.User">
select * from user where name like '%${value}%'
</select>
<!--插⼊⽤户信息-->
<insert id="insertUser"parameterType="com.mvc.User">
<selectKey keyProperty="id"order="BEFORE"resultType="java.lang.String">
select uuid()
<!-- 这⾥是对于主键属性的id进⾏赋值 -->
</selectKey>
insert into user(id,username,password) values(#{id},#{username},#{password})
</insert>
<!--删除⽤户信息-->
<delete id="deleteUser"parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<!--更新⽤户信息-->
<update id="updateUser"parameterType="com.mvc.User">
<!-- update user set name=#{name},password=#{password} where id=#{id} -->
update user
<set>
<if test="username != null && username != ''">username=#{username},</if>
<if test="password != null && password != ''">password=#{password},</if>
</set>
where id= #{id}
</update>
</mapper>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论