Mybatis之(一)搭建Mybatis环境

一、搭建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中映射文件的加载方式(三种):

  1. resource方式加载映射文件;
    我们可以通过配置相关的resource文件来加载其映射文件,习惯于将此文件放在resource文件夹下,在此文件夹中创建三级目录:cn/ebuy/dao。
    但是当resource文件过多时,很明显这样的方式很不合适。

    <mappers>
    	<!-- 1.这是resource方式加载配置文件  -->
    	<mapper resource="cn/ebuy/dao/SystemUserMapper.xml"/>
    </mappers>
    
  2. 批量加载;
    当加载的文件过多时,我们可以采用批量加载的方式加载其映射文件。

    <mappers>
    	<!-- 2.指定接口的包名称,自动扫描包下的所有mapper接口进行加载-->
        <package name="cn.ebuy.dao"/>
    </mappers>
    
  3. 通过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>

小贴士:

  1. 数据库表中列名与实体类属性名要保持一致,当两个不一致时,利用查询时设置别名(与属性名一致)来解决查询为空的情况;
  2. 或者通过设置表名和实体类属性之间的映射来解决(注意在设置映射时要将所有的属性名全部映射,映射一般放在sql语句的最前面);
  3. 当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);
        }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值