mybatis入门教程(一)

1.   MyBatis是什么?

       MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)



2. MyBatis  quick start



2.1 如何获取MyBatis的支持


      如果你还在用传统的方式开发程序那么你需要到mybatis官网上下载对应的jar包,对应官方网址为:http://blog.mybatis.org/

      如果你是在使用maven管理你得项目,那么恭喜你,下面我们的例子就是使用maven构建项目。

     在你的项目的pom.xml中添加dependency:


 

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>
    <dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.2.6</version>
	</dependency>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.30</version>
	</dependency>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.17</version>
	</dependency>



2.2 MyBatis的simple CURD


首先我们需要建立一个数据库,创建测试表:


 

drop database bbs;
create database bbs character set utf8;
use bbs;
/*alter database bbs character set utf8;*/s
/*
	Posts  发的帖子信息
      Post_id  帖子的id   int 
      Post_Title 帖子的标题  nvarchar
      Post_BiBoid 帖子所属父版块id   int
      Post_SmBoid 帖子所属子版块id  int
      Post_admin  发帖者姓名  nvarchar
      Post_createtime 发帖时间  datetime
      Post_updatetime      更新时间  datetime
      Post_content 帖子内容  nvarchar
      Post_goodcount 帖子的好评数  int 
      Post_badcount 帖子的坏评数  int 
      Post_reward 帖子的总共悬赏分(吸引浏览)  int 
      Post_score 帖子悬赏分所剩下的分数  int 
      Post_ispay  是否结贴  bit
      Post_islocked  是否帖子被锁定  bit
*/

drop table posts;
create table posts(
	id int primary key auto_increment,
	title varchar(100),
	biboid int,
	smboid int,
	admin  varchar(50),
	createtime  datetime,
	updatetime  datetime,
	context text,
	goodcount int,
	badcount int,
	reward int,
	score int,
	ispay bit,
	islocked bit
)ENGINE=InnoDB DEFAULT CHARSET=utf8;


新建一个MyBatis的主配置文件:mybatis-config.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> 
    <settings> 
        <!-- changes from the defaults for testing --> 
        <setting name="cacheEnabled" value="false" /> 
        <setting name="useGeneratedKeys" value="true" /> 
        <setting name="defaultExecutorType" value="REUSE" /> 
    </settings> 
    <typeAliases> 
    	   <!-- 实体类的别名 -->
       <typeAlias alias="Posts" type="com.mscncn.batis.model.Posts"/> 
    </typeAliases> 
    <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://127.0.0.1:3306/bbs"/> 
              <property name="username" value="pwpw1218"/> 
              <property name="password" value="pwpw1218"/> 
           </dataSource> 
       </environment> 
    </environments> 
    <mappers> 
        <mapper resource="com/mscncn/batis/mapper/config/PostsMapper.xml" /> 
    </mappers> 
</configuration>



新建一个model类:Posts


 

package com.mscncn.batis.model;

import java.sql.Date;

/**
 * 发的帖子信息
 * @author king-pan
 * @version 1.0 
 *  
 */
public class Posts {
	private int id;
	private String title;
	private int biboid;
	private int smboid;
	private Date createTime;
	private Date updateTime;
	private String context;

	private int goodCount;
	private int badCount;
	private int reward;
	private int score;
	private boolean isPay;
	private boolean isLocked;//自己提供getter,setter方法
	
	public Posts(){}
	
	public Posts(String title,String context){
		this.title=title;
		this.context=context;
	}
	public Posts(int id,String title,String context){
		this.id=id;
		this.title=title;
		this.context=context;
	}
		
}



新建一个PostMapper.java 定义对Posts表操作的接口:

package com.mscncn.batis.mapper;

import java.util.List;
import java.util.Map;

import com.mscncn.batis.model.Pager;
import com.mscncn.batis.model.Posts;

public interface PostsMapper{
	public void addPosts(Posts posts);
	public Posts getPostsById(int id);
	public Posts getPostsByTitle(String title);
	public void updatePosts(Posts posts);
	public void deletePosts(int id);
	public void batchUpdate(List<Posts> list);
	public List<Posts> getList();
	public List<Posts> getListByPage(Pager pager);
	public Posts getByParams(Posts posts);
	
	public Posts getByChoose(Posts post);
	
	public Posts trimTest(Posts posts);
	
	public void update(Posts post);
	
	public void updateArray(int[]ary);
	
