MyBatis入门实例

MyBatis入门实例

一、概述

        MyBatis是一个优秀的持久层框架,ORM框架,可以使用XML配置文件或者接口加注解的方式来简化DAO操作,大大方便了SQL语句的管理。同时,MyBatis还支持动态SQL语句。由于注解的功能极为有限,这里采用XML配置文件的方式。

二、创建数据库和数据表

        在MySQL创建数据库和数据表:

CREATE DATABASE test;
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `sex` char(1) NOT NULL,
  `age` int(11) DEFAULT NULL,
  `birthday` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

三、在IDEA创建Maven项目

        参考http://blog.youkuaiyun.com/ac_dao_di/article/details/54233520,最后在pom.xml添加MyBatis和MySQL依赖的jar包:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.baobao</groupId>
  <artifactId>javaee_idea</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>javaee_idea Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.1</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>RELEASE</version>
      <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>6.0.5</version>
    </dependency>

  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <!-- 注意此处的url,上传javaee_idea.war到url,此时本地的tomcat服务器必须开启 -->
          <url>http://localhost:8080/manager/text</url>
          <!-- 此处的名字必须和setting.xml中配置的ID一致,而该id对应的用户必须在tomcat的conf/tomcat-users.xml有配置-->
          <server>tomcat8</server>
          <!-- 此处的名字是项目发布的工程名 : http://localhost:8080/javaee_idea,也是war名-->
          <path>/javaee_idea</path>
        </configuration>
      </plugin>
    </plugins>
    <finalName>javaee_idea</finalName>
  </build>
</project>

四、创建持久层类

4.1 创建JavaBean

        对应上面的数据库表student新建一个JavaBean: src/main/java/com.baobao.Student:

package com.baobao;

import java.util.Date;

/**
 * Created by gzx on 17-1-8.
 */
public class Student {
    private int id;
    private String name;

    private Date birthday;
    private String sex;
    private int 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 Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }
}

4.2 创建MyBatis核心配置文件

        在main/resources/下建立MyBatis的配置文件mybatis.xml,文件名可以任意取。这个文件主要是配置数据库的驱动信息和连接信息,以及配置好类的类型别名,所有JavaBean的Mapper文件路径。

<?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>
    <!-- 类名比较长,起别名,在Mapper文件中可以使用-->
    <typeAliases>
        <typeAlias type="com.baobao.Student" alias="Student"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <!-- 事务管理类型,JDBC表示直接使用JDBC的提交和回滚设置,依赖于数据源得到的连接来管理事务 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池POOLED表示使用数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/test" />
                <property name="username" value="root" />
                <property name="password" value="201314" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!-- SQL代码和映射信息配置文件 -->
        <mapper resource="com/baobao/studentMapper.xml" />
    </mappers>
</configuration>

4.3 创建Mapper文件,实现DAO

        在main/resources/下建立上面mybatis.xml文件里的Mapper文件:com/baobao/studentMapper.xml。对于每个JavaBean,都可以写一个对应的Mapper文件。这个文件封装了数据表和JavaBean的映射关系,对该数据表的操作,主要是增删改查。

<?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">
<!-- namespace必须是唯一的,建议用该文件所在的包路径全类名 -->
<mapper namespace="com.baobao.studentMapper">
    <!-- id是主键,result是其他属性,完成JavaBean和数据库表字段的映射-->
    <!-- 当名字不对应时,需要完成映射-->
    <!--
    <resultMap type="Student" id="studentResultMap">
        <id column="id" jdbcType="int" property="id" javaType="int"/>
        <result column="name" jdbcType="varchar" property="name" javaType="String"/>
        <result column="sex" jdbcType="char" property="sex" javaType="String"/>
        <result column="age" jdbcType="int" property="age" javaType="int"/>
        <result column="birthday" jdbcType="Date" property="birthday" javaType="Date"/>
    </resultMap>
