【MyBatis框架点滴】——初识+环境搭建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/51348346

  前段时间用几篇博客总结了一下Hibernate,下面再一起回顾总结一下另一套优秀的持久层框架——MyBatis。MyBatis的前身是iBatis,2010年改名为MyBatis~

  同样是持久层框架,MyBatis和Hibernate有什么区别呢?做为初学者的我,不敢妄加评论,网上找了一些大牛的解释:

  ● hibernate的优点在于对象化,处理复杂的业务逻辑什么的比较实用,但是应付大批量的查询跟修改性能可能会差一点,特别是不懂怎么使用hibernate的情况下。

  ● 普通查询用hibernate ,复杂级联用mybatis.

  ● hibernate更像是一部面向对象的机器,而Xbatis或者spring jdbc更像是一个SQL工具,对于复杂的需求(包括更高的性能要求),使用工具的好处是便于自己灵活的扩展(说白了就是想怎么写sql就怎么写sql),而使用机器的前提是你要能够熟练的配置和架构,而这一点学习曲线是很高的,因为hibernate不仅仅是insert update delete的替代品,它的三态和cache让它更像是server级产品。但是尽管hibernate软件思想更好,设计更OO,回到现实出于很多实际需求和环境的要求,使用xbatis和spring jdbc依然是更好的选择。

  ● 在维护方面,ibatIS也许只要改改sql xml文件,hibernate则需改动源代码程序

  还看到一位网友用了一个超经典的比喻来回答“Hibernate和MyBatis应该选哪个?”这个问题:Hibernate和MyBatis感觉就像自动挡和手动挡一样~看你要哪种快感了~

  小编比较喜欢的学习方式是先实战后理论,所以废话不再多说,大概了解MyBatis原理和Hibernate区别后,先来搭建个精简的框架,后续渐近深入~

  搭好的框架结构如下:


1、最基本的jar包:

  mybatis-3.3.0.jar(mybatis核心jar包)   ibatis-common-2.jar(这个jar包主要在mybatis加载配置文件的时候用)   mysql-connector-java-5.1.20-bin.jar(mysql驱动)

2、建立实体类

   User.java

public class User implements Serializable {
    private int id;
    private String username;
    private int sex;
    private Date birthday;
    private String address;
    //getter、setter省略
}

3、添加配置文件

  如上面的框架结构图(图1)中,User.xml是对应实体的配置文件(名字可以自定义,一般ibatis中都这么起名,mybatis习惯命名方式为 “***Mapper.xml”,这个后面到Mapper代理时再说。),这个配置文件中配置了所有对它对应实体的进行数据库操作的sql语句。如下例子中配置了对User的对象进行增删改查四个方法:

  namespace就是命名空间,相当于java中的包名,下面执行语句如select、insert标签中的id就是当下命名空间唯一标识的sql语句,就和在java中找某个类一样需要有它的包名一样,当执行此sql语句时,需要指定此方法的包名+id,比如在执行这个select方法,需要指定com.danny.mybatis.findUserById。 parameterType为传入参数的类型(java对象的类型),resultType为执行结果返回类型。

   User.xml

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

    <!-- 查询用户-->
    <select id="findUserById" parameterType="int"
        resultType="com.danny.mybatis.po.User">
        select * from user where id=#{id}
    </select>

    <!-- 添加用户-->
    <insert id="insertUser" parameterType="com.danny.mybatis.po.User">
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user(id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address})
    </insert>

    <!-- 删除用户-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>

    <!-- 更新用户-->
    <update id="updateUser" parameterType="com.danny.mybatis.po.User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} 
    </update>
</mapper>

  SqlMapConfig.xml就是MyBatis的核心配置文件,类似于Hibernate中的hibernate.cfg.xml。

   SqlMapConfig.xml

<?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>
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理,事务控制由mybatis管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 ,由mybatis管理 -->
            <dataSource type="POOLED">
                <property name ="driver" value ="com.mysql.jdbc.Driver" />
                <property name ="url" value ="jdbc:mysql://127.0.0.1:3306/mybatisdemo?characterEncoding=utf-8"/>
                <property name ="username" value ="root" />
                <property name ="password" value ="dannyhoo" />
            </dataSource>
        </environment>
    </environments>
    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
    </mappers>
</configuration>

  这里只是搭建纯的mybatis框架,不与其他框架(如Spring)整合,所以事务、连接池暂时由mybatis管理。与Hibernate另一个共同点是,User.xml也需要配置在MyBatis的核心配置文件SqlMapConfig.xml中。

4、添加接口、对应实现类

   UserDao.java

package com.danny.mybatis.dao;

import com.danny.mybatis.po.User;
/**
 * @ClassName:UserDao
 * @Description:用户Dao接口
 * @author Danny
 */
public interface UserDao {

    /**
     * 根据id查询用户信息
     * @param id
     * @return
     * @throws Exception
     */
    public User findByUserId(int id) throws Exception;

    /**
     * 添加用户信息
     * @param user
     * @throws Exception
     */
    public int insertUser(User user) throws Exception;

    /**
     * 删除用户信息
     * @param id
     * @throws Exception
     */
    public void deleteUser(int id) throws Exception;

    /**
     * 
     * @param 更新用户
     * @throws Exception
     */
    public void updateUser(User user) throws Exception;
}

   UserDaoImpl.java

package com.danny.mybatis.dao;

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

import com.danny.mybatis.po.User;
/**
 * @ClassName:UserDaoImpl
 * @Description:用户Dao实现类
 * @author Danny
 */
public class UserDaoImpl implements UserDao{

