MyBatis 入门(简明浅入易懂)

来源:互联网 发布:凹凸视频大软件 编辑:程序博客网 时间:2024/04/30 04:21

一、MyBatis的简介

    MyBatis的前身就是iBatis。它是一个数据持久层框架。支持普通SQL查询、存储过程和高级映射的优秀持久层框架。消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

   2010年6月16日,原iBatis开源项目由apache移到了google code,并改名为MyBatis。官方网址为:http://www.mybatis.org/。 目前的下载地址可以直接从google中下载了,下载地址:http://code.google.com/p/mybatis/downloads/list。    个人建议下载:mybatis-3.1.1-bundle.zip

二、快速的入门 开发步骤:

  1. 下载mybatis,解压将mybatis-3.1.1.jar拷到工程lib中。若是web应用,请拷到web-inf/lib中。

  2. 编写mybatis的配置文件mybatis-config.xml(名称可以任意,但个人建议用mybatis-config.xml)。

  3. 开发POJOs对象、创建数据库中的表、编写相应POJO类的Mapping.xml文件。

  4. 用mybatis实现的dao层,具体核对对象是SqlSession。

下面就以上步骤详细说明:

1 )  拷jar包到工程中就不用说了吧。直接截图下吧。

     

2 ) 编写mybatis的配置文件mybatis-config.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">   <!-- dtd约束,一定要拷过去啊。下面的根据具体应用,改改就可以了 -->  
  5. <configuration>  
  6.     <!--  指定与数据库相关的配置资源文件名,若下面的dataSource所需要的url等直接配置编码在此文件,那么此properties也可以去掉 -->  
  7.     <properties resource="db.properties"/>    
  8.     <!-- 给指定的类定义别名,这样在后面的Mapping映射文件中,可以直接写别名,可以不用写完整限定类名了 -->  
  9.     <typeAliases>  
  10.         <typeAlias alias="Person" type="com.test.domain.Person" />  <!-- 指定com.test.domain.Person用Person别名替代 -->  
  11.     </typeAliases>  
  12.     <environments default="default">  
  13.         <environment id="default">  
  14.             <transactionManager type="JDBC" />    <!-- JDBC事务管理 -->  
  15.             <dataSource type="POOLED">  <!-- 数据源 连接池相关 所需要数据库连接的相关配置信息,在db.properties有指定 -->  
  16.                 <property name="driver" value="${driver}" />  
  17.                 <property name="url" value="${url}" />  
  18.                 <property name="username" value="${username}" />  
  19.                 <property name="password" value="${password}" />  
  20.             </dataSource>  
  21.         </environment>  
  22.     </environments>  
  23.     <!-- 映射文件 将sql、POJO、dao层映射连接在一起,以可配置的方式来组织。从此SQL的写法与dao层无关了。 -->  
  24.     <mappers>  
  25.         <mapper resource="com/test/domain/PersonMapper.xml" />  
  26.     </mappers>  
  27. </configuration>  

db.properties文件编写:

[java] view plaincopy
  1. driver=com.mysql.jdbc.Driver  
  2. url=jdbc:mysql://localhost:3306/test  
  3. username=root  
  4. password=chen  


3) 开发POJOs对象、创建数据库中的表、编写相应POJO类的Mapping.xml文件。

3.1 javabean及创建数据库的表如下:

[java] view plaincopy
  1. package com.test.domain;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.Date;  
  5. /** 
  6.  编码POJO Person,再根据此Person创建表,在数据库创建表的SQL语句如下: 
  7.  use test; 
  8.  create table if not exists person( 
  9.     id int primary key , 
  10.     name varchar(20), 
  11.     birthday date 
  12.  ) 
  13.  *  
  14.  * @author 陈淑飞 
  15.  * @time Oct 6, 2012 
  16.  */  
  17. public class Person implements Serializable {  
  18.   
  19.     private Integer id ;//id 自己维护,也可以让数据库来维护,若用mysql可利用mysql的auto_increment来维护id  
  20.     private String name;  
  21.     private Date birthday;  
  22.       
  23.     @Override  
  24.     public String toString() {  
  25.         return id + "," + name+","+birthday.toLocaleString(); //没有什么特别意义,纯粹为测试打印输出方便看。  
  26.     }  
  27.     public Integer getId() {  
  28.         return id;  
  29.     }  
  30.     public void setId(Integer id) {  
  31.         this.id = id;  
  32.     }  
  33.     public String getName() {  
  34.         return name;  
  35.     }  
  36.     public void setName(String name) {  
  37.         this.name = name;  
  38.     }  
  39.     public Date getBirthday() {  
  40.         return birthday;  
  41.     }  
  42.     public void setBirthday(Date birthday) {  
  43.         this.birthday = birthday;  
  44.     }  
  45.     @Override  
  46.     public boolean equals(Object obj) {  
  47.         // TODO Auto-generated method stub  
  48.         return super.equals(obj);  
  49.     }  
  50.     @Override  
  51.     public int hashCode() {  
  52.         // TODO Auto-generated method stub  
  53.         return super.hashCode();  
  54.     }  
  55. }  

