6.MyBatis

mybatis是一个非常好的持久层框架,有字段映射,有sql缓存,还能很好的和spring做集成,用的人真是非常非常多,尤其是互联网公司,基本上不用hibernate的都在用mybatis。

我也用过很长时间的mybatis,总的来说mybatis的优点主要体现在以下几个方面:

  • java实体和数据库字段做映射,简化jdbc操作,不用写各种各样的set get字段操作。
  • 可以利用第三方的工具,根据model对象,自动生成xml mapper配置文件,基本不用写sql
  • sql集中存储,上线后如果sql有问题,可以直接改配置,不用编译java,重启就能运行(这一点是别人提的,我不是很赞同,集中存储其实意义也不大,生产中直接改sql,然后上线运行估计没有哪个领导同意这个干的。)
  • mybatis的缓存,这个意义也不是很大,如果真到了靠这点缓存来提高性能的地步了,估计就不单单是mybatis的原因了。

当然缺点也有不少,我简单列几点:

  • mybatis里面的特殊字符,比如<>等,很容易造成错误,且mybatis的错误提示不是很具体。
  • mybatis更新比较缓慢,其实这几年都没什么更新,而且也没什么要更新的了。确实是这样,mybatis后来新加的基于注解的操作,替代xml,意义不是很大,基本很少人用,mybatis的核心在于mapper映射文件,改为注解后,映射文件不存在了。
  • 调试比较麻烦,主要是因为如果改mapper配置文件,工程需要重启,不知道现在的jrebel能不能动态加载mapper文件。

个人建议不用mapper,因为spring的JDBCTempalte出来了,mybatis有的,JDBCTemplate全都有,而且更容易调错。当然这仅是建议,下面还是得写个例子的。

pom.xml依赖

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.18</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>

Mybatis配置文件Configuration.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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost/test"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/StaffMapper.xml"/>
    </mappers>
</configuration>

这里面主要是配置连接数据库的,没什么复杂的。

StaffMapper.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.critc.dao.StaffDao">
    <select id="list" resultType="com.critc.model.Staff">
        select * from staff
    </select>

    <insert id="add" parameterType="com.critc.model.Staff">
        insert into staff(name)
        values(#{name})
    </insert>

    <update id="update" parameterType="com.critc.model.Staff">
        update staff set
        name=#{name}
        where
        id=#{id}
    </update>

    <delete id="delete" parameterType="int">
        delete from staff where
        id=#{id}
    </delete>
</mapper>

这里面写了增删改查的四个例子,参数类型可以是一个Model,也可以是普通java类型,返回值是放在List容器中的实体类型

StaffDao.java接口映射

public interface StaffDao {
    public int add(Staff staff);

    public int update(Staff staff);

    public int delete(int id);

    public List<Staff> list();
}

**接口映射要完全和mapper配置文件一致,如果不一致,启动会报错
**

Staff.java java实体,很简单

public class Staff {
    private int id;

    private String name;//
    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 static void main(String[] args) throws Exception {
        String resource = "configuration.xml";//读取Mybatis的数据库连接配置及mapper配置,
        Reader reader = Resources.getResourceAsReader(resource);
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(reader);//建立数据库连接

        SqlSession session = factory.openSession();//打开连接
        StaffDao staffDao = session.getMapper(StaffDao.class);//加载映射文件

        Staff staff = new Staff();
        staff.setName("Mybatis");
        staffDao.add(staff);//新增

        List<Staff> list = staffDao.list();
        for (Staff staff2 : list) {
            System.out.println(staff2.getName());//查询
        }
        session.commit();//数据提交
        session.close();//连接关闭
    }

**这一块和hibernate基本一致,先读取配置,打开数据库连接,然后新建实体,执行新增,查询,数据库提交,关闭连接等
**

这一节讲的mybatis比较简单,当然mybatis肯定不会这么简单的,它的核心一个是实体映射,另一个是动态xml,这一块没有讲,不过也比较简单,就是在mapper配置文件里面写sql,网上教程比较多,这里就不在写了。Mybatis和Spring的整合也比较简单,这里主要说的是mybatis是个数据库持久化工具类,具体开发中用不用这个,看整个团队的技术实力,看使用经验。

源码下载

本工程详细源码

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容