返回现场笔记
3 分钟阅读

Hello Mybatis 01 第一个CRUD

从零开始搭建 Mybatis 环境,通过 User 表的增删改查示例,介绍 SqlSessionFactory、SqlSession 与 Mapper 的基本用法。

  • #java
  • #mybatis
  • #orm

What's the Mybatis?

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO).

自己使用mybatis有大半年了,相比较厚重的hibernate和其他orm框架,mybatis更加的灵活轻巧,可以更好的配合数据库和sql语句来开发项目。

这篇开始,我希望可以写一个关于mybatis的快速教程,除了mybatis,中间还会贯穿一些mysql的资料和mybatis与其他框架的配置,这个系列也算是自己这段时间对使用mybatis框架的一个总结。

环境搭建

我使用的环境有

mysql:mysql5.5.37

jdk:openjdk1.7

eclipse:java ee-Kepler Service Release 2

我们还需要在mysql数据库中建立一个名字叫做blog的schema,并建立一个user表

CREATE TABLE `blog`.`user` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `age` INT NULL,
  PRIMARY KEY (`id`));

还要记得给这个表加几条数据哟

INSERT INTO `blog`.`user` (`name`, `age`) VALUES ('Mybatis', '4');
INSERT INTO `blog`.`user` (`name`, `age`) VALUES ('struts2', '7');
INSERT INTO `blog`.`user` (`name`, `age`) VALUES ('hibernate', '13');

接着我们在eclipse中新建一个web项目。

将jdbc的驱动包mysql-connector-java-5.1.30-bin.jar放置到web-inf下的lib文件夹中去。

再到mybatis在github的主页上下载mybatis的jar包.

https://github.com/mybatis/mybatis-3/releases

我使用的版本是3.2.3(最新的版本是3.2.7)

当然,你也可以使用maven来管理mybatis的包,只需要在项目的pom.xml中添加.

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.2.3</version>
</dependency>

第一个CRUD

我们在pro.app下新建一个model包,新建一个user类与数据库相对应的vo类。

package pro.app.model;

public class User {
    private int id;
    private String name;
    private int age;
    public User(){}
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

在pro.app.inter下建立UserDAO接口,在这个接口中定义一个根据id找到User的方法selectOne()。

package pro.app.inter;
import org.apache.ibatis.annotations.Param;

import pro.app.model.User;

public interface UserDAO {
    public User selectOne(@Param("id")Integer id);
}

在pro.app.mapper下建立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">
<mapper namespace="pro.app.inter.UserDAO">
    <select id="selectOne" parameterType="int" resultType="User">
        select * from user where id = #{id,jdbcType=INTEGER}
    </select>
</mapper>

标签对来定义对应UserDAO中的selectOne()方法需要执行的sql语句。这也是mybatis的核心功能。

现在我们还需要在src源目录下放置一个Configuration.xml文件用于mybatis的配置。

<?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="pro.app.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://localhost:3306/blog?useUnicode=true&characterEncoding=utf-8"/>
                <property name="username" value="mybatis"/>
                <property name="password" value="mybatis"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper   resource="pro/app/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

在配置文件中通过定义现在的environment , 来指定目前的开发状态,用jdbc作为事务和连接池的配置与mysql数据库相链接。

在mappers下写入需要用到的mybatis 需要用到的mapper文件。

现在我们可以建立一个类测试mybatis是不是工作了,在pro.test下建立一个userTest类。

package pro.app.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 pro.app.inter.UserDAO;
import pro.app.model.User;

public class UserTest {
    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 {
            UserDAO userDao = session.getMapper(UserDAO.class);
            User user = userDao.selectOne(1);
            System.out.println("name : "+user.getName());
            System.out.println("age : "+user.getAge());
        } finally {
            session.close();
        }
    }
}

在这个程序中,我们通过io类库中的Reader类来读取mybatis的相关配置文件,并且使用mybatis里的 SqlSessionFactoryBuilder类构建一个SqlSessionFactory。

这个SqlSessionFactory就相当与mybatis配置文件的化生了,对应各种被操作的类而言,它就是整个项目中的上帝了,上帝不能老是出现吧,所以一般在一个项目中指挥有一个SqlSessionFactory出现。接着我们的程序又通过SqlSessionFactory来获得一个SqlSession,SqlSession 对象完全包含以数据库为背景的所有执行 SQL 操作的方法。通过这个SqlSession的实例化对象,可以获得UserDAO接口的一个实例,接下来就可以执行相应的方法了。

来运行这个程序啦,控制台输出了以下内容

name : mybatis
age : 4

bingo!我们如愿通过mybatis获得了数据库的数据。

接下来我们可以在UserDAO和UserMapper中添加其他的配置完成CRUD的任务。

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">
<mapper namespace="pro.app.inter.UserDAO">
    <select id="selectOne" parameterType="int" resultType="User">
        select * from user where id = #{id,jdbcType=INTEGER}
    </select>
    <insert id="insertOne" parameterType="User">
        insert into user (name,age)
        values(
            #{name,jdbcType=VARCHAR},
            #{age,jdbcType=INTEGER}
        )
    </insert>
    <delete id="deleteOne" parameterType="java.lang.Integer" >
        delete from user
        where id = #{id,jdbcType=INTEGER}
    </delete>
    <update id="updateOne" parameterType="User">
     update user
     set name=#{name,jdbcType=VARCHAR},
     age=#{age,jdbcType=INTEGER}
     where id= #{id,jdbcType=INTEGER}
   </update>
</mapper>

UserDAO.java

package pro.app.inter;
import org.apache.ibatis.annotations.Param;

import pro.app.model.User;

public interface UserDAO {
    public User selectOne(@Param("id")Integer id);

    public void insertOne(User user);

    public void deleteOne(@Param("id")Integer id);

    public void updateOne(User user);
}

和select方法一样,通过update,delete,insert标签分别对updateOne()、deleteOne(),insertOne()方法,并编写相应的接口方法来实现对应的CRUD任务。

总结

通过一个简单的CRUD例子熟悉mybatis的基本实现。