您的位置:首页 > 其它

mybatis入门教程 (一)

2014-04-29 10:11 281 查看
目录(?)[-]
mybatis实战教程mybatis in action之一开发环境搭建
mybatis实战教程mybatis in action之二以接口的方式编程
mybatis实战教程mybatis in action之三实现数据的增删改查
mybatis实战教程mybatis in action之四实现关联数据的查询
mybatis实战教程mybatis in action之五与spring3集成附源码
mybatis实战教程mybatis in action之六与Spring MVC 的集成
mybatis实战教程mybatis in action之七实现mybatis分页源码下载
mybatis实战教程mybatis in action之八mybatis 动态sql语句
mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用
mybatis SqlSessionDaoSupport的使用附代码下载

转自:http://www.yihaomen.com/article/java/302.htm

除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!

(读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单)

写在这个系列前面的话:
以前曾经用过ibatis,这是mybatis的前身,当时在做项目时,感觉很不错,比hibernate灵活。性能也比hibernate好。而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这个ORM工具。所以在此重新温习了一下 mybatis, 因此就有了这个系列的
mybatis 教程.

什么是mybatis

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

orm工具的基本思想

无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点:

1. 从配置文件(通常是XML配置文件中)得到 sessionfactory.

2. 由sessionfactory  产生 session

3. 在session 中完成对数据的增删改查和事务提交等.

4. 在用完之后关闭session 。

5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。


mybatis实战教程(mybatis in action)之一:开发环境搭建

mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包。这些软件工具均可以到各自的官方网站上下载。
首先建立一个名字为 MyBaits 的web project 

1. 现阶段,你可以直接建立java 工程,但一般都是开发web项目,这个系列教程最后也是web的,所以一开始就建立web工程。

2. 将 mybatis-3.2.0.jar,mysql-connector-java-5.1.22-bin.jar  
,log4j.jar 拷贝到 web工程的lib目录.

3. 创建mysql 测试数据库和用户表,注意,这里采用的是 utf-8 编码



创建用户表,并插入一条测试数据


 程序代码

