首页 > 代码库 > MyBatis

MyBatis

一.MyBatis简介

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

二.MyBatis入门配门

    入门的几个基本注意点:

      1.因为映射资源文件中可能会出现多个数据库的操作,所以可以定义访问资源文件的父路径,<mapper namespace="定义父路径的名称">

        2.在测试类中,访问此映射资源文件,需要父路径.操作文件的id名

  因为项目在maven中完成,此处添加几点maven的配置详解

    

    1.将本地的Maven配置到myEclipse中-->window-->prefenerces-->MyEclipse-->Maven4MyEclipse-->Maven-->Installations-->选择本  地Maven路径下的路径

    2.配置成功

  1.创建web Project

  2.配置maven项目下的pom.xml(配置自动联网下载jar包)

    注(因为是连接数据库的操作,所以要导入连接数据的jar包)

    下载网址:maven.aliyun.com

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

 

  3.在src(可自定义包)下创建注mybatis.xml文件

  参考网址:http://mybatis.github.io/mybatis-3/zh/getting-started.html

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 说明mybatis的根节点 -->
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--mybatis的根标签configuration -->
<configuration>
    <!-- 资源文件的路径配置  注:cn前面不能用/否则会抛出异常-->
    <properties resource="cn/et/mybatis/lesson01/jdbc.properties">
    </properties>
    <!-- 配置连接数据库的环境,(开发环境) -->
  <environments default="development">
    <environment id="development">
    <!-- 事务交给jdbc管理,Conection(事务) commit(提交) rollback(回滚)  -->
      <transactionManager type="JDBC"/>
      <!-- 数据源 用来连接数据库(包含四要素,driver,url,username,password) -->
      <dataSource type="POOLED">
        <property name="driver" value=http://www.mamicode.com/"${driverClass}"/>
        <property name="url" value=http://www.mamicode.com/"${url}"/>
        <property name="username" value=http://www.mamicode.com/"${userAccount}"/>
        <property name="password" value=http://www.mamicode.com/"${password}"/>
      </dataSource>
    </environment>
  </environments>
  <!-- 包含隐射文件主要用于编写sql语句 -->
  <mappers>
      <!-- 隐射的资源文件  隐射文件主要编写sql语句 -->
    <mapper resource="cn/et/mybatis/lesson01/emp_mapper.xml"/>
    <!-- 此映射文件直接映射一个接口隐射下的资源文件 -->
    <mapper resource="cn/et/mybatis/lesson01/inter/dept_mapper.xml"/>
    <!-- 此映射文件直接映射一个接口,接口直接定义注解,无需定义资源映射文件 -->
    <mapper class="cn.et.mybatis.lesson01.inter.MassMapper"/>
  </mappers>
</configuration>

 

  4.在src(可定义包)创建测试文件

 

package cn.et.mybatis.lesson01;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

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

public class TestMybatis {
    public static void main(String[] args) throws IOException {
        //此处表示可从src下查找
        //String resource = "org/mybatis/example/mybatis-config.xml";
        SqlSession session = getSession();
        List<Map> list = session.selectList("helloworld.select");
        System.out.println(list.size());
    }
    //此处单独定义一个方法,因为所有的增删改查都会用到该方法,所以直接调用
    private static SqlSession getSession() {
        String resource="mybatis.xml";
        //InputStream inputStream = Resources.getResourceAsStream(resource);
        //我们可以通过反射来加载配置文件
        InputStream inputStream = TestMybatis.class.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //打开一个新的session对象,操作数据库的类就是SqlSession。
        SqlSession session = sqlSessionFactory.openSession();
        return session;
    }
//    @Test
    //修改的方法
    public void update(){
        //事物管理
        SqlSession session=getSession();
        //调用修改的方法
        session.update("updateEmp");
        //事物的提交
        session.commit();
    }
//    @Test
  //定义删除的方法
public void delete(){ SqlSession session = getSession(); session.delete("deleteEmp"); session.commit(); } @Test
  //定义插入的方法
public void insert(){ SqlSession session =getSession(); session.insert("insertEmp"); session.commit(); } }

  5.在src下(可自定义包)下创建映射资源文件

  