3.2  PersonMapper.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. <mapper namespace="p1">  
  5.     <!-- 查询一个对象 -->  
  6.     <select id="selectOnePerson" parameterType="int" resultType="Person"><!-- Person 使用了别名,也可直接用类完全限定名替换。个人建议用别名更灵活 -->  
  7.         SELECT id,name,birthday FROM person WHERE id=#{id}  
  8.     </select>  
  9.     <!-- 查询多个对象 -->  
  10.     <select id="selectAllPersons" resultType="Person">  
  11.         SELECT id,name,birthday FROM person  
  12.     </select>  
  13.     <!-- 增加一条记录 -->  
  14.     <insert id="insertPerson" parameterType="Person" flushCache="true" statementType="PREPARED">  
  15.         INSERT INTO person (id,name,birthday) VALUES (#{id},#{name},#{birthday})  
  16.     </insert>  
  17.     <!-- 更新 -->  
  18.     <update id="updatePerson" parameterType="Person">  
  19.         UPDATE person set name=#{name},birthday=#{birthday} WHERE id=#{id}  
  20.     </update>  
  21.     <!-- 删除 -->  
  22.     <delete id="deletePerson" parameterType="int">  
  23.         delete from person where id=#{id}  
  24.     </delete>  
  25.     <!-- 从上面的可以看对,对数据库表的CRUD操作,映射文件中分别用了四个标签insert、select、update、delete来指定sql语句、传入参数类型和结果集类型 -->  
  26. </mapper>  

4). 用mybatis实现的dao层,具体核对对象是SqlSession。
  由于dao层依赖于SqlSession。而SqlSession的创建过程需要SqlSessionFactory对象,此对象对于多次的CRUD操作只需要一个对象,所以这里引用另一个自定义的MyBatisUtils工具类。具体代码如下:

[java] view plaincopy
  1. package com.test.util;  
  2.   
  3. import java.io.InputStream;  
  4.   
  5. import org.apache.ibatis.session.SqlSession;  
  6. import org.apache.ibatis.session.SqlSessionFactory;  
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  8.   
  9. /** 
  10.  mybatis工具类,提供openSesison,对外提供SqlSession对象。 
  11.  将此对象的构造过程隐藏起来,SqlSessionFactory对象,只需要在类加载时创建出来就OK了。 
  12.  需要指定mybatis的配置文件xml的路径或相应的字节流或字符流。 
  13.   
  14.  这里用字节流InputStream,采用类加载器的方式来获取输入字节流。 
  15.  * @author 陈淑飞 
  16.  * @time Oct 6, 2012 
  17.  */  
  18. public class MyBatisUtils {  
  19.   
  20.     private static SqlSessionFactory factory ;  
  21.       
  22.     static{  
  23.         InputStream in = MyBatisUtils.class.getClassLoader().getResourceAsStream("mybatis-config.xml");  
  24.         factory = new SqlSessionFactoryBuilder().build(in);  
  25.     }  
  26.       
  27.     public static SqlSessionFactory getSqlSessionFactory(){  
  28.         return factory;  
  29.     }  
  30.       
  31.     /** 
  32.      返回一个SqlSession对象(每次返回一个新的SqlSession对象) 
  33.      若涉及多个表的操作,涉及事务的,要做到操作失败时回滚,那么建议自定义一个TransactionUtils的工具类 
  34.      用ThreadLocal类来保存SqlSession类,这样跨多个dao操作时,确保获取的都是同一SqlSession对象。然后在service层中捕获异常,再catch上用session的回滚。 
  35.      * @return 
  36.      */  
  37.     public static SqlSession openSession(){  
  38.         return factory.openSession();  
  39.     }  
  40.       
  41. }  

dao层的实现类:

