浅谈MyBatis 之 入门(一)

MyBatis

什么是mybatis呢?它是一个优秀的对象关系映射持久层框架。

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

来源:http://www.mybatis.org/mybatis-3/zh/index.html


开发环境搭建

引入JAR包

采用maven方式引入jar包

    <!-- MyBatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.2.2</version>
    </dependency>

    <!-- Oracle 10g jdk 1.5 -->
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.3</version>
    </dependency>

如果需要使用junit测试,则还需引入:

    <!-- junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.9</version>
        <scope>test</scope>
    </dependency>

建数据库

-- Create table
create table BASE_55DEMO.DEMO_DEPT
(
  D_ID      NUMBER not null,
  D_NAME    VARCHAR2(50) not null,
  D_ADDRESS VARCHAR2(100)
)

插入数据
这里写图片描述


搭建项目工程

这里写图片描述


从XML中构建SqlSessionFactory


MyBatis配置文件

默认为Configuration.xml文件在classpath路径下

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>

    <properties resource="jdbc.properties" />

    <typeAliases>
        <typeAlias alias="Dept" type="com.wm.mybatis.POJO.Dept"/>
    </typeAliases>

    <environments default="development">
        <environment id="development" >
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mapper/Dept.xml" />
    </mappers>

</configuration>

1、如使用常量形式来定义数据库配置,则需引入配置:

<properties resource="jdbc.properties" />

就可以导入properties文件

2、使用typeAliases来配置别名,在配置文件下文就可以使用别名Dept,来代替全名称com.wm.mybatis.POJO.Dept,方便了、简化了配置文件。

<typeAliases>
        <typeAlias alias="Dept" type="com.wm.mybatis.POJO.Dept"/>
</typeAliases>

3、environment 元素体中包含了事务管理和连接池的配置。mappers 元素则是包含一组 mapper 映射器(这些 mapper 的 XML 文件包含了 SQL 代码和映射定义信息)。

4、jdbc.properties文件


jdbc.driverClass = oracle.jdbc.driver.OracleDriver

jdbc.url = jdbc:oracle:thin:@10.5.1.50:1521:cddev

jdbc.username = base_55demo

jdbc.password = crm_12345

transactionManager

type:

mybatis支持两种类型的事务管理器,jdbc和managed(托管)

jdbc:应用程序管理数据库连接的生命周期

managed:由应用服务器负责管理数据库连接的生命周期(一般商业服务器才有此功能,如JBOSS WebLogic)


dataSource

type:用来配置数据源,类型有:UNPOOLED、POOLED、JNDI

UNPOOLED:没有连接池,每次数据库操作,mybatis都会创建一个新的连接,用完后,关闭:适合小并发项目

POOLED:有连接池

JNDI:使用应用服务器配置JNDI数据源获取数据库连接


获取SqlSessionFactory

public class TestMyBatis {

    private Reader resource = null;
    private SqlSessionFactory sqlSessionFactory = null ;

    private SqlSession sqlSession = null ;

    @Before
    public void init(){

        try {

            resource = Resources.getResourceAsReader("MyBatis-config.xml");

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

            sqlSession = sqlSessionFactory.openSession();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

构建POJO

package com.wm.mybatis.POJO;

import java.util.List;


public class Dept {

    private int id ;
    private String name ;
    private String address ;

    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 String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

配置映射Mapping

POJO类与数据库表的映射文件mapping

dept.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.wm.mybatis.dao.IDeptMapperDao">

    <resultMap type="Dept" id="resultDept">
        <result property="id" column="d_id" />
        <result property="name" column="d_name" />
        <result property="address" column="d_address" />
    </resultMap>

    <select id="findById" parameterType="int" resultMap="resultDept">
        <![CDATA[
            select * from base_55demo.demo_mawei_dept t where t.d_id = #{id} 
        ]]>
    </select>

</mapper>

如果数据库字段与pojo类不一样,则可以定义resultMap,来匹配。

    <resultMap type="Dept" id="resultDept">
        <result property="id" column="d_id" />
        <result property="name" column="d_name" />
        <result property="address" column="d_address" />
    </resultMap>

result 中property为pojo类的属性,column为数据库的字段,要一一对应,如果有主键,则用id来对应。

自定义了resultMap,则下面返回类型resultMap就为上面自定义的map的Id。


测试

package com.wm.mybatis.Test;

import java.io.IOException;
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.wm.mybatis.POJO.Dept;

public class MainTest {

    public static void main(String[] args) throws IOException {

        Reader resource = null;
        SqlSessionFactory sqlSessionFactory = null ;

        SqlSession sqlSession = null ;

        try {

            resource = Resources.getResourceAsReader("MyBatis-config.xml");

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

            sqlSession = sqlSessionFactory.openSession();

            // 1、使用selectOne方式获取 mapper (命名空间+操作id,参数)
            Dept dept = (Dept)sqlSession.selectOne("com.wm.mybatis.dao.IDeptMapperDao.findById", 19);

            System.out.println(dept);   

        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            sqlSession.close();
        }


    }

}

结果
这里写图片描述


使用接口方式调用映射

首先定义一个DAO的接口,编写方法

package com.wm.mybatis.dao;

import com.wm.mybatis.POJO.Dept;

public interface IDeptMapperDao {


    public Dept findById(int id);   

}

相当于原先的DAO层

dept.xml映射文件mapping不变,但是是有限制的:

<mapper namespace="com.wm.mybatis.dao.IDeptMapperDao">

命名空间必须是接口的全类路径,并且select的ID必须是接口定义的方法名。

<select id="findById" parameterType="int" resultMap="resultDept">

测试方式

package com.wm.mybatis.Test;

import java.io.IOException;
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.wm.mybatis.POJO.Dept;
import com.wm.mybatis.dao.IDeptMapperDao;

public class MainTest {

    public static void main(String[] args) throws IOException {

        Reader resource = null;
        SqlSessionFactory sqlSessionFactory = null ;

        SqlSession sqlSession = null ;

        try {

            resource = Resources.getResourceAsReader("MyBatis-config.xml");

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

            sqlSession = sqlSessionFactory.openSession();

            // 2、获取接口层 接口类 getmapper 方式 --此方式 这mapper.xml文件中的命名空间要与接口路径一样
            IDeptMapperDao mapper = sqlSession.getMapper(IDeptMapperDao.class);
            Dept dept = mapper.findById(20);

            System.out.println(dept);

        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            sqlSession.close();
        }
    }
}

获取映射是通过接口方法来获取的。测试结果和上面一样的。
只是获取方式有selectOne变成getMapper了。

结果:
这里写图片描述

测试结果与数据库的数据一致。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天涯共明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值