Create TABLE `user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `userName` varchar(50) DEFAULT NULL,

  `userAge` int(11) DEFAULT NULL,

  `userAddress` varchar(200) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

Insert INTO `user` VALUES ('1', 'summer', '100', 'shanghai,pudong');

到此为止,前期准备工作就完成了。下面开始真正配置mybatis项目了。
1. 在MyBatis 里面创建两个源码目录,分别为 src_user,test_src, 用如下方式建立,鼠标右键点击 JavaResource.



2. 设置mybatis 配置文件:Configuration.xml, 在src_user目录下建立此文件,内容如下:


 程序代码

< ?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> 

        <typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/> 

    </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/mybatis" />

            <property name="username" value="root"/>

            <property name="password" value="password"/>

            </dataSource>

        </environment>

    </environments>

    

    <mappers>

        <mapper resource="com/yihaomen/mybatis/model/User.xml"/>

    </mappers>

< /configuration>

3. 建立与数据库对应的 java class,以及映射文件.
在src_user下建立package:com.yihaomen.mybatis.model ,并在这个 package 下建立 User 类:


 程序代码

package com.yihaomen.mybatis.model;

public class User {

    

    private int id;

    private String userName;

    private String userAge;

    private String userAddress;

    

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getUserName() {

        return userName;

    }

    public void setUserName(String userName) {

        this.userName = userName;

    }

    public String getUserAge() {

        return userAge;

    }

    public void setUserAge(String userAge) {

        this.userAge = userAge;

    }

    public String getUserAddress() {

        return userAddress;

    }

    public void setUserAddress(String userAddress) {

        this.userAddress = userAddress;

    }

}

同时建立这个User 的映射文件 User.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">

< mapper namespace="com.yihaomen.mybatis.models.UserMapper">

    <select id="selectUserByID" parameterType="int" resultType="User">

        select * from `user` where id = #{id}

    </select>

< /mapper>

下面对这几个配置文件解释下:
1.Configuration.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 <typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/> 这个别名非常重要,你在 具体的类的映射中,比如User.xml 中 resultType
就是对应这里的。要保持一致,当然这里的 resultType 还有另外单独的定义方式,后面再说。
2.  Configuration.xml 里面 的<mapper resource="com/yihaomen/mybatis/model/User.xml"/>是包含要映射的类的xml配置文件。
3. 在User.xml 文件里面 主要是定义各种SQL 语句,以及这些语句的参数,以及要返回的类型等.

开始测试
在test_src 源码目录下建立com.yihaomen.test这个package,并建立测试类Test:


 程序代码

package com.yihaomen.test;

import java.io.Reader;

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 com.yihaomen.mybatis.model.User;

public class Test {

    private static SqlSessionFactory sqlSessionFactory;

    private static Reader reader; 

    static{

        try{

            reader    = Resources.getResourceAsReader("Configuration.xml");

            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

        }catch(Exception e){

            e.printStackTrace();

        }

    }

    public static SqlSessionFactory getSession(){

        return sqlSessionFactory;

    }

    

    public static void main(String[] args) {

        SqlSession session = sqlSessionFactory.openSession();

        try {

        User user = (User) session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID", 1);

        System.out.println(user.getUserAddress());

        System.out.println(user.getUserName());

        } finally {

        session.close();

        }

    }

}

现在运行这个程序,是不是得到查询结果了。恭喜你,环境搭建配置成功,接下来第二章,将讲述基于接口的操作方式,增删改查。
整个工程目录结构如下:




mybatis实战教程(mybatis in action)之二:以接口的方式编程

前面一章,已经搭建好了eclipse,mybatis,mysql的环境,并且实现了一个简单的查询。请注意,这种方式是用SqlSession实例来直接执行已映射的SQL语句:

session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID", 1)

其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细过程:

在src_user源码目录下建立 com.yihaomen.mybatis.inter 这个包,并建立接口类 IUserOperation , 内容如下:


 程序代码

package com.yihaomen.mybatis.inter;

import com.yihaomen.mybatis.model.User;

public interface IUserOperation {    

    public User selectUserByID(int id);

    

}

请注意,这里面有一个方法名 selectUserByID 必须与 User.xml 里面配置的 select 的id 对应(<select id="selectUserByID")
这种方式,要注意的一个地方就是。在User.xml  的配置文件中,mapper namespace="com.yihaomen.mybatis.inter.IUserOperation" ,命名空间非常重要,不能有错,必须与我们定义的package 和 接口一致。如果不一致就会出错,
重写测试代码



 程序代码

public static void main(String[] args) {

        SqlSession session = sqlSessionFactory.openSession();

        try {

            IUserOperation userOperation=session.getMapper(IUserOperation.class);

            User user = userOperation.selectUserByID(1);

            System.out.println(user.getUserAddress());

            System.out.println(user.getUserName());

        } finally {

            session.close();

        }

    }

整个工程结构图现在如下:



运行这个测试程序,就可以看到结果了。


mybatis实战教程(mybatis in action)之三:实现数据的增删改查

前面已经讲到用接口的方式编程。这种方式,要注意的一个地方就是。在User.xml  的配置文件中,mapper namespace="com.yihaomen.mybatis.inter.IUserOperation" ,命名空间非常重要,不能有错,必须与我们定义的package
和 接口一致。如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下事情:

1. 用 mybatis 查询数据,包括列表

2. 用 mybatis 增加数据

3. 用 mybatis 更新数据.

4. 用 mybatis 删除数据.

查询数据,前面已经讲过简单的,主要看查询出列表的

查询出列表,也就是返回list, 在我们这个例子中也就是 List<User> , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的


 程序代码

< !-- 为了返回list 类型而定义的returnMap -->

    <resultMap type="User" id="resultListUser">

        <id column="id" property="id" />

        <result column="userName" property="userName" />

        <result column="userAge" property="userAge" />

        <result column="userAddress" property="userAddress" />

    </resultMap>

查询列表的语句在 User.xml 中


 程序代码

< !-- 返回list 的select 语句,注意 resultMap 的值是指向前面定义好的 -->

    <select id="selectUsers" parameterType="string" resultMap="resultListUser">

        select * from user where userName like #{userName}

    </select>

在 IUserOperation 接口中增加方法:public List<User> selectUsers(String userName);    

现在在 Test 类中做测试


 程序代码

public void getUserList(String userName){

        SqlSession session = sqlSessionFactory.openSession();

        try {

            IUserOperation userOperation=session.getMapper(IUserOperation.class);          

            List<User> users = userOperation.selectUsers(userName);

            for(User user:users){

                System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAddress());

            }

            

        } finally {

            session.close();

        }

    }

现在在main  方法中可以测试:


 程序代码

public static void main(String[] args) {

        Test testUser=new Test();

        testUser.getUserList("%");

    }

可以看到,结果成功查询出来。如果是查询单个数据的话,用第二讲用过的方法就可以了。

用mybatis 增加数据 

在 IUserOperation 接口中增加方法:public void addUser(User user);

在 User.xml 中配置


 程序代码

< !--执行增加操作的SQL语句。id和parameterType  

       分别与IUserOperation接口中的addUser方法的名字和  

       参数类型一致。以#{name}的形式引用Student参数  

       的name属性,MyBatis将使用反射读取Student参数  

       的此属性。#{name}中name大小写敏感。引用其他  

       的gender等属性与此一致。seGeneratedKeys设置  

       为"true"表明要MyBatis获取由数据库自动生成的主  

       键;keyProperty="id"指定把获取到的主键值注入  

       到Student的id属性--> 

    <insert id="addUser" parameterType="User" 

        useGeneratedKeys="true" keyProperty="id"> 

        insert into user(userName,userAge,userAddress)  

             values(#{userName},#{userAge},#{userAddress})  

    </insert>

然后在 Test 中写测试方法:


 程序代码

/**

     * 测试增加,增加后,必须提交事务,否则不会写入到数据库.

     */

    public void addUser(){

        User user=new User();

        user.setUserAddress("人民广场");

        user.setUserName("飞鸟");

        user.setUserAge(80);

        SqlSession session = sqlSessionFactory.openSession();

        try {

            IUserOperation userOperation=session.getMapper(IUserOperation.class);

            userOperation.addUser(user);

            session.commit();

            System.out.println("当前增加的用户 id为:"+user.getId());

        } finally {

            session.close();

        }

    }

用mybatis 更新数据

方法类似,先在 IUserOperation 中增加方法:public void addUser(User user);

然后配置 User.xml 


 程序代码

<update id="updateUser" parameterType="User" >

        update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} where id=#{id}

    </update>

Test 类总的测试方法如下:


 程序代码

public void updateUser(){

        //先得到用户,然后修改,提交。

        SqlSession session = sqlSessionFactory.openSession();

        try {

            IUserOperation userOperation=session.getMapper(IUserOperation.class);

            User user = userOperation.selectUserByID(4);            

            user.setUserAddress("原来是魔都的浦东创新园区");

            userOperation.updateUser(user);

            session.commit();

            

        } finally {

            session.close();

        }

    }

用mybatis 删除数据 

同理,IUserOperation 增加方法:public void deleteUser(int id);

配置User.xml


 程序代码

<delete id="deleteUser" parameterType="int">

        delete from user where id=#{id}

    </delete>

然后在Test类中写测试方法:


 程序代码

    /**

     * 删除数据,删除一定要 commit.

     * @param id

     */

    public void deleteUser(int id){

        SqlSession session = sqlSessionFactory.openSession();

        try {

            IUserOperation userOperation=session.getMapper(IUserOperation.class);          

            userOperation.deleteUser(id);

            session.commit();            

        } finally {

            session.close();

        }

    }

这样,所有增删改查都完成了,注意在增加,更改,删除的时候要调用session.commit(),这样才会真正对数据库进行操作,否则是没有提交的。

到此为止,简单的单表操作,应该都会了,接下来的时间了,我会讲多表联合查询,以及结果集的选取。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: