第一章——认识mybatis

时间:2022-06-08 18:27:04
第一章、认识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即可。

[sql] view plaincopy
  1. DROP TABLE IF EXISTS `t_user`;  
  2.   
  3. CREATE TABLE `t_user` (  
  4.   `ID` int(11) NOT NULL,  
  5.   `USERNAME` varchar(60) NOT NULL,  
  6.   `PASSWORDvarchar(60) NOT NULL,  
  7.   `BIRTHDAY` date NOT NULL,  
  8.   `MOBILE` varchar(20) NOT NULL,  
  9.   `TEL` varchar(20) DEFAULT NULL,  
  10.   `EMAIL` varchar(100) DEFAULT NULL,  
  11.   `NOTE` text,  
  12.   PRIMARY KEY (`ID`)  
  13. ) ;  
  14.   
  15. 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','数据文件');  
  16. commit;  

1.2.2 文件详解

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


MainCh1.java

[java] view plaincopy
  1. package com.ykzhen.ch1.test;  
  2.   
  3. import com.ykzhen.ch1.mapper.UserMapper;  
  4. import com.ykzhen.ch1.po.UserPO;  
  5. import java.io.IOException;  
  6. import org.apache.log4j.Logger;  
  7. import org.apache.ibatis.io.Resources;  
  8. import org.apache.ibatis.session.SqlSession;  
  9. import org.apache.ibatis.session.SqlSessionFactory;  
  10. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  11.   
  12. /** 
  13.  * 
  14.  * @author ykzhen. 
  15.  */  
  16. public class MainCh1 {  
  17.   
  18.     public static void main(String[] args) {  
  19.         //定义 SqlSessionFactory  
  20.         SqlSessionFactory sqlSessionFactory = null;  
  21.         try {  
  22.             //使用配置文件创建 SqlSessionFactory  
  23.             sqlSessionFactory = new SqlSessionFactoryBuilder().build(  
  24.                     Resources.getResourceAsReader("configuration-chapter1.xml"));  
  25.         } catch (IOException ex) {  
  26.             //打印异常.  
  27.             Logger.getLogger(MainCh1.class.getName()).fatal("创建 SqlSessionFactory失败", ex);  
  28.             return;  
  29.         }  
  30.         //定义 sqlSession  
  31.         SqlSession sqlSession = null;  
  32.         try {  
  33.             //用sqlSessionFactory创建sqlSession  
  34.             sqlSession = sqlSessionFactory.openSession();  
  35.             //获取Mapper  
  36.             UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  37.             //执行Mapper接口方法.  
  38.             UserPO user = userMapper.findUser(1);  
  39.             //打印信息  
  40.             System.err.println(user.getUsername());  
  41.         } finally {  
  42.             //使用完后要记得关闭sqlSession资源  
  43.             if (sqlSession != null) {  
  44.                 sqlSession.close();  
  45.             }  
  46.         }  
  47.     }  
  48. }  

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

它的内容如下:


configuration-chapter1.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8" ?>       
  2. <!DOCTYPE configuration       
  3.     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"       
  4.     "http://mybatis.org/dtd/mybatis-3-config.dtd">    
  5. <configuration>    
  6.     <typeAliases>    
  7.         <!--给实体类起一个别名 UserPO -->    
  8.         <typeAlias type="com.ykzhen.ch1.po.UserPO" alias="UserPO" />    
  9.     </typeAliases>    
  10.     <!--数据源配置  这块用 mysql数据库 -->    
  11.     <environments default="development">    
  12.         <environment id="development">    
  13.             <transactionManager type="jdbc" />    
  14.             <dataSource type="POOLED">    
  15.                 <property name="driver" value="com.mysql.jdbc.Driver" />    
  16.                 <property name="url" value="jdbc:mysql://localhost:3306/oa" />    
  17.                 <property name="username" value="root" />    
  18.                 <property name="password" value="ykzhen" />    
  19.             </dataSource>    
  20.         </environment>    
  21.     </environments>    
  22.     <mappers>    
  23.         <!--userMapper.xml装载进来  同等于把“dao”的实现装载进来 -->    
  24.         <mapper resource="com\ykzhen\ch1\po\userMapper.xml" />    
  25.     </mappers>    
  26. </configuration>   

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

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


UserPO.java

[java] view plaincopy
  1. package com.ykzhen.ch1.po;  
  2.   
  3. import java.util.Date;  
  4.   
  5. /** 
  6.  * 
  7.  * @author ykzhen. 
  8.  */  
  9. public class UserPO {  
  10.   
  11.     private Integer id = null;  
  12.     private String username = null;  
  13.     private String password = null;  
  14.     private Date birthday = null;  
  15.     private String mobile = null;  
  16.     private String tel = null;  
  17.     private String email = null;  
  18.     private String note = null;  
  19.   
  20.     /** 
  21.      * @return the id 
  22.      */  
  23.     public Integer getId() {  
  24.         return id;  
  25.     }  
  26.   
  27.     /** 
  28.      * @param id the id to set 
  29.      */  
  30.     public void setId(Integer id) {  
  31.         this.id = id;  
  32.     }  
  33.   
  34.     /** 
  35.      * @return the username 
  36.      */  
  37.     public String getUsername() {  
  38.         return username;  
  39.     }  
  40.   
  41.     /** 
  42.      * @param username the username to set 
  43.      */  
  44.     public void setUsername(String username) {  
  45.         this.username = username;  
  46.     }  
  47.   
  48.     /** 
  49.      * @return the password 
  50.      */  
  51.     public String getPassword() {  
  52.         return password;  
  53.     }  
  54.   
  55.     /** 
  56.      * @param password the password to set 
  57.      */  
  58.     public void setPassword(String password) {  
  59.         this.password = password;  
  60.     }  
  61.   
  62.     /** 
  63.      * @return the birthday 
  64.      */  
  65.     public Date getBirthday() {  
  66.         return birthday;  
  67.     }  
  68.   
  69.     /** 
  70.      * @param birthday the birthday to set 
  71.      */  
  72.     public void setBirthday(Date birthday) {  
  73.         this.birthday = birthday;  
  74.     }  
  75.   
  76.     /** 
  77.      * @return the mobile 
  78.      */  
  79.     public String getMobile() {  
  80.         return mobile;  
  81.     }  
  82.   
  83.     /** 
  84.      * @param mobile the mobile to set 
  85.      */  
  86.     public void setMobile(String mobile) {  
  87.         this.mobile = mobile;  
  88.     }  
  89.   
  90.     /** 
  91.      * @return the tel 
  92.      */  
  93.     public String getTel() {  
  94.         return tel;  
  95.     }  
  96.   
  97.     /** 
  98.      * @param tel the tel to set 
  99.      */  
  100.     public void setTel(String tel) {  
  101.         this.tel = tel;  
  102.     }  
  103.   
  104.     /** 
  105.      * @return the email 
  106.      */  
  107.     public String getEmail() {  
  108.         return email;  
  109.     }  
  110.   
  111.     /** 
  112.      * @param email the email to set 
  113.      */  
  114.     public void setEmail(String email) {  
  115.         this.email = email;  
  116.     }  
  117.   
  118.     /** 
  119.      * @return the note 
  120.      */  
  121.     public String getNote() {  
  122.         return note;  
  123.     }  
  124.   
  125.     /** 
  126.      * @param note the note to set 
  127.      */  
  128.     public void setNote(String note) {  
  129.         this.note = note;  
  130.     }  
  131.   
  132. }  

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


userMapper.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8" ?>    
  2.     <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">     
  4. <!--和接口路径和名称保持一致,MyBATIS会自动帮我们找到这个 Mapper-->  
  5. <mapper namespace="com.ykzhen.ch1.mapper.UserMapper">  
  6.     <!--查找用户,我们和接口方法保持一致,并且配置传入参数为整数,  
  7.     返回结果为UserPO,UserPO已经在配置文件中配置了上下文。-->  
  8.     <select id="findUser" parameterType="int" resultType="UserPO">    
  9.             <!--#{id}是MyBATIS的参数写法-->  
  10.             <![CDATA[  
  11.             select id, username, password, birthday, mobile, tel, email, note from t_user  where id = #{id} 
  12.             ]]>    
  13.     </select>    
  14. </mapper>    

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

UserMapper.java

[java] view plaincopy
  1. package com.ykzhen.ch1.mapper;  
  2. import com.ykzhen.ch1.po.UserPO;  
  3. /** 
  4.  * 
  5.  * @author ykzhen. 
  6.  */  
  7. //这里只需要接口,而不需要类  
  8. public interface UserMapper {  
  9.     //方法和userMapper.xml中的保持名称一致.   
  10.     public UserPO findUser(Integer id);  
  11. }  

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

log4j.properties

[plain] view plaincopy
  1. log4j.rootLogger=DEBUG , stdout  
  2. log4j.logger.org.mybatis=DEBUG   
  3. log4j.appender.stdout=org.apache.log4j.ConsoleAppender   
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout   
  5. log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n  

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

[plain] view plaincopy
  1. DEBUG 2015-03-25 23:35:38,484 org.apache.ibatis.logging.LogFactory: Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.  
  2. DEBUG 2015-03-25 23:35:38,515 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.  
  3. DEBUG 2015-03-25 23:35:38,515 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.  
  4. DEBUG 2015-03-25 23:35:38,515 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.  
  5. DEBUG 2015-03-25 23:35:38,515 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.  
  6. DEBUG 2015-03-25 23:35:38,640 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection  
  7. DEBUG 2015-03-25 23:35:38,953 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection 1414521932.  
  8. 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]  
  9. 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 = ?   
  10. DEBUG 2015-03-25 23:35:39,000 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: 1(Integer)  
  11. DEBUG 2015-03-25 23:35:39,046 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      Total: 1  
  12. ykzhen  
  13. 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]  
  14. DEBUG 2015-03-25 23:35:39,046 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@544fe44c]  
  15. 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的世界...

1