持久层框架学习——MyBatis(一)
使用原始JDBC操作数据库的缺点
- 数据库的连接创建和释放的频繁造成系统资源浪费影响系统的性能。
- 使用PreparedStatement时SQL语句中的占位符传参存在硬编码,造成代码不易维护,若改动SQL语句还需要改动Java代码。
- 查询操作时,需要手动将结果集封装在实体中;插入操作时,需要手动将实体数据设置到SQL语句的占位符位置。如果进行修改需要对大量的代码进行修改,不利于维护。
解决设想:
- 使用数据库连接池管理数据库的连接。
- 将相关的SQL语句提取出来,在配置文件中进行配置,此时在进行修改时只需要修改配置文件即可。
- 可以使用反射、内省等底层技术,自动将实体与表进行属性与字段的字段映射。
MyBatis介绍
MyBatis是Java开发中的一个持久层框架,它内部封装了JDBC,这样使得我们只需要写SQL语句,不用去管加载驱动、创建连接、创建Statement等过程。MyBatis通过XML或注解的方式将要执行的各种Statement配置起来,并通过Java对象和Statement中SQL的动态参数进行映射生成最终执行的SQL语句。最后MyBatis框架执行SQL后将结果映射成Java对象返回。采用了ORM(对象关系映射)的思想解决了实体和数据库映射的问题,对JDBC进行了封装,屏蔽JDBC API底层访问的细节,使得我们不用去处理原生JDBC就能对数据库进行持久化的操作。
MyBatis简单使用
步骤:
①导入MyBatis的坐标。–>②创建一个数据表。–>③编写数据表字段对应的实体类。–>④编写映射文件XxxMapper.xml
或XxxMapping.xml
。–>⑤编写核心文件SqlMapConfig.xml
。–>⑥测试
第一步:导入MyBatis坐标,这里还是采用Maven进行项目依赖管理,所以不需要手动去导包。如果不用Maven,可以在mybatis官网下载相应的jar包。做法如下:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 引入MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
第二步:创建一个数据表。这个可以在自己的数据库中采用任何一个表都行。
第三步:编写数据表字段对应的实体类。这一步就是之前创建实体对象中的创建实体类,根据表的设计进行相应的创建即可。
第四步:编写映射文件UserMapping.xml
。具体如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="userMapping">
<select id="findAll" resultType="com.jclight.domain.User">
select * from user
</select>
</mapper>
第五步:编写核心文件SqlMapConfig.xml
。具体如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 数据源环境 -->
<environments default="Developement">
<environment id="Developement">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
第六步:测试
MyBatis配置文件
在持久层使用MyBatis框架开发时,我们需要对MyBatis的两大配置文件进行配置才可以使用,这两大就是映射文件和核心配置文件。
映射文件
关于映射文件的命名,我们对哪个实体进行操作就使用实体名+Mapper/Mapping.xml
进行命名,例如UserMapper.xml、ProductMapping.xml
。关于映射文件的部分代码介绍如下:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
这个部分是映射文件DTD的约束头,它的作用可以帮助我们提示映射文件的编写和约束,DTD文件头就是一种约束,只要文件中有DTD约束头,编译器或浏览器就能根据该约束进行相应的操作,这里的指定约束是mapper,一个规范的HTML文件中,它的约束头指定的就是HTML。当不指定约束头或不编写约束头时,浏览器就不能显示出我们文件中的所有代码的页面展示。或者编译器就不能对该文件进行准确的识别。
<mapper namespace="UserMapping"></mapper>
该标签是映射文件中的根标签,属性namespace是命名空间,和下面不同的SQL标签的id组成标识。这里的namespace的值一般来讲要写成包的形式,但这种不是固定死的,一般要根据项目的结构来填写这里的值。
<select id="findAll" resultType="com.jclight.domain.User">
select * from user
</select>
该标签是SQL标签,除此之外还有insert、update、delete。这里的id与上面的namespace对应组成标识,resultType结果类型,一般对应的是实体类型,它的值是对应实体类型的全包名,指定全包名后框架就会使用反射机制来将我们的查询结果自动封装成我们想要的对象了。在该标签的内部编写要执行的SQL语句。