一、搭建环境
1.导入相关jar包
首先创建maven工程,直接在pom文件中导入maven仓库的相关依赖即可,如果是web项目,下载mybatis-3.5.2.jar包导入工程lib文件夹下即可。
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.ebuy</groupId>
<artifactId>ebuy-mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>9</maven.compiler.source>
<maven.compiler.target>9</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<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>
2.编写mybatis核心配置文件,配置数据库信息
此文件一般放在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"/>
<!-- <setting name="autoMappingBehavior" value="FULL"/>-->
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</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>
相关配置文件和核心配置文件一样,都放在resource目录下。
数据库配置文件database.properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:localhost:1521:orcl
username=easybuy
password=easybuy
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
3.创建实体类POJO
创建一个SystemUser类
package cn.ebuy.pojo;
import java.io.Serializable;
/**
* 用户实体
*/
@SuppressWarnings("all")
public class SystemUser implements Serializable {
/**
* 用户ID
*/
private String userinfo_uid;
/**
* 登录名
*/
private String userinfo_loginid;
/**
* 姓名
*/
private String userinfo_name;
/**
* 密码
*/
private String userinfo_password;
/**
* 性别
*/
private String userinfo_sex;
/**
* 电子邮箱
*/
private String userinfo_email;
/**
* 手机
*/
private String userinfo_mobile;
/**
* 用户状态(1 正常 2 锁定 3注销)
*/
private int userinfo_status;
public SystemUser() {
}
public SystemUser(String userinfo_uid, String userinfo_loginid, String userinfo_name, String userinfo_password, String userinfo_sex, String userinfo_email, String userinfo_mobile, int userinfo_status) {
this.userinfo_uid = userinfo_uid;
this.userinfo_loginid = userinfo_loginid;
this.userinfo_name = userinfo_name;
this.userinfo_password = userinfo_password;
this.userinfo_sex = userinfo_sex;
this.userinfo_email = userinfo_email;
this.userinfo_mobile = userinfo_mobile;
this.userinfo_status = userinfo_status;
}
@Override
public String toString() {
return "SystemUser{" +
"userinfo_uid='" + userinfo_uid + '\'' +
", userinfo_loginid='" + userinfo_loginid + '\'' +
", userinfo_name='" + userinfo_name + '\'' +
", userinfo_password='" + userinfo_password + '\'' +
", userinfo_sex='" + userinfo_sex + '\'' +
", userinfo_email='" + userinfo_email + '\'' +
", userinfo_mobile='" + userinfo_mobile + '\'' +
", userinfo_status=" + userinfo_status +
'}';
}
public String getUserinfo_uid() {
return userinfo_uid;
}
public void setUserinfo_uid(String userinfo_uid) {
this.userinfo_uid = userinfo_uid;
}
public String getUserinfo_loginid() {
return userinfo_loginid;
}
public void setUserinfo_loginid(String userinfo_loginid) {
this.userinfo_loginid = userinfo_loginid;
}
public String getUserinfo_name() {
return userinfo_name;
}
public void setUserinfo_name(String userinfo_name) {
this.userinfo_name = userinfo_name;
}
public String getUserinfo_password() {
return userinfo_password;
}
public void setUserinfo_password(String userinfo_password) {
this.userinfo_password = userinfo_password;
}
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;
}
}
4.创建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>映射实体类属性名和表的字段名对应关系 -->
<resultMap id="userMap" type="cn.ebuy.pojo.SystemUser">
<!-- 用id属性来映射主键字段 -->
<!-- 用result属性来映射非主键字段 -->
<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>
当实体类中的属性名和表中的字段名不一致时,使用MyBatis进行查询操作时无法查询出相应的结果的问题以及针对问题采用的两种办法:
解决办法一: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以表的字段名和实体类的属性名一一对应上了,这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。
解决办法二: 通过来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。
5.编写单元测试类(提前将公共的工具类创建好)
工具类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-conf.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();
}
}
I/O流读取核心配置文件mybatis-conf.xml
创建SQLSessionFactory工厂对象,加载配置文件
创建SQLSession对象
调用mapper文件进行数据操作
一般的测试类
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();
}
}
}
- 上述我们看到并没有创建对应的实体类mapper映射接口,在方法中使用的是sqlSession内部的方法,并加载了mapper配置文件中的id及其路径,其实MyBatis内部机制中,mapper-conf.xml文件中的namespace命名空间所对应的就是我们本应该创建的体类mapper映射接口,我们自己虽然没有创建,但是在MyBatis内部编译源代码时,会自动为我们创建匹配的相关实体咧mapper临时接口,以此实现我们自定义的SQL功能,但是我们一般不建议这样做,效率比较低,而且不够规范。
要保证接口中的方法名和mapper配置文件中的id保持一致
更新测试类
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);
}