    //通过构造方法注入sqlSessionFactory
    private SqlSessionFactory sqlSessionFactory;
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
        this.sqlSessionFactory=sqlSessionFactory;
    }

    /**
     * 根据id查询用户信息
     */
    @Override
    public User findByUserId(int id) throws Exception {
        SqlSession session=sqlSessionFactory.openSession();
        User user=(User)session.selectOne("com.danny.mybatis.findUserById",id);
        session.close();
        return user;
    }

    /**
     * 添加用户信息
     */
    @Override
    public int insertUser(User user) throws Exception {
        SqlSession session=sqlSessionFactory.openSession();
        int i=session.insert("com.danny.mybatis.insertUser", user);
        return i;
    }

    /**
     * 删除用户信息
     */
    @Override
    public void deleteUser(int id) throws Exception {
        SqlSession session=sqlSessionFactory.openSession();
        session.delete("com.danny.mybatis.deleteUser", id);
    }

    /**
     * 更新用户
     */
    @Override
    public void updateUser(User user) throws Exception {
        SqlSession session=sqlSessionFactory.openSession();
        session.update("com.danny.mybatis.updateUser", user);
    }
}

5、测试类:

   UserDaoImpl.java

package com.danny.mybatis.dao;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

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

import com.danny.mybatis.po.User;
import com.ibatis.common.resources.Resources;
/**
 * @ClassName:UserDaoImplTest
 * @Description:TODO
 * @author Danny
 * @date 2016年5月10日上午9:26:50
 */
public class UserDaoImplTest {
    //会话工厂
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void setUp(){
        String myBatisResource="SqlMapConfig.xml";
        try {
            InputStream inputStream=Resources.getResourceAsStream(myBatisResource);
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testQuery() throws Exception{
        UserDao userDao=new UserDaoImpl(sqlSessionFactory);
        User user=userDao.findByUserId(1);
        System.out.println(user.getUsername());
    }

    @Test
    public void testInsert() throws Exception{
        //创建UserDao对象
        UserDao userDao=new UserDaoImpl(sqlSessionFactory);
        User user=new User();
        user.setUsername("DannyHoo");
        user.setSex(1);
        user.setBirthday(new Date());
        user.setAddress("Beijing");
        System.out.println(userDao.insertUser(user));
    }

    @Test
    public void testDelete() throws Exception{
        UserDao userDao=new UserDaoImpl(sqlSessionFactory);
        userDao.deleteUser(5);
    }

    @Test
    public void testUpdate() throws Exception{
        UserDao userDao=new UserDaoImpl(sqlSessionFactory);
        User user=userDao.findByUserId(8);
        user.setUsername("danny-8");
        userDao.updateUser(user);
    }
}

  贴了这么多代码,只有亲手尝试一下才会有感觉滴~这里用的数据库为mysql,所以再给个小提示,把表的存储引擎设置为InnoDB和MyISAM,上面的代码会有不同的结果哦~快去试试吧~

  最后总结一下mybatis框架的执行过程:

  1、配置mybatis的配置文件——SqlMapConfig.xml,且该配置文件名称可以自定义

  2、通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂,SqlSessionFactory在实际使用时按单例方式

  3、通过SqlSessionFactory创建SqlSession(SqlSession是一个面向用户的接口,提供操作数据库的各种方法,它是线程不安全的,因此建议SqlSession在方法体内创建和应用)

  4、调用SqlSession的方法操作数据库,如果需要提交事务,调用SqlSession的commit方法

  5、释放资源,关闭SqlSession

  附上文中代码成型的Demo,欢迎下载:MyBatisDemo.zip


【 转载请注明出处——胡玉洋《【MyBatis框架点滴】——初识+环境搭建》】

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器人网

一文教你从PLC编程菜鸟变成高手

PLC编程软件由系统程序和用户程序两部分组成。系统程序包括监控程序、编译程序、诊断程序等,主要用于管理全机、将程序语言翻译成机器语言,诊断机器故障。PLC编程软...

5655
来自专栏算法修养

HttpClient参观记:.net core 2.2 对HttpClient到底做了什么?

.net core 于 10月17日发布了 ASP.NET Core 2.2.0 -preview3,在这个版本中,我看到了一个很让我惊喜的新特性:HTTP C...

1691
来自专栏高性能服务器开发

windows完成端口(五)

系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) ...

5097
来自专栏Java进阶架构师

透彻理解MyBatis设计思想之手写实现

MyBatis,曾经给我的感觉是一个很神奇的东西,我们只需要按照规范写好XXXMapper.xml以及XXXMapper.java接口。要知道我们并没有提供XX...

1351
来自专栏码匠的流水账

storm drpc实例

892
来自专栏Java与Android技术栈

Android App安全防范措施的小结

关闭打印的日志,防止日志中的调试信息被看到。如果在网络框架中使用了日志,那就更加需要关闭了。

1082
来自专栏坚毅的PHP

PHP码农在Golang压力下的生存之道-PHP性能优化实践

随着国内Golang的火爆,phper的生存压力越来越大,在一次内部技术讨论中,gopher甚至提出,要什么php,写php的全部开掉,唉,码农何苦为难码农。 ...

1.1K8
来自专栏别先生

Spring之注解实现aop(面向切面编程)

1:Aop(aspect object programming)面向切面编程,名词解释:     1.1:功能:让关注点代码与业务逻辑代码分离     1.2:...

26810
来自专栏日常分享

MyBatis 基本构成与框架搭建

        根据配置信息(eg:mybatis-config.xml)或者代码来生成SqlSessionFactory。

1492
来自专栏码匠的流水账

聊聊jdbc socketTimeout的设置

jdbc的socketTimeout值的设置要非常小心,不同数据库的jdbc driver设置不一样,特别是使用不同连接池的话,设置也可能不尽相同。对于严重依赖...

8121

扫码关注云+社区

领取腾讯云代金券