[java] view plaincopy
  1. package com.test.dao.impl;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.ibatis.session.SqlSession;  
  6.   
  7. import com.test.dao.PersonDao;  
  8. import com.test.domain.Person;  
  9. import com.test.util.MyBatisUtils;  
  10.   
  11. /** 
  12.  * 用MyBatis完全可以脱离JDBC的相关雍肿的对象,而且可以将sql语句与程序解耦了。 
  13.  * sql有需要变时只需要将相应的映射文件,.xml中SQL语句改下即可。 
  14.  * @author 陈淑飞 
  15.  * @time Oct 6, 2012 
  16.  */  
  17. public class PersonDaoImplForMyBatis implements PersonDao {  
  18.   
  19.     /** 
  20.      * 添加一个Person 
  21.      */  
  22.     public void addPerson(Person person){  
  23.         //获取一个SqlSession对象  
  24.         SqlSession session = MyBatisUtils.openSession();  
  25.         //添加操作,用insert方法,第一个参数必须是mapping中唯一的id的值。  
  26.         session.insert("insertPerson", person);  
  27.         //涉及insert、update、delete的DML,要手动的commit呢,注意close方法是不会监测有木有commit,幻想close方法去commit会让你死的很惨滴。  
  28.         session.commit();  
  29.         //session也是相当于缓冲池技术一样的,所以用完也要记得close哦。  
  30.         session.close();   
  31.     }  
  32.       
  33.     /** 
  34.      * 根据id查找Person,返回与id值匹配的Person对象。 
  35.      */  
  36.     public Person findPerson(Integer id){  
  37.         SqlSession session = MyBatisUtils.openSession();  
  38.         Person person = (Person)session.selectOne("selectOnePerson", id);  
  39.         session.commit();  
  40.         session.close();  
  41.         return person;  
  42.     }  
  43.       
  44.     /** 
  45.      * 查找所有的Person对象,以List的形式返回结果 
  46.      */  
  47.     public List<Person> findPerson(){  
  48.         SqlSession session = MyBatisUtils.openSession();  
  49.         List<Person> list = session.selectList("selectAllPersons");  
  50.         session.commit();  
  51.         session.close();  
  52.         return list;  
  53.     }  
  54.       
  55.     /** 
  56.      * 根据Person对象的ID来更新Person对象。 
  57.      */  
  58.     public void updatePerson(Person person){  
  59.         SqlSession session = MyBatisUtils.openSession();  
  60.         session.update("updatePerson", person);  
  61.         session.commit();  
  62.         session.close();  
  63.     }  
  64.       
  65.     /** 
  66.      * 根据id,删除与id值匹配的Person对象 
  67.      */  
  68.     public void deletePerson(Integer id){  
  69.         SqlSession session = MyBatisUtils.openSession();  
  70.         session.delete("deletePerson", id);  
  71.         session.commit();  
  72.         session.close();  
  73.     }  
  74. }  



三、测试Junit单元测试,对上面的dao实现进行测试。

[java] view plaincopy
  1. package com.test;  
  2.   
  3. import static org.junit.Assert.fail;  
  4.   
  5. import java.util.Date;  
  6. import java.util.List;  
  7.   
  8. import org.junit.Test;  
  9.   
  10. import com.test.dao.PersonDao;  
  11. import com.test.dao.impl.PersonDaoImplForMyBatis;  
  12. import com.test.domain.Person;  
  13. /** 
  14.  * dao层的单元测试 
  15.  * @author 陈淑飞 
  16.  * @time Oct 6, 2012 
  17.  */  
  18. public class PersonDaoImplForMyBatisTest {  
  19.   
  20.     private PersonDao dao = new PersonDaoImplForMyBatis();  
  21.       
  22.     @Test  
  23.     public void testAddPerson() {  
  24.         Person person = new Person();  
  25.         person.setId(15);  
  26.         person.setName("lansheng");  
  27.         person.setBirthday(new Date());  
  28.           
  29.         dao.addPerson(person);  
  30.     }  
  31.   
  32.     @Test  
  33.     public void testFindPersonInteger() {  
  34.         Person person = dao.findPerson(10);  
  35.         System.out.println(person);  
  36.     }  
  37.   
  38.     @Test  
  39.     public void testFindPerson() {  
  40.         List<Person> list = dao.findPerson();  
  41.         for(Person person : list){  
  42.             System.out.println(person);  
  43.         }  
  44.     }  
  45.   
  46.     @Test  
  47.     public void testUpdatePerson() {  
  48.         Person person = dao.findPerson(9);  
  49.         System.out.println("用find找出来,改前的数据为::"+person);  
  50.         person.setName("改后的名");  
  51.         dao.updatePerson(person);  
  52.         person = dao.findPerson(9);  
  53.         System.out.println("用find找出来,修改后的数据为::"+person);  
  54.     }  
  55.   
  56.     @Test  
  57.     public void testDeletePerson() {  
  58.         Person person = dao.findPerson(9);  
  59.         System.out.println(person);  
  60.         dao.deletePerson(9);  
  61.         person = dao.findPerson(9);  
  62.         System.out.println(person);  
  63.     }  
  64.   
  65. }  


测试结果一切OK,全部绿条,查看数据库有相关记录。

0 0
原创粉丝点击