MyBatis【MyBatis】MyBatis之如何安排

1,MyBatis简介

MyBatis 是支持一般 SQL查询,存储过程和高级映射的理想持久层框架。MyBatis
消除了几有的JDBC代码和参数的手工安装以及结果集的觅。MyBatis
使用简便的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain
Ordinary Java Objects,普通的 Java对象)映射成数据库中之笔录。

2,搭建MyBatis框架

率先就是导入MyBatis.jar的jar包,然后拿jar包和数据库连接的包放置到路的lib目录下。笔者这里用的是Oracle数据库。

色结构图如下:

MyBatis 1

点就张图纸是总体项目结构,下面开始起文件。

sqlmap-config.xml文件:

MyBatis 2MyBatis 3

<?xml version="1.0" encoding="UTF-8" ?>  <!DOCTYPE configuration             PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"            "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
    <!--引入数据库信息文件-->
    <properties resource="db.properties" />

    <environments default="environment">
        <environment id="environment">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${driverClassName}" />
                <property name="url" value="${url}"/>
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>
    <!-- 加载SQL定义文件 -->
    <mappers>
        <mapper resource="cn/test/sql/DeptMapper.xml" />
    </mappers>
</configuration> 

sqlmap-config.xml

DeptMapper.xml文件:

MyBatis 4MyBatis 5

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"      
 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="cn.test.mapper.DeptMapper">

    <!-- 查询操作-->
    <select id="findAll" resultType="cn.test.entity.Dept">
        select * from DEPT
    </select>
    <select id="findById" resultType="cn.test.entity.Dept" parameterType="int">
        select * from DEPT where DEPTNO=#{no}
    </select>

    <!--增加操作-->
    <insert id="save" parameterType="cn.test.entity.Dept">
        <!--#{deptno},#{dname},#{loc} 对应着Dept类中变量名称-->
        insert into DEPT(DEPTNO,DNAME,LOC) values (#{deptno},#{dname},#{loc})
    </insert>

    <!--修改操作-->
    <update id="upadteNameByNo" parameterType="java.util.Map">
        <!--在map集合中,必需存在两个key,分别为name和no-->
        update DEPT set dname=#{name} where deptno=#{no}
    </update>
    <update id="update" parameterType="cn.test.entity.Dept">
        update DEPT set DNAME=#{dname},LOC=#{loc} where DEPTNO=#{deptno}
    </update>

    <!-- 如果parameterType为单个值,#{标识符}表达式标识符没有约定 -->
    <delete id="delete" parameterType="int">
        delete from DEPT where DEPTNO=#{id}
    </delete>
</mapper>

DeptMapper.xml

当文书中我们看见 #{deptno}
的代码,表示Dept类实例中的deptno变量。这里除了写成 #{deptno} 还好写成 ${deptno}
。两者的区分就是是#于底部是用SQL语句预编译插入参数的,$在脚是使拼接SQL语句插入参数的。

db.properties文件:

MyBatis 6MyBatis 7

driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
password=517839
username=system

db.properties

Dept.java文件:

MyBatis 8MyBatis 9

package cn.test.entity;

import java.io.Serializable;

import org.apache.ibatis.type.Alias;

public class Dept implements Serializable{

    private int deptno;
    private String dname;
    private String loc;

    public int getDeptno() {
        return deptno;
    }
    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }
    public String getDname() {
        return dname;
    }
    public void setDname(String dname) {
        this.dname = dname;
    }
    public String getLoc() {
        return loc;
    }
    public void setLoc(String loc) {
        this.loc = loc;
    }
    @Override
    public String toString() {
        return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc + "]";
    }
}

Dept.java

该实体类的树,其中实体类的变量名称必须和数据库中表的字段名称一致,否则通过反射就无能够与上是的价。还有一个稍细节,如果数据库被针对应表的字段类型也NUMBER,那么在实业类中最好好声明也Integer类,而非是着力数据列int,不过当下无意伤大雅,因为起JDK1.5开支持了自动装箱和电动拆箱了。

笔者之数据库中Dept表结构如下:

MyBatis 10

 

DeptMapper.java文件:

MyBatis 11MyBatis 12

package cn.test.mapper;

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

import cn.test.entity.Dept;
/**
*  方法定义参考 SQL 定义的 id 、 parameterType 、 resultType 属性
* @author Administrator
* 1. 方法名与 id 属性一致
* 2. 参数类型与 parameterType 属性一致
* 3. 返回结果:多行查询 List<resultType> ;单行查询 resultType ;增删改为 void 或 int
* 4.SQL 定义文件中 namespace="cn.test.mapper.DeptMapper"
*/
public interface DeptMapper {

    public List<Dept> findAll();

    public Dept findById(int id);

    public int save(Dept dept);

    public int update(Dept dept);

    public int delete(int id);

    public int upadteNameByNo(Map map);
}

DeptMapper.java

欠接口中有所办法,都须跟DeptMapper.xml中布局的语方法相呼应。语法为id对应方法名,resultType对应返回值类型(如果生多独结果,可以添加List集合),parameterType为参数类型。比如DeptMapper.xml文件被的:

    <select id="findById" resultType="cn.test.entity.Dept" parameterType="int">
        select * from DEPT where DEPTNO=#{no}
    </select>

相应于DeptMapper.java中对应一个主意:

public Dept findById(int id);

MyBatisUtil.java文件:

MyBatis 13MyBatis 14

package cn.test.util;

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;

public class MyBatisUtil {

    public static SqlSession getSession() throws IOException{
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        Reader reader = Resources.getResourceAsReader("sqlmap-config.xml");
        SqlSessionFactory factory = builder.build(reader);
        SqlSession session = factory.openSession();
        return session;
    }
}

MyBatisUtil.java

这是一个简易的家伙类,该工具用于简化SqlSession对象的得。

MyBatisTest.java文件:

MyBatis 15MyBatis 16

package cn.test.test;

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

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

import cn.test.entity.Dept;
import cn.test.mapper.DeptMapper;
import cn.test.util.MyBatisUtil;

public class MyBatisTest {

    @Test
    public void testName1() throws Exception {
          SqlSession session = MyBatisUtil.getSession();
          DeptMapper deptDao=session.getMapper(DeptMapper.class);
          Map map=new HashMap();
          map.put("name", "'goslings'");
          map.put("no",40);

          //通过编号更新部门名称
          deptDao.upadteNameByNo(map);

          //查询所有信息
           List<Dept> list=deptDao.findAll();
           for(Dept d:list){
               System.out.println(d);
           }
           //提交事务,mybatis默认不提交
          session.commit();
          session.close();
    }
}

MyBatisTest.java

MyBatis提交事务默认是关的,也就是索要手动提交, session.commit();
。可以开展有装,使得Mybatis自动提交业务。

这么了,一个简单易行的MyBatis框架就增加建筑好了。

 

网站地图xml地图