<?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">
  <!-- 此文件主要用于编写sql语句
      namespace是为了解决相同名字的sql操作问题
   -->
<mapper namespace="helloworld">
    <!-- id是唯一表示符,用来表示唯一的一条sql语句 
    resultType用于表示单行数据的数据类型,如数据库单行记录为map类型,所有类型可以指定map 也可是map的全路径名
    -->
  <select id="select" resultType="map">
      <!-- select为数据库的查询标签,注意查询语句结束后不能用分号结尾 -->
           select * from emp
  </select>
  <update id="updateEmp">
      update emp set sal=sal+1000 where ename=
  </update>
  <delete id="deleteEmp">
      delete from emp where ename=
  </delete>
  <insert id="insertEmp">
      insert into emp(ename,empno,sal)values(,(select max(empno)from emp)+1,1234)
  </insert>
</mapper>

  6.定义数据库连接的资源文件jdbd.properties(连接四要素)

url=jdbc:oracle:thin:@localhost:1521:orcl
driverClass=oracle.jdbc.OracleDriver
userAccount=scott
password=tiger

以上为MyBatis连接数据库操作的简单入门练习

 

  三.通过接口直接映射Sql

  接口映射的几个注意点:

    1.定义的接口名必须和映射文件的<mapper namespace="cn.et.mybatis.lesson01.inter.DeptMapper">namepace的文件名一致(namespace名为接口的全路径名)

        注意:数据库的返回值类型,resultType的返回值类型(可以是直接返回值得类型,也可以是返回值类型的全路径名)

    2. 接口内定义的方法名,必须和映射资源文件中的操作数据库标签的的id名一致,主要有一下几个标签(select<查询标签>,insert<插入标签>,delete<删除标签>,update<修改标签>)

    3.  在主xml文件中的mappers<标签中必须引入接口的全路径,(因为用到了接口映射,所以不需要再隐射资源文件的全路径)>

    4.在映射文件中的传参问题,可以在查询语句中通过#{0,1}的方式进行传参,若要自定义名称,则需要在接口的方法中定义注解@Param("自定义名"),那么在映射文件中则获取参数要使用自定的名字

 

1.创建测试类文件

  

package cn.et.mybatis.lesson01.inter;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

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

public class TestMybatis {
    //此处单独定义一个方法,因为所有的增删改查都会用到该方法,所以直接调用
    private static SqlSession getSession() {
        String resource="mybatis.xml";
        //InputStream inputStream = Resources.getResourceAsStream(resource);
        //我们可以通过反射来加载配置文件
        InputStream inputStream = cn.et.mybatis.lesson01.TestMybatis.class.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //打开一个新的session对象,操作数据库的类就是SqlSession。
        SqlSession session = sqlSessionFactory.openSession();
        return session;
    }
    public static void main(String[] args) throws IOException {
        SqlSession session = getSession();
        //通过动态代理 创建一个实现类  自动调用配置文件
         DeptMapper dm = session.getMapper(DeptMapper.class);
         List<Map> list = dm.selectEmp();
        System.out.println(list.size());
    }
    @Test
    public void mass(){
        SqlSession session = getSession();
        MassMapper mm = session.getMapper(MassMapper.class);
        List<Map> sm = mm.selectMass();
        System.out.println(sm.size());
    }
}    

 

  2.在src下(可自定义包)下创建映射资源文件(mass_mapper)

<?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">
  <!-- 此文件主要用于编写sql语句
      此处的namespace的路径为接口映射的接口路径的全路径    
   -->