-->
    <!-- DAO 操作 -->
    <!-- #{} 表示一个属性getId(),注意parameterType只能是Map或者基本类型或者自定义类,不能有多个parameterType-->
    <select id="getStudentById" parameterType="int" resultType="Student">
        <!-- #{id}:表示占位符,也就是调用时必须为其传一个id参数进来,注意是#不是$ -->
        select * from student where id = #{id}
    </select>

    <!-- 输入字符串参数 -->
    <select id="getStudentByName" parameterType="String" resultType="Student">
        <!-- #{id}:表示占位符,也就是调用时必须为其传一个id参数进来,注意是#不是$ -->
        select * from student where name = #{name}
    </select>

    <!-- 指定ID为主键,并自动生成主键 -->
    <insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyProperty="id">
        insert into student(name, sex, age, birthday) values(#{name}, #{sex}, #{age}, #{birthday})
    </insert>

    <!-- 输入Student参数-->
    <update id="updateStudent" parameterType="Student">
        update student set name=#{name}, sex=#{sex},age=#{age},birthday=#{birthday} where id=#{id}
    </update>

    <delete id="deleteStudent" parameterType="int">
        delete from student where id=#{id}
    </delete>
</mapper>

五、使用MyBatis API

5.1 创建获取SqlSessionFactory单例的工厂类

        在src/main/java/下创建一个工厂类com.baobao.Factory,使得全局只用一个实例SqlSessionFactory。

package com.baobao;

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

import java.io.IOException;
import java.io.InputStream;

public class Factory{
    private static SqlSessionFactory sqlSessionFactory;
    static{
        // 1. 加载MyBatis的配置文件:mybatis.xml(它也加载关联的映射文件,也就是mappers结点下的映射文件)
        InputStream in = Factory.class.getClassLoader().getResourceAsStream("mybatis.xml");
        assert(in != null);
        // 2. SqlSessionFactoryBuidler实例将通过输入流调用build方法来构建 SqlSession 工厂
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 整个应用只用一个单例的factory
     * @return
     */
    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }
}

5.2 创建单元测试类

        创建test/java/com.baobao.TestMybatis,实现对Student数据表操作的测试。这里主要是使用MyBatis的API:通过加载MyBatis的配置文件,实现对数据表的增删改查。

package com.baobao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import java.util.Calendar;
import java.util.List;

public class TestMybatis {
    @Test
    public void testGetStudent(){
        System.out.println(".............................getStudent.............................");
        // 获取工厂
        SqlSessionFactory sqlSessionFactory = Factory.getSqlSessionFactory();
        // 通过工厂获取 SqlSession 实例,SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
        SqlSession session = sqlSessionFactory.openSession();

        System.out.println("one...");
        // 通过namespace.id定位SQL语句
        String statement = "com.baobao.studentMapper.getStudentById";
        // select API : 获取一条记录
        Student student = session.selectOne(statement, 3);
        System.out.println(student);

        System.out.println("list...");
        statement = "com.baobao.studentMapper.getStudentByName";
        String name = "Tom";
        // select API : 获取一个list
        List<Student> list = session.selectList(statement, name);
        for(Student tmp : list){
            System.out.println(tmp);
        }
        // 关闭输入流和SqlSession实例。SqlSession当场销毁
        session.close();
    }

    @Test
    public void testInsertStudent(){
        System.out.println(".............................insertStudent.............................");
        SqlSessionFactory sqlSessionFactory = Factory.getSqlSessionFactory();
        SqlSession session = sqlSessionFactory.openSession();

        Student student = new Student();
        student.setName("Tom");
        student.setAge(27);
        student.setSex("m");
        Calendar calendar = Calendar.getInstance();
        //calendar.set(1995, 8, 20, 11, 23, 47);
        student.setBirthday(calendar.getTime());
        // insert API
        int cnt = session.insert("com.baobao.studentMapper.insertStudent", student);
        assert(cnt == 1);
        // 事务必须提交,否则不起作用
        session.commit();
        session.close();
    }

    @Test
    public void testDeleteStudent(){
        System.out.println(".............................deleteStudent.............................");
        SqlSessionFactory sqlSessionFactory = Factory.getSqlSessionFactory();
        SqlSession session = sqlSessionFactory.openSession();
        // delete API
        session.delete("com.baobao.studentMapper.deleteStudent", 2);
        session.commit();
        session.close();
    }

    @Test
    public void testUpdateStudent(){
        System.out.println(".............................updateStudent.............................");
        SqlSessionFactory sqlSessionFactory = Factory.getSqlSessionFactory();
        SqlSession session = sqlSessionFactory.openSession();
        Student student = new Student();
        student.setId(3);
        student.setName("Amy");
        student.setAge(20);
        student.setSex("F");
        Calendar calendar = Calendar.getInstance();
        // calendar.set(1997, 2, 20);
        student.setBirthday(calendar.getTime());
        // System.out.println(calendar.getTime());
        // update API
        int cnt = session.update("com.baobao.studentMapper.updateStudent", student);
        session.commit();
        session.close();
    }
}

        最后直接在IDEA运行测试,或者在根目录下运行mvn clean test。测试通过。

项目的目录结构如下:

本项目的源码下载 : http://download.youkuaiyun.com/download/ac_dao_di/9732835

参考:
http://www.cnblogs.com/bluejoe/p/5115930.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值