MyBatis 工作环境的搭建
0x00:开发步骤
MyBatis 工作环境开发步骤为:创建工程、引入依赖 jar 包、搭建日志输出环境、配置数据库连接池、创建持久层 Java 对象、编写 Mapper 配置文件、编写可运行的样例代码。
0x01:准备数据库
以查询数据为例,数据库是一个用户表,库为 mybatis_test, 表为 user,里面包含用户的 id、姓名、密码、性别、邮箱、住址等。结构如下图:
0x02:给项目引入 jar 包
创建 JavaWeb 项目,随后引入 jar 包,添加到 WEB-INF/lib 目录下,然后全部选中右键 Build Path 再选择 Add To Build Path 即可,jar 包如下:
0x03:项目结构
0x04:编写日志输出环境配置配置文件
lib 中加入了 log4j 的 jar 包,这里将内容输出到控制台,其 log4j 的配置文件代码如下:
log4j.rootLogger = DEBUG,stdout log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %5p [%t] - %m%n
其中 rootLogger 是定义了日志输出级别为 debug 级。log4j.appender.stdout 是设置了日志的输出位置,ConsoleAppedner 是控制台。log4j.appender.stdout.layout 指定了输出载体的布局,PatternLayout 是自由布局的意思。log4j.appender.stdout.layout.ConversionPattern 定义了自由布局中日志的输出格式。
0x05:编写数据库连接池配置文件
数据库连接池配置文件,主要用来设置数据库的连接信息,例如数据库的连接驱动、数据库地址、数据库用户名和密码等,代码如下:
<?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> <settings> <setting name="logImpl" value="LOG4J" /> </settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="org.gjt.mm.mysql.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="sqlmap/UserMapper.xml"/> </mappers> </configuration>
settings 标签配置了日志输出模式。environment 标签配置了数据库的连接环境。mappers 是配置了 sql 语句的映射文件。
0x06:编写 sql 映射配置文件
再 MyBatis 中,基本 sql 语句都配置再 mapper 映射文件中,同时,也需要将文件配置到连接池文件中,上段代码已配置,其映射文件代码如下:
<?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="test"> <select id="findUserById" parameterType="int" resultType="cn.com.mybatis.pojo.User"> SELECT * FROM USER WHERE id=#{id} </select> </mapper>
其中,namespace 属性对 sql 进行了分类处理,可以实现不同业务的 sql 隔离。select 标签中有一个 id 属性,当 sql 映射配置文件的 sql 被解析并封装到 mappedStatement 对象中时,为了调取相应的 sql,就需要这个 id 标识。
parameterType 时 sql 语句中参与字段的类型,resultType 表示将记录映射为 Java 对象。
0x07:编写映射的对象
上段的 resultType 映射的对象为 User 对象,编写这个 User 对象,其代码如下:
package cn.com.mybatis.pojo; import java.io.Serializable; import java.util.Date; public class User implements Serializable { private int id; private String username; private String password; private String gender; private String email; private String province; private String city; private Date birthday; public User(){} public User(int id,String username,String password,String gender,String email,String province,String city,Date birthday){ super(); this.id = id; this.username = username; this.password = password; this.gender = gender; this.email = email; this.province = province; this.city = city; this.birthday = birthday; } //get和set方法略 }
就是一个 java 对象,很简单,代码中有一个无参构造和有参构造。get 和 set 方法自动生成即可,页面中右键 source 选择 generate getters and setters 即可。
0x08:编写数据库交互类
最后,写下数据库交互类,之前文章说过 MyBatis 的工作流程,需要 SqlSessionFactor 加载配置文件,所以这里的数据库交互类主要就是创建 SqlSession 类,代码如下:
package cn.com.mybatis.datasource; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class DataConnection { private String resource = "SqlMapConfig.xml"; private SqlSessionFactory sqlSessionFactory; private SqlSession sqlSession; public SqlSession getSqlSession() throws IOException{ InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); sqlSession = sqlSessionFactory.openSession(); return sqlSession; } }
0x09:测试用例:
至此,代码就写完了,编写一个测试的例子即可,测试代码如下:
package cn.com.mybatis.test; import java.io.IOException; import java.text.SimpleDateFormat; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import cn.com.mybatis.datasource.DataConnection; import cn.com.mybatis.pojo.User; public class MyBatisTest { public DataConnection dataConn = new DataConnection(); @Test public void TestSelect() throws IOException{ SqlSession sqlSession = dataConn.getSqlSession(); User user = sqlSession.selectOne("test.findUserById",1); System.out.println("姓名:" + user.getUsername()); System.out.println("性别:" + user.getGender()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); System.err.println("生日:" + sdf.format(user.getBirthday())); System.out.println("所在地:" + user.getProvince() + user.getCity()); sqlSession.close(); } }
测试文件创建了可以与数据库交互的 sqlSession 实例对象,然后从数据库取出了 id 为 1 的用户数据,并在控制台打印。
sqlSession 的 SelectOne 方法有两个参数,第一个时 sql 映射的文件的 id,之前提到的唯一标识。第二个是 sql 映射文件中匹配的 parameterType 类型的参数,其控制台打印如下:
公众号回复数字“8”领取CIS加固全套手册。
微 信:fageweiketang,朋友圈不定期干货分享,欢迎讨论。
公众号:发哥微课堂,专注于代码审计、WEB渗透、网络安全。