第一章——认识mybatis

时间:2022-10-28 18:29:19

第一章、认识MyBATIS

1.1、mybatis的运行框架图:

第一章——认识mybatis

1、 首先我们需要配置MyBATIS的配置信息,它可以有两种方法进行提供。里面可以配置数据源,Mapper加载信息,缓存,类的别名还有其他资源的配置。

2、有了配置信息,我们将通过配置信息生成我们需要的SqlSessionFactory这个工厂类,然后我们就可以通过它生成我们MyBATIS的核心接口SqlSession对象。

3、 在SqlSession对象里,我们既可以获取Mapper通过Mapper去执行接口方法,也可以直接在SqlSession里面直接通过字符串去调度Mapper注册的SQL


上面论述的可能对于初学者不是很明白,但是这个不重要,我们只需要有初步的概念即可,下面我们会详细逐个论述。当然这里只是一个简单的图,我们并没有讨论MyBATIS后台的现实。

1.2、实例:

1.2.1  使用文件简介

我们先看看文件分布图:

第一章——认识mybatis

介绍一下文件的作用,如下表:

文件

作用

备注

configuration-chapter1.xml

MyBATIS的配置文件

配置基本信息。

log4j.properties

配置log4j日志文件输出

配置MyBATIS采用log4j日志输出。

userMaper.xml

使用xml文件配置映射器


UserPO.java

POJO对象类文件

符合Java Bean规范

MainCh1.java

测试类文件。

程序入口

UserMapper.java

映射器接口(使用xml方式)


     

好了,这里只是简单的介绍了MyBATIS的基本构成文件,大家有个概念即可。


所需jar包:关于mybatis相关的包可以到  http://mybatis.github.io/  下载,这里我使用了log4j作为日志,所以使用了log4j相关的包。

第一章——认识mybatis


这里我使用的是MySQL数据库,简易启动也快,不怎么耗资源,所以推荐使用。我们只需要建一张表即可,在mysql中执行下面sql即可。

DROP TABLE IF EXISTS `t_user`;

CREATE TABLE `t_user` (
  `ID` int(11) NOT NULL,
  `USERNAME` varchar(60) NOT NULL,
  `PASSWORD` varchar(60) NOT NULL,
  `BIRTHDAY` date NOT NULL,
  `MOBILE` varchar(20) NOT NULL,
  `TEL` varchar(20) DEFAULT NULL,
  `EMAIL` varchar(100) DEFAULT NULL,
  `NOTE` text,
  PRIMARY KEY (`ID`)
) ;

INSERT  INTO `t_user`(`ID`,`USERNAME`,`PASSWORD`,`BIRTHDAY`,`MOBILE`,`TEL`,`EMAIL`,`NOTE`) VALUES (1,'ykzhen','12345','2015-02-18','13533666666','0756-6666666','ykz@163.com','数据文件');
commit;

1.2.2 文件详解

我们从程序入口介绍,让我们先看看文件。


MainCh1.java

package com.ykzhen.ch1.test;

import com.ykzhen.ch1.mapper.UserMapper;
import com.ykzhen.ch1.po.UserPO;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
 *
 * @author ykzhen.
 */
public class MainCh1 {

    public static void main(String[] args) {
        //定义 SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = null;
        try {
            //使用配置文件创建 SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(
                    Resources.getResourceAsReader("configuration-chapter1.xml"));
        } catch (IOException ex) {
            //打印异常.
            Logger.getLogger(MainCh1.class.getName()).fatal("创建 SqlSessionFactory失败", ex);
            return;
        }
        //定义 sqlSession
        SqlSession sqlSession = null;
        try {
            //用sqlSessionFactory创建sqlSession
            sqlSession = sqlSessionFactory.openSession();
            //获取Mapper
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            //执行Mapper接口方法.
            UserPO user = userMapper.findUser(1);
            //打印信息
            System.err.println(user.getUsername());
        } finally {
            //使用完后要记得关闭sqlSession资源
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}



很显然,上述代码要构建SqlSessionFactory是依赖于configuration-chapter1.xml文件的。

它的内容如下:


configuration-chapter1.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>  
    <typeAliases>  
        <!--给实体类起一个别名 UserPO -->  
        <typeAlias type="com.ykzhen.ch1.po.UserPO" alias="UserPO" />  
    </typeAliases>  
    <!--数据源配置  这块用 mysql数据库 -->  
    <environments default="development">  
        <environment id="development">  
            <transactionManager type="jdbc" />  
            <dataSource type="POOLED">  
                <property name="driver" value="com.mysql.jdbc.Driver" />  
                <property name="url" value="jdbc:mysql://localhost:3306/oa" />  
                <property name="username" value="root" />  
                <property name="password" value="ykzhen" />  
            </dataSource>  
        </environment>  
    </environments>  
    <mappers>  
        <!--userMapper.xml装载进来  同等于把“dao”的实现装载进来 -->  
        <mapper resource="com\ykzhen\ch1\po\userMapper.xml" />  
    </mappers>  
</configuration> 

这里我们定义了一个UserPO的别名,它指代了类 com.ykzhen.ch1.po.UserPO,这样MyBATIS上下文就可以使用它。

跟着我们定义了数据源,这些有经验的程序员就很容易理解,好了,让我们先给出UserPO.java的代码。很简单的POJO文件。


UserPO.java

package com.ykzhen.ch1.po;

import java.util.Date;

/**
 *
 * @author ykzhen.
 */
public class UserPO {