<mapper namespace="cn.et.mybatis.lesson01.inter.DeptMapper">
    <!-- 
   select的id 必须接口的方法名一致
   resultType 和接口的返回值的泛型一致
  -->
  <select id="selectEmp" resultType="map">
      <!-- select为数据库的查询标签,注意查询语句结束后不能用分号结尾 -->
           select * from dept
  </select>
</mapper>

  3.创建mybatis文件(同上基础学习的3文件)

  4.定义接口

  

package cn.et.mybatis.lesson01.inter;

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

public interface DeptMapper {
//此处的方法名,必须和资源映射文件中的id名一样,否则会报错(
<select id="selectEmp" resultType="map">
public List<Map> selectEmp(); }

  四.通过接口直接映射Sql(通过注解)

  接口映射通过注解

    1.定义接口,定义接口内要操作数据库的方法,在方法上直接加对应注解(@Select(values="select * from mass"))    (@select<查询注解>,@insert<插入注解>,@delete<删除注解>,@update<修改注解>)

    2.定义主mybatis.xml文件,其中在<mappers>标签中添加注册的类<mapper class="cn.et.接口名"/>  注:此处若是注册的是文件,则是用cn/et/mybatis/dao/emp_mapper.xml  若注册的是个类文件,则使用cn.et.mybatis.dao.emp_mapper.xml

    3.定义测试类

    

1.定义接口

  

package cn.et.mybatis.lesson01.inter;

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

import org.apache.ibatis.annotations.Select;

public interface MassMapper {
    //此接口用注解实现
    @Select(value = http://www.mamicode.com/{ "select * from mass"})
    public List<Map> selectMass();
}

  2.定义mybatis.xml文件

  

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 说明mybatis的根节点 -->
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--mybatis的根标签configuration -->
<configuration>
    <!-- 资源文件的路径配置  注:cn前面不能用/否则会抛出异常-->
    <properties resource="cn/et/mybatis/lesson01/jdbc.properties">
    </properties>
    <!-- 配置连接数据库的环境,(开发环境) -->
  <environments default="development">
    <environment id="development">
    <!-- 事务交给jdbc管理,Conection(事务) commit(提交) rollback(回滚)  -->
      <transactionManager type="JDBC"/>
      <!-- 数据源 用来连接数据库(包含四要素,driver,url,username,password) -->
      <dataSource type="POOLED">
        <property name="driver" value=http://www.mamicode.com/"${driverClass}"/>
        <property name="url" value=http://www.mamicode.com/"${url}"/>
        <property name="username" value=http://www.mamicode.com/"${userAccount}"/>
        <property name="password" value=http://www.mamicode.com/"${password}"/>
      </dataSource>
    </environment>
  </environments>
  <!-- 包含隐射文件主要用于编写sql语句 -->
  <mappers>
      <!-- 隐射的资源文件  隐射文件主要编写sql语句 -->
    <!-- 此映射文件直接映射一个接口,接口直接定义注解,无需定义资源映射文件 -->
    <mapper class="cn.et.mybatis.lesson01.inter.MassMapper"/>
  </mappers>
</configuration>

  3.定义测试类

  

package cn.et.mybatis.lesson01.inter;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

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

public class TestMybatis {
    //此处单独定义一个方法,因为所有的增删改查都会用到该方法,所以直接调用
    private static SqlSession getSession() {
        String resource="mybatis.xml";
        //InputStream inputStream = Resources.getResourceAsStream(resource);
        //我们可以通过反射来加载配置文件
        InputStream inputStream = cn.et.mybatis.lesson01.TestMybatis.class.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //打开一个新的session对象,操作数据库的类就是SqlSession。
        SqlSession session = sqlSessionFactory.openSession();
        return session;
    }

    @Test
    public void mass(){
        SqlSession session = getSession();
        MassMapper mm = session.getMapper(MassMapper.class);
        List<Map> sm = mm.selectMass();
        System.out.println(sm.size());
    }
}    

 

MyBatis