一、搭建Mybatis环境
1.1 导入相关jar包(Mybatis、Oracle、log4j、Junit等)
在一个maven项目中导入jar包,只用在pom.xml文件里导入相关的jar包即可。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--gav:项目的坐标-->
<modelVersion>4.0.0</modelVersion>
<groupId>cn.ebuy</groupId>
<artifactId>ebuy-dao1</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>9</maven.compiler.source>
<maven.compiler.target>9</maven.compiler.target>
</properties>
<dependencies>
<!--mybatis相关jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--log4j包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--数据库连接-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.2.0</version>
<scope>compile</scope>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
</project>
1.2 创建相关的实体类pojo
这里我们创建一个实体类SystemUser。
package cn.ebuy.pojo;
import java.io.Serializable;
/**
* 用户实体
*/
public class SystemUser implements Serializable {
/**
* 用户ID
*/
private String userinfouid;
/**
* 登录名
*/
private String userinfologinid;
/**
* 姓名
*/
private String userinfoname;
/**
* 密码
*/
private String userinfopassword;
/**
* 性别
*/
private String userinfo_sex;
/**
* 电子邮箱
*/
private String userinfo_email;
/**
* 手机
*/
private String userinfo_mobile;
/**
* 用户状态(1 正常 2 锁定 3注销)
*/
private int userinfo_status;
public String getUserinfouid() {
return userinfouid;
}
public void setUserinfouid(String userinfouid) {
this.userinfouid = userinfouid;
}
public String getUserinfologinid() {
return userinfologinid;
}
public void setUserinfologinid(String userinfologinid) {
this.userinfologinid = userinfologinid;
}
public String getUserinfoname() {
return userinfoname;
}
public void setUserinfoname(String userinfoname) {
this.userinfoname = userinfoname;
}
public String getUserinfopassword() {
return userinfopassword;
}
public void setUserinfopassword(String userinfopassword) {
this.userinfopassword = userinfopassword;
}
public String getUserinfo_sex() {
return userinfo_sex;
}
public void setUserinfo_sex(String userinfo_sex) {
this.userinfo_sex = userinfo_sex;
}
public String getUserinfo_email() {
return userinfo_email;
}
public void setUserinfo_email(String userinfo_email) {
this.userinfo_email = userinfo_email;
}
public String getUserinfo_mobile() {
return userinfo_mobile;
}
public void setUserinfo_mobile(String userinfo_mobile) {
this.userinfo_mobile = userinfo_mobile;
}
public int getUserinfo_status() {
return userinfo_status;
}
public void setUserinfo_status(int userinfo_status) {
this.userinfo_status = userinfo_status;
}
public SystemUser() {
}
public SystemUser(String userinfouid, String userinfologinid, String userinfoname, String userinfopassword, String userinfo_sex, String userinfo_email, String userinfo_mobile, int userinfo_status) {
this.userinfouid = userinfouid;
this.userinfologinid = userinfologinid;
this.userinfoname = userinfoname;
this.userinfopassword = userinfopassword;
this.userinfo_sex = userinfo_sex;
this.userinfo_email = userinfo_email;
this.userinfo_mobile = userinfo_mobile;
this.userinfo_status = userinfo_status;
}
}
1.3 编写Mybatis核心配置文件mybatis-config.xml
此文件一般放在resource目录下。
<?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="database.properties"/>
<!--设置MyBatis控制台输出为log4j-->
<settings>
<setting name="logImpl" value="log4j"/>
</settings>
<typeAliases>
<!--表示设置自动扫描的方式设置别名-->
<package name="cn.ebuy.pojo"/>
</typeAliases>
<!--配置数据库连接-->
<environments default="oracle">
<environment id="oracle">
<transactionManager type="jdbc"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--1.resource方式加载映射文件-->
<!--<mapper resource="cn/ebuy/dao/SystemUserMapper.xml"/>
<mapper resource="cn/ebuy/dao/SystemRoleMapper.xml"/>-->
<!--2.批量加载
指定接口的包名称,自动扫描包下的所有mapper接口进行加载-->
<package name="cn.ebuy.dao"/>
<!-- 3.通过mapper接口加载映射文件
遵循规范:需要将mapper接口类名与xml文件映射名称保持一致,且在一个目录中
上边规范的前提是:使用的是mapper代理的方法-->
<!-- <mapper class="cn.ebuy.dao.SystemUserMapper"/>-->
</mappers>
</configuration>
区分Mybatis中映射文件的加载方式(三种):
-
resource方式加载映射文件;
我们可以通过配置相关的resource文件来加载其映射文件,习惯于将此文件放在resource文件夹下,在此文件夹中创建三级目录:cn/ebuy/dao。
但是当resource文件过多时,很明显这样的方式很不合适。<mappers> <!-- 1.这是resource方式加载配置文件 --> <mapper resource="cn/ebuy/dao/SystemUserMapper.xml"/> </mappers>
-
批量加载;
当加载的文件过多时,我们可以采用批量加载的方式加载其映射文件。<mappers> <!-- 2.指定接口的包名称,自动扫描包下的所有mapper接口进行加载--> <package name="cn.ebuy.dao"/> </mappers>
-
通过mapper接口加载映射文件
<mappers> <!-- 3.通过mapper接口加载映射文件 遵循规范:需要将mapper接口类名与xml文件映射名称保持一致,且在一个目录中 上边规范的前提是:使用的是mapper代理的方法--> <mapper class="cn.ebuy.dao.SystemUserMapper"/> </mappers>
1.4 编写相关配置文件(数据库文件、log4j文件等)
相关配置文件和核心配置文件一样,都放在resource目录下。
数据库配置文件database.properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:localhost:1521:orcl
username=username
password=password
log4j配置文件log4j.properties
log4j.rootLogger=DEBUG,CONSOLE
#log4j.rootLogger=ERROR,ROLLING_FILE
log4j.logger.cn.ebuy.dao=debug
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug
######################################################################################
# Console Appender \u65e5\u5fd7\u5728\u63a7\u5236\u8f93\u51fa\u914d\u7f6e
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=error
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%p] %d %c - %m%n
1.5 在DAO层创建SQL映射文件mapper.xml
在resource文件夹下创建三级目录:cn/ebuy/dao,在dao下创建sql映射文件
<?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="cn.ebuy.dao.SystemUserMapper">
<!--用户实体和表的映射-->
<resultMap id="userMap" type="cn.ebuy.pojo.SystemUser">
<result property="userinfouid" column="userinfo_uid"/>
<result property="userinfologinid" column="userinfo_loginid"/>
<result property="userinfoname" column="userinfo_name"/>
<result property="userinfopassword" column="userinfo_password"/>
<result property="userinfo_sex" column="userinfo_sex"/>
<result property="userinfo_email" column="userinfo_email"/>
<result property="userinfo_mobile" column="userinfo_mobile"/>
<result property="userinfo_status" column="userinfo_status"/>
</resultMap>
<!--查询表中记录数-->
<select id="count" resultType="int">
select count(*) from system_userinfo
</select>
<!--查询所有的用户信息-->
<select id="selectAll" resultType="cn.ebuy.pojo.SystemUser">
select * from system_userinfo
</select>
<!--当实体类中的属性名和数据库表的字段名不一致时,通过映射来解决-->
<select id="selectAll2" resultMap="userMap">
select * from system_userinfo
</select>
</mapper>
小贴士:
- 数据库表中列名与实体类属性名要保持一致,当两个不一致时,利用查询时设置别名(与属性名一致)来解决查询为空的情况;
- 或者通过设置表名和实体类属性之间的映射来解决(注意在设置映射时要将所有的属性名全部映射,映射一般放在sql语句的最前面);
- 当resultMap和resultType同时出现时,以resultMap映射为基准。
1.6 编写单元测试类(可以先提前将公共的工具类创建好)
工具类MybatisUtil.java
package cn.ebuy.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory = null;
static {
String resource = "mybatis-config.xml";
InputStream is = null;
try {
is = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession createSqlSession() {
return sqlSessionFactory.openSession();
}
public static void closeeSqlSession(SqlSession sqlSession) {
if (sqlSession != null)
sqlSession.close();
}
}
- 一般的测试类
package cn.ebuy.dao;
import cn.ebuy.pojo.SystemUser;
import cn.ebuy.pojo.SystemUser2;
import cn.ebuy.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class SystemUserMapperTest {
/**
* 测试查询表中的记录数
*/
@Test
public void count() {
try {
int count = 0;
SqlSession sqlSession = MyBatisUtil.createSqlSession();
count = sqlSession.selectOne("cn.ebuy.dao.SystemUserMapper.count");
System.out.println(count);
MyBatisUtil.closeeSqlSession(sqlSession);
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 测试查询所有用户信息
*/
@Test
public void selectAll() {
try {
List<SystemUser> list;
SqlSession sqlSession = MyBatisUtil.createSqlSession();
list = sqlSession.selectList("cn.ebuy.dao.SystemUserMapper.selectAll");
for (SystemUser systemUser : list) {
System.out.println(systemUser);
}
MyBatisUtil.closeeSqlSession(sqlSession);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
-
优化后的测试
为了优化测试,我们一般将dao层的接口添加上,映射文件中的namespace就是用于绑定dao接口的,即面向接口编程。当映射文件中的namespace与接口绑定之后,不用写实现类,mybatis会通过该绑定自动帮我们找到要执行的SQL语句。
在前面我们并没有在映射文件中很在意namespace命名空间,是因为Mybatis内部机制在编译执行SQL代码前,会先找到mapperDao接口,如果没有,就会自己创建一个临时的接口以供执行SQL语句使用。
这样我们就可以利用反射机制来调用dao层的方法啦!package cn.ebuy.dao; import cn.ebuy.pojo.SystemUser; import cn.ebuy.pojo.SystemUser2; import cn.ebuy.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class SystemUserMapperTest2 { /** * 测试查询表中记录数 */ @Test public void count(){ int count = 0; SqlSession sqlSession = MyBatisUtil.createSqlSession(); SystemUserMapper systemUserMapper = sqlSession.getMapper(SystemUserMapper.class); System.out.println(systemUserMapper.count()); MyBatisUtil.closeeSqlSession(sqlSession); } /** * 测试查询所有用户信息 */ @Test public void selectAll(){ List<SystemUser> list; SqlSession sqlSession = MyBatisUtil.createSqlSession(); SystemUserMapper systemUserMapper = sqlSession.getMapper(SystemUserMapper.class); list = systemUserMapper.selectAll(); for (SystemUser systemUser:list){ System.out.println(systemUser); } MyBatisUtil.closeeSqlSession(sqlSession); }