一.搭建工程环境:
1.数据库准备
使用oracle数据库,创建一个名为t_user的表:
create table t_user(
id number(7) primary key,
username varchar2(120) not null,
password varchar2(16) not null,
gender varchar(5),
birthday date default null
);
向user插入四条数据,以供测试:
insert all into t_user (id,username,password,gender,birthday)
values (1,'zhangsan','111','男',to_date('1992-11-09','yyyy-mm-dd'))
into t_user (id,username,password,gender,birthday)
values (2,'lisi','222','男',to_date('1999-9-03','yyyy-mm-dd'))
into t_user (id,username,password,gender,birthday)
values (3,'wangwu','333','男',to_date('1997-06-28','yyyy-mm-dd'))
into t_user (id,username,password,gender,birthday)
values (4,'hanmeimei','444','女',to_date('1995-01-15','yyyy-mm-dd'))
select 1 from dual;
2.创建工程以及导入依赖的jar包
首先打开Eclipse,创建一个Web工程,这里将其命名为MyBatisDemo。
导入依赖的jar包:这里所使用的核心jar包为mybatis-3.4.1.jar
其他依赖的jar包如下,并将这些jar包放在WEB-INF的lib文件夹下,然后全选所有jar包,右键选择BuilPath->Add To Build Path,将依赖jar包引入工程环境。
3.引入mybatis的dtd约束文件:
mybatis的配置文件是.xml文件,mybatis框架在读取该xml文件时,并不能保证配置文件中的每一个标签对。以及标签对中的参数值配置完全符合标准。这就要求引入一种“DTD(Document Type Definition)”文档定义类型。
dtd文件下载地址:
mybatis-3-config.dtd约束文件下载:
http://mybatis.org/dtd/mybatis-3-config.dtd
mybatis-3-mapper.dtd约束文件下载:
http://mybatis.org/dtd/mybatis-3-mapper.dtd
在项目中创建一个文件夹来存放dtd文件:
然后配置xml自动提示:
点击eclipse的Window->Preferences,搜索XML Catalog,点击右侧ADD按钮,依次将两个dtd文件添加进入。
Location选择Workspace中dtd文件的位置。
Key:mybatis-3-config.dtd:-//mybatis.org//DTD Config 3.0//EN
mybatis-3-mapper.dtd:-//mybatis.org//DTD Mapper 3.0//EN
4.为工程开发准备需要的目录结构
一般将目录结构分为源代码目录、配置文件目录和测试目录,src文件夹是存放源代码的地方,该工程的代码主要分为三大块:数据库连接、持久层对象、映射接口、测试主程序。所以首先在src下创建四个包,分别是com.mybatis.datasource、com.mybatis.po、com.mybatis.mapper、com.mybatis.test。如下所示:
然后,我们在项目下创建一个config文件夹,用来存放配置文件:
5.编写日志文件和数据库配置文件
在之前创建的config文件夹下创建一个名为oracle.properties的文件
设置数据库的driver url username password
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:ORCL
username=rosinante
password=123456
在config文件夹下再创建一个名为log4j.properties的文件
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n
#show sql
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
6.编写数据库连接池配置文件
在之前创建的config文件夹下创建一个名为mybatis-config.xml的xml文件。
mybatis-config.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>
<!--指定当前配置文件中的常量值-->
<properties resource="oracle.properties">
<!--注意:oracle.properties文件中的值优先级高-->
<property name="username" value="rosinante"/>
<property name="passwprd" value="123456"/>
</properties>
<!-- 设置全局参数 -->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!-- 配置环境变量和数据库信息 -->
<environments default="development">
<environment id="development">
<!-- 事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="diver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
指定xml的版本信息和编码格式信息:
<?xml version="1.0" encoding="UTF-8"?>
引入DTD文档定义类型:
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
在setting标签对中配置日志输出模式logImpl为LOG4J
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
在environments中配置mybatis的环境信息,里面允许有多个environment标签,这是因为项目开发中我们不可能只用到一个数据库,每一个单独的environment标签对代表一个单独的数据库配置环境,由于这里我们只用oracle数据库,所以只需要有一个environment标签来配置数据库。
在environment标签对中,transactionManager标签配置的是MyBatis的事务控制类型
<transactionManager type="JDBC"/>
dataSource标签对中配置的是数据库链接信息,其中包含多个property标签,用于配置数据库驱动信息driver、数据库连接地址url、数据库用户名username、数据库密码password。
<dataSource type="POOLED">
<property name="diver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
我们这里使用oracle.properties将diver、url、username、password的参数传入dataSource标签对中,这样在以后的开发中如果需要修改数据库连接可以直接通过oracle.properties而不用修改源码。
二、编写数据交互类与测试用例
1.编写pojo类
POJO(Plain Old Java Object)类,即普通java对象。POJO类方便程序员将数据库中的数据信息映射为Java类的实体类,当POJO类满足有一个空的构造方法,可序列化,类中的属性可以用get/set方法来获取和设置时,那么就可以称之为一个JavaBean。
我们在com.mybatis.po包下创建一个名为User的pojo类:
package com.mybatis.po;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
public User() {
// TODO Auto-generated constructor stub
}
private Integer id;
private String username;
private String password;
private String gender;
private Date birthday;
public User(Integer id, String username, String password, String gender,
Date birthday) {
super();
this.id = id;
this.username = username;
this.password = password;
this.gender = gender;
this.birthday = birthday;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
...
get/set
...
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + ", gender=" + gender + ", birthday=" + birthday
+ "]";
}
}
2.编写映射接口
在com.mybatis.mapper包下面新建一个接口UserMapper.java,用来对应xml文件中的sql语句(映射),从而方便我们调用
package com.mybatis.mapper;
import com.mybatis.po.User;
public interface UserMapper {
public void insertUser(User user);
public void updateUser(User user);
public void DeleteStudent(Integer i);
public User findUserById(Integer i);
}
3.编写映射接口配置文件
在com.mybatis.mapper下,创建一个名为UserMapper.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">
<!--namespace是UserMapper接口的路径-->
<mapper namespace="com.mybatis.mapper.UserMapper">
<resultMap type="com.mybatis.po.User" id="userResult">
<!--通过resultMap建立pojo类属性与数据库字段一一对应的关系-->
<!--主键必须要有-->
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="gender" column="gender"/>
<result property="birthday" column="birthday"/>
</resultMap>
<!--id与接口中的方法名要一致-->
<select id="findUserById" parameterType="int" resultType="com.mybatis.po.User">
<!--#{}表示一个占位符,其中的id表示接受输入参数的名称-->
SELECT * FROM T_USER WHERE id=#{id}
</select>
</mapper>
在select标签中可以看到一个值为"findUserById"的id属性,我们知道,SQL映射配置文件中的SQL都被解析并封装到mapperStatement对象中,为了调取相应的SQL,需要一个唯一的标识,所以该id属性是映射文件中的SQL被解析并转换成为Statement的id。
这里的parameterType指定输入参数的类型为int,而resultType表示将单条记录映射成为一个名为User的Java对象。在select标签中配置的是SQL语句。
我们创建里一个mapper以后,还必须要在mybatis-config.xml文件中对其进行配置,这是为了让MyBatis资源文件加载类解析Mapper文件,需要把Mapper文件的路径配置在全局配置文件mybatis-config.xml中。
<configuration>
......
<mappers>
<mapper resource="com/mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
4.编写数据交互类
在com.mybatis.datasource下创建一个名为DataConnection的类,该类的作用是获取SqlSession数据库交互对象。
package 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 {
//MyBatis配置文件
private String resource="mybatis-config.xml";
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
public SqlSession getSqlSession() throws IOException{
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂,传入MyBatis配置文件信息
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
sqlSession=sqlSessionFactory.openSession();
return sqlSession;
}
}
在该类中,通过Resource资源加载类加载mybatis-config.xml配置文件,然后获取SQL会话工厂SqlSessionFactory,之后使用会话工厂创建可以与数据库交互的sqlSession类的实例对象。
5.编写测试类
测试工具:JUnit4
如何使用Junit测试可以参考这篇博文:Junit的基本使用
测试实例:从数据库t_user表中取出id为1的用户的数据
我们在com.mybatis.test下创建一个名为MyBatisTest的类
package com.mybatis.test;
import java.io.IOException;
import java.text.SimpleDateFormat;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.mybatis.datasource.DataConnection;
import com.mybatis.mapper.UserMapper;
import com.mybatis.po.User;
public class MyBatisTest {
public DataConnection dataConn=new DataConnection();
@Test
public void TestSelect() throws IOException{
//构建sqlsession对象
SqlSession sqlSession=dataConn.getSqlSession();
//sqlSession.selectOne最终结果与映射文件中所匹配的resultType类型
//得到映射接口实例
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//执行方法
User user=userMapper.findUserById(1);
System.out.println(user);
sqlSession.close();
//因为是查询语句,不需要提交事务
//只用insert,update,delete需要提交事务
}
}
测试方法:选中要测试的方法TestSelect,右键run as->JUnit Test
测试结果:
JUnit未报错
log4j输出日志到控制台
成功查询到id为1的数据项:
User [id=2, username=lisi, password=222, gender=男, birthday=Fri Sep 03 00:00:00 GMT+08:00 1999]