	public Posts getByMap(Map<String,Object> map);
}

 

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="com.mscncn.batis.mapper.PostsMapper"> 
<!-- 这里namespace必须是PostsMapper接口的路径,不然要运行的时候要报错 “is not known to the MapperRegistry”--> 
    <insert id="addPosts" parameterType="Posts"> 
       insert into posts(title,context) values(#{title},#{context}) 
       <!-- 这里sql结尾不能加分号,否则报“ORA-00911”的错误 --> 
    </insert> 
 
    <!-- 这里的id必须和PostsMapper接口中的接口方法名相同,不然运行的时候也要报错 --> 
    <select id="getPostsById" resultType="Posts" parameterType="int"> 
        select * from posts where id=#{id} 
    </select> 
   <select id="getPostsByTitle" resultType="Posts" parameterType="java.lang.String"> 
        select * from posts where title like #{title} 
   </select> 
   <!-- 如果方法没有参数,那么就不需要parameterType -->
   <select id="getList" resultMap="postList">
   		select * from posts
   </select>
   <update id="updatePosts" parameterType="Posts">
   		update posts set context=#{context} where id=#{id}
   </update>
   <delete id="deletePosts" parameterType="int">
   		<![CDATA[
   			delete from posts where id=#{id}
   		]]>
   </delete>
   <update id="batchUpdate" parameterType="java.util.List">
   		update posts set  badcount=3,goodcount=5 where id in
   		<foreach collection="list" item="item" open="(" close=")" index="index" separator=",">
   		     	 #{item.id}
   		</foreach>
   </update>
   <resultMap type="Posts" id="postList">
   		<id column="id" property="id"/>
   		<result column="title" property="title" />
   		<result column="context" property="context" />
   		
   </resultMap>
</mapper>


MyBatisUtil代码如下:

 

package com.mscncn.batis.util;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtil  { 
    private  final static SqlSessionFactory sqlSessionFactory; 
    static { 
       String resource = "mybatis-config.xml"; 
       Reader reader = null; 
       try { 
           reader = Resources.getResourceAsReader(resource);
           
       } catch (IOException e) { 
           System.out.println(e.getMessage()); 
           e.printStackTrace();
       } 
       sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 
    } 
    
    public static SqlSessionFactory getSqlSessionFactory() { 
       return sqlSessionFactory; 
    } 
}


测试代码如下:

package com.mscncn.batis;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import com.mscncn.batis.mapper.PostsMapper;
import com.mscncn.batis.model.Posts;
import com.mscncn.batis.util.MyBatisUtil;

public class PostsMapperTest {
static SqlSessionFactory sqlSessionFactory = null; 
    static { 
       sqlSessionFactory = MyBatisUtil.getSqlSessionFactory(); 
    } 
    
    @Test 
    public void testAdd() { 
       SqlSession sqlSession = sqlSessionFactory.openSession(); 
       try { 
           PostsMapper mapper = sqlSession.getMapper(PostsMapper.class); 
           Posts posts=new Posts("Spring test", "这是一个mybatis测试");
           mapper.addPosts(posts);
           sqlSession.commit();//这里一定要提交,不然数据进不去数据库中 
       } finally { 
           sqlSession.close(); 
       } 
    } 
    
    @Test
    public void getUser() { 
       SqlSession sqlSession = sqlSessionFactory.openSession(); 
       try { 
    	  PostsMapper mapper = sqlSession.getMapper(PostsMapper.class); 
    	  Posts posts=mapper.getPostsById(1);
    	  System.out.println(posts.getContext());
       } finally { 
           sqlSession.close(); 
       } 
    } 
    
    @Test
    public void getUserByTitle() { 
       SqlSession sqlSession = sqlSessionFactory.openSession(); 
       try { 
    	  PostsMapper mapper = sqlSession.getMapper(PostsMapper.class); 
    	  Posts posts=mapper.getPostsByTitle("Spring test");
    	  System.out.println(posts.getContext());
       } catch(Exception e){
    	  e.printStackTrace();
       }
       finally { 
           sqlSession.close(); 
       } 
    } 
    
    @Test
    public void getListTest() { 
       SqlSession sqlSession = sqlSessionFactory.openSession(); 
       try { 
    	  PostsMapper mapper = sqlSession.getMapper(PostsMapper.class); 
    	  List<Posts> posts=mapper.getList();
    	  System.out.println(posts.size());
    	  System.out.println(posts.get(0).getId());
    	  System.out.println(posts.get(1).getContext());
       } catch(Exception e){
    	  e.printStackTrace();
       }
       finally { 
           sqlSession.close(); 
       } 
    } 
    
    @Test
    public void updatePostsTest() { 
       SqlSession sqlSession = sqlSessionFactory.openSession(); 
       try { 
    	  PostsMapper mapper = sqlSession.getMapper(PostsMapper.class); 
    	  Posts posts=new Posts(1, "22", "mybatis 跟新数据库操作");
    	  mapper.updatePosts(posts);
    	  sqlSession.commit();
       } catch(Exception e){
    	  e.printStackTrace();
       }
       finally { 
           sqlSession.close(); 
       } 
    } 
    
    @Test
    public void deletePostsTest() { 
       SqlSession sqlSession = sqlSessionFactory.openSession(); 
       try { 
    	  PostsMapper mapper = sqlSession.getMapper(PostsMapper.class); 
    	  mapper.deletePosts(3);
    	  sqlSession.commit();
       } catch(Exception e){
    	  e.printStackTrace();
       }
       finally { 
           sqlSession.close(); 
       } 
    } 
    @Test
    public void batchTest(){
    SqlSession sqlSession = sqlSessionFactory.openSession(); 
       try { 
    	  PostsMapper mapper = sqlSession.getMapper(PostsMapper.class); 
    	  List<Posts> list=mapper.getList();
    	  int index=0;
    	  for(Posts ps:list){
    	  ps.setBadCount(++index);
    	  ps.setGoodCount(index);
    	  }
    	  mapper.batchUpdate(list);
    	  sqlSession.commit();
       } catch(Exception e){
    	  e.printStackTrace();
       }
       finally { 
           sqlSession.close(); 
       } 
    }
}


注意: 在maven中测试时,一定要记得把相应的配置文件拷贝到src/test/resources目录下,不然在使用MyBatis框架时一直抱错,错误信息如下:

MyBatis could not find resource …..

你可能感兴趣的:(mybatis,入门教程,mybatis入门教程,mybatis教程)