前言
上篇文章分析了常规JDBC实现数据库操作的问题以及基本解决思路,也举例讲解了下当前市面上主流的ORM框架的实现和特性。这篇文章主要讲解我们应该如何去选择合适的技术方案以及以什么样的思路去实现一个简单的ORM框架。
实现步骤
我们在使用目前市面上比较常用的ORM框架比如MyBatis时,一般是直接引用框架包,然后在自己的项目中增加相应的框架配置。所以也就是说,配置信息是在我们的项目端进行配置的,而框架端只需要定义好配置的格式,项目端根据指定格式进行配置并且约定好配置文件的路径,然后框架端就会对其进行加载解析。进而实现框架的实际功能。
配置文件定义
我们在解析JDBC问题时有讲过,JDBC实现的硬编码问题主要在数据库驱动配置、数据库连接配置、SQL语句、SQL参数映射、结果集解析这些地方。这些信息我们可以根据作用以及面向对象的不同分成两类:
数据库连接核心配置
这个配置文件主要包括数据库驱动配置、数据库连接配置,主要用来创建数据库的连接。约定配置文件名sqlMapConfig.xml
配置格式如下:
标签元素定义
<configuration>
配置文件根标签<dataSource>
数据库连接相关配置<property name="driverClass">
数据库连接驱动<property name="url">
数据库连接地址<property name="user">
数据库连接用户<property name="pass">
数据库连接密码<mappers>
SQL语句映射配置文件路径配置,根标签<mapper xml="" classsPath="">
SQL语句映射配置和JavaDao之间映射关系配置
<!-- 配置根标签 -->
<configuration>
<!-- 定义数据库连接信息配置 -->
<dataSource>
<!-- 数据库连接驱动 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<!-- 数据库连接地址 -->
<property name="url">jdbc:mysql://127.0.0.1:3306/simple-orm?characterEncoding=utf-8</property>
<!-- 数据库连接用户 -->
<property name="user">root</property>
<!-- 数据库连接密码 -->
<property name="pass">yxh123..</property>
</dataSource>
<!-- 定义SQL语句映射相关信息 -->
<mappers>
<mapper xml="SmUserMapper" classPath="SmUserDao"/>
</mappers>
</configuration>
SQL语句相关映射配置
SQL参数、SQL结果集这些配置信息主要围绕着SQL语句是会进行改变的,所以把这些信息配置到一起,这里就叫SQL映射配置。约定配置文件名为xxxMapper.xml
。这个配置文件可能会根据数据库表的不同分成多个并且里面包含多个SQL映射配置,所以这里这种配置文件叫SQL映射清单配置,里面的每条SQL语句的配置叫做SQL映射配置
配置格式如下:
标签元素定义
<mapper>
配置文件根标签<select>
用来定义查询相关的SQL映射配置信息<insert>
用来定义插入数据相关的SQL映射配置信息<update>
用来定义更新数据相关的SQL映射配置信息<delete>
用来定义删除数据相关的SQL映射配置信息
元素属性定义
- namespace:SQL映射清单的全局唯一标识
- id :SQL映射配置的唯一标识(当前文件下唯一)
- resultType:解析出的结果集映射类型,最后结果封装成指定类型
- paramType:要解析到SQL内的参数类型
#{xxx}
:参数占位符,对应paramType
指定类型的属性名
<mapper namespace="smUser">
<!-- 查询列表 -->
<select id="listSmUser" resultType="SmUser">
select * from sm_user
</select>
<!-- 查询单个用户 需要传参 -->
<select id="getSmUser" paramType="SmUser" resultType="SmUser">
select * from sm_user where id=#{id} and user_name=#{userName}
</select>
<!-- 增加用户 -->
<insert id="insertSmUser" paramType="SmUser">
insert into sm_user(id,userName) values(#{id},#{userName})
</insert>
<!-- 修改用户 -->
<update id="updateUser" paramType="SmUser">
update sm_user set user_name=#{userName} where id=#{id}
</update>
<!-- 删除用户 -->
<delete id="deleteSmUserById" paramType="String">
delete from sm_user where id=#{id}
</delete>
</mapper>