    private Integer id = null;
    private String username = null;
    private String password = null;
    private Date birthday = null;
    private String mobile = null;
    private String tel = null;
    private String email = null;
    private String note = null;

    /**
     * @return the id
     */
    public Integer getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * @return the username
     */
    public String getUsername() {
        return username;
    }

    /**
     * @param username the username to set
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * @return the birthday
     */
    public Date getBirthday() {
        return birthday;
    }

    /**
     * @param birthday the birthday to set
     */
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    /**
     * @return the mobile
     */
    public String getMobile() {
        return mobile;
    }

    /**
     * @param mobile the mobile to set
     */
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    /**
     * @return the tel
     */
    public String getTel() {
        return tel;
    }

    /**
     * @param tel the tel to set
     */
    public void setTel(String tel) {
        this.tel = tel;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return the note
     */
    public String getNote() {
        return note;
    }

    /**
     * @param note the note to set
     */
    public void setNote(String note) {
        this.note = note;
    }

}

我们在配置文件中还定义了一个Mapper——UserMapper,它是以文件的形式定义的,那么它来自于配置文件.


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">   
<!--和接口路径和名称保持一致,MyBATIS会自动帮我们找到这个 Mapper-->
<mapper namespace="com.ykzhen.ch1.mapper.UserMapper">
    <!--查找用户,我们和接口方法保持一致,并且配置传入参数为整数,
    返回结果为UserPO,UserPO已经在配置文件中配置了上下文。-->
    <select id="findUser" parameterType="int" resultType="UserPO">  
            <!--#{id}是MyBATIS的参数写法-->
            <![CDATA[ 
            select id, username, password, birthday, mobile, tel, email, note from t_user  where id = #{id}
            ]]>  
    </select>  
</mapper>  

让我们看看我们UserMapper, 它是一个接口,而不是一个类。(一个没有实现类的接口如何运行的?大家是否需要思考一下。)

UserMapper.java

package com.ykzhen.ch1.mapper;
import com.ykzhen.ch1.po.UserPO;
/**
 *
 * @author ykzhen.
 */
//这里只需要接口,而不需要类
public interface UserMapper {
    //方法和userMapper.xml中的保持名称一致. 
    public UserPO findUser(Integer id);
}

最后,我想我们需要一些日志记录我们的程序运行过程,所以配置了log4j。

log4j.properties

log4j.rootLogger=DEBUG , stdout
log4j.logger.org.mybatis=DEBUG 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n

好了,让我们运行MainCh1.java文件,看看运行的结果如何。

DEBUG 2015-03-25 23:35:38,484 org.apache.ibatis.logging.LogFactory: Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG 2015-03-25 23:35:38,515 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2015-03-25 23:35:38,515 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2015-03-25 23:35:38,515 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2015-03-25 23:35:38,515 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2015-03-25 23:35:38,640 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection
DEBUG 2015-03-25 23:35:38,953 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection 1414521932.
DEBUG 2015-03-25 23:35:38,953 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@544fe44c]
DEBUG 2015-03-25 23:35:38,953 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  Preparing: select id, username, password, birthday, mobile, tel, email, note from t_user where id = ? 
DEBUG 2015-03-25 23:35:39,000 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: 1(Integer)
DEBUG 2015-03-25 23:35:39,046 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 1
ykzhen
DEBUG 2015-03-25 23:35:39,046 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@544fe44c]
DEBUG 2015-03-25 23:35:39,046 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@544fe44c]
DEBUG 2015-03-25 23:35:39,046 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection 1414521932 to pool.

好的结果很好,我们打出了MyBATIS的运行轨迹和我们想要的结果,更关键的是成功打印出了运行的SQL和相关参数,为我们调试提供了便利。


1.3、总结

笔者通过一个简单的图介绍了最为基本的MyBATIS的运行过程,同时提供了一个简单的例子并运行成功,让读者对MyBATIS有初步的认识,当然这是远远不够的,我们还需要进一步的认识MyBATIS才能更进一步的使用好这个框架,上述的应用还过于简易根本达不到在应用中使用mybatis的程度,不过千里之行始于足下,让我们走进MyBATIS的世界...