1. MyBatis介绍及基本环境搭建

作者: 飞扬code | 来源:发表于2019-03-28 21:29 被阅读0次

    1.1 MyBatis介绍:

    MyBatis 世界上流行最广泛的基于SQL语句的ORM框架,由Clinton Begin 在2002 年创建,其后,捐献给了Apache基金会,成立了iBatis 项目。2010 年5 月,将代码库迁致Google Code,并更名为MyBatis。

    1.2 与Hibernate比较

    a. 学习成本:MyBatis简单易学(特别是有SQL语法基础的人),较接近JDBC
    b. 程序灵活性:MyBatis直接使用SQL,灵活性高
    c. 程序执行效律:MyBatis效律高
    d. 可移植性:hibernate较好(与数据库关联在配置中完成,HQL语句与数据库无关)

    1.3 适用场合

    MyBatis是一个灵活的DAO层解决方案,满足较高的性能要求,可以在很多场合使用,但一般以下场合不建议使用:

    • 需要支持多种数据库或数据库有移植要求
    • 完全动态SQL,例如:字段都要动态生成
    • 使用的不是关系型数据库

    1.4 开发步骤(推荐)

    新建JAVA项目或WEB项目
    部署jar包(包括数据库驱动包):使用MyBatis需要先下载jar包:下载地址http://code.google.com/p/mybatis
    编写主配置文件
    创建数据库及表(如已创建,可省略)
    创建实体类及SQL映射文件
    编写数据库接口及实现
    编写测试类及测试

    1.5 开发示例

    1.5.1 新建项目

    新建java项目或web 项目。

    1.5.2 导入JAR包

    导入mybatis和数据库驱动包、日志包。


    image.png

    1.5.3 创建数据库

    image.png
    drop database if exists mybatis;
    create database mybatis CHARACTER SET UTF8;
    use mybatis;
    create table dept(
        dept_id int primary key auto_increment,
        dept_name varchar(50),
        dept_address varchar(50)
    );
    insert into dept(dept_name,dept_address) values('研发部一部','北京');
    insert into dept(dept_name,dept_address) values('研发部二部','上海');
    insert into dept(dept_name,dept_address) values('研发部三部','广州');
    select * from dept;
    
    1.5.4 创建实体类:Dept.java
    package com.demo.entity;
    public class Dept {
        private Integer deptId; //部门编号
        private String deptName;//部门名称
        private String deptAddress;//部门地址
        public Integer getDeptId() {
             return deptId;
        }
        public void setDeptId(Integer deptId) {
             this.deptId = deptId;
        }
        public String getDeptName() {
             return deptName;
        }
        public void setDeptName(String deptName) {
             this.deptName = deptName;
        }
        public String getDeptAddress() {
             return deptAddress;
        }
        public void setDeptAddress(String deptAddress) {
             this.deptAddress = deptAddress;
        }
        @Override
        public String toString() {
             return "Dept [deptId=" + deptId + ", deptName=" + deptName
                     + ", deptAddress=" + deptAddress + "]";
        }   
    }
    
    1.5.5 创建config.xml

    在src下,创建mybatis配置文件,导入,可以参考mybatis用户手册


    image.png

    配置文件信息如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//[mybatis.org//DTD](http://mybatis.org//DTD) Config 3.0//EN"
    "[http://mybatis.org/dtd/mybatis-3-config.dtd](http://mybatis.org/dtd/mybatis-3-config.dtd)">
    <configuration>
        <!-- 引用db.properties配置文件 -->
        <properties resource="db.properties"/>
        <!--environments指定数据源环境,default指的是使用哪个数据源  -->
        <environments default="development">
             <!--environment定义数据源的信息  -->
             <environment id="development">
                 <!-- type="JDBC"表示事务由jdbc连接管理,type="MANAGED"表示事务由容器来管理 -->
                 <transactionManager type="JDBC" />
                 <!-- type="POOLED"表示使用连接池, type="UNPOOLED"表示不使用连接池 -->
                 <dataSource type="POOLED">
                     <property name="driver" value="com.mysql.jdbc.Driver" />
                     <!-- 如果数据库设置为UTF-8,则URL参数连接需要添加?useUnicode=true&amp;characterEncoding=UTF-8,如下 -->
                     <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8" />
                     <property name="username" value="root" />
                     <property name="password" value="" />
                 </dataSource>
             </environment>
        </environments>
    </configuration>
    

    写xml文件需要对一些字符进行转义:
    下面是五个在 XML 文档中预定义好的转义实体:

    &lt;     < 小于号
    &gt;     > 大于号
    &amp;   &
    &apos;   ' 单引号
    &quot;   " 双引号
    小于等于“<=”,其转义为:&lt;=
    大小等于“>=”,转义为:&gt;=
    
    使用 CDATA 部件

    CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束。在"<![CDATA["和"]]>"之间 的特殊字符的意义都不起作用,而转变为普通字符串内容。
    在 MyBatis 的 XML 映射语句配置文件中,如果 SQL 语句有特殊字符,使用CDTA 部件括起来,如:

    <select id= "selectBlog_use_collection" resultMap= "blogResult" >
        <![CDATA[ SELECT id , title, author_id as authored FROM BLOG WHERE ID > 0 and ID < 10 ]]> 
    </select>
    
    1.5.6 创建SQL映射文件及修改主配置文件
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//[mybatis.org//DTD](http://mybatis.org//DTD) Mapper 3.0//EN" "[http://mybatis.org/dtd/mybatis-3-mapper.dtd](http://mybatis.org/dtd/mybatis-3-mapper.dtd)">
    <!-- 命名空间可以任选命名,但最好要定义一定规则,便于后继的使用 -->
    <mapper namespace="com.demo.entity.DeptMapper">
        <!-- type指定的是对应的实体类 -->
        <resultMap type="com.demo.entity.Dept" id="deptResultMap">
             <!-- id用来配置表的主键与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
             <id column="dept_id" property="deptId"/>
             <!-- result用来配置 普通字段与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
             <result column="dept_name" property="deptName"/>
             <result column="dept_address" property="deptAddress"/>
        </resultMap>
    </mapper>
    修改config.xml,加入映射文件信息
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//[mybatis.org//DTD](http://mybatis.org//DTD) Config 3.0//EN"
    "[http://mybatis.org/dtd/mybatis-3-config.dtd](http://mybatis.org/dtd/mybatis-3-config.dtd)">
    <configuration>
       <environments default="development">
       …………    
       </environments>
       <mappers>
          <mapper resource="com/demo/mapping/DeptMapper.xml" />
       </mappers>
    </configuration>
    
    1.5.7 编写数据库操作

    包括操作接口及实现,接口略,实现类为:DeptDaoImpl.java

    package com.demo.dao.imp;
    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.demo.entity.Dept;
    public class DeptDaoImpl {
        /**
         * 用于插入数据到dept表。
         * @param dept 部门信息
         * @return 表示受影响的行数
         */
        public int insert(Dept dept){
             /*
              * 1.读取配置信息
              * 2.构建session工厂
              * 3.创建session
              * 4.启动事务(可选)
              * 5.数据处理
              * 6.提交事务、回滚事务(可选)
              * 7.关闭session 
              */      
             int i=0;
             SqlSession session = null;
             String config="config.xml";
            Reader reader = null;
             try {
                 reader = Resources.getResourceAsReader(config);
                 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
                 session=sqlSessionFactory.openSession();
                 //事务默认自动启动
                 //SQL映射文件定义的命名空间+SQL语句的ID定位SQL语句,例如下的:cn.itcast.entity.DeptMapper.insert
                 i=session.insert("com.demo.entity.DeptMapper.insert",dept);
                 session.commit();     
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
                 session.rollback();
             }finally{
    //关闭reader对象,这里略
                 session.close();
             }        
             return i;
        }
    }
    
    1.5.8 编写测试类

    需要导入junit包


    image.png image.png image.png

    在 DeptMapper.xml添加sql语句

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//[mybatis.org//DTD](http://mybatis.org//DTD) Mapper 3.0//EN" "[http://mybatis.org/dtd/mybatis-3-mapper.dtd](http://mybatis.org/dtd/mybatis-3-mapper.dtd)">
    <!-- 命名空间可以任选命名,但最好要定义一定规则,便于后继的使用 -->
    <mapper namespace="com.demo.entity.DeptMapper">
        <!-- type指定的是对应的实体类 -->
        <resultMap type="com.demo.entity.Dept" id="deptResultMap">
             <!-- id用来配置表的主键与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
             <id column="dept_id" property="deptId"/>
             <!-- result用来配置 普通字段与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
             <result column="dept_name" property="deptName"/>
             <result column="dept_address" property="deptAddress"/>
        </resultMap>
        <!-- 定义插入的sql语句,通过命名空间+id方式被定位 -->
        <insert id="insert" parameterType="com.demo.entity.Dept">
            insert into dept(dept_name,dept_address) values(#{deptName},#{deptAddress});
        </insert>
    </mapper>
    

    测试类,DeptTest.java

    package com.demo.test;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    import com.demo.dao.imp.DeptDaoImpl;
    import com.demo.entity.Dept;
    public class DeptTest {
        private static DeptDaoImpl deptDaoImpl;
        @BeforeClass
        public static void setUpBeforeClass() throws Exception {
             //在整个类初始化之后调用,一般用来做测试准备工作
             deptDaoImpl = new DeptDaoImpl();
        }
        @AfterClass
        public static void tearDownAfterClass() throws Exception {
             //在整个类结束之前调用,一般作测试的清理工作
             deptDaoImpl = null;
        }
        @Test
        public void test() {
             Dept dept=new Dept();
             dept.setDeptName("市场部");
             dept.setDeptAddress("沈阳");
             int i=deptDaoImpl.insert(dept);
             System.out.println("受影响行数:"+i);
        }
    }
    

    运行效果:


    image.png image.png

    相关文章

      网友评论

        本文标题:1. MyBatis介绍及基本环境搭建

        本文链接:https://www.haomeiwen.com/subject/frhhbqtx.html