前言:终于到mybatis啦!


 

Mybatis

前文有提到,Hibernate采用的是全表映射的方式,而这方式恰恰使得性能变得较差(https://www.cnblogs.com/NYfor2018/p/9092810.html )。为了解决Hibernate的不足,一个半自动映射的框架Mybaits应运而生,之所以称之为半自动,是因为它需要手工匹配提供POJO、SQL和映射关系,而全表映射的Hibernate只需要提供POJO和映射关系即可。

在Mybatis中,需要自己编写SQL,虽然比Hibernate配置多,但是Mybatis可以配置动态SQL,这就解决了上文提到的,在Hibernate中根据表明动态修改的问题。同时也可以优化SQL,通过配置决定你的SQL映射规则,也能支持存储过程,所以对于以下复杂的和需要优化性能SQL的查询会更加方便。而且,在注意一些规则的基础上,Mybatis可以完成自动映射功能,而无需再写任何的映射规则。

①    这个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:3306/mybatis"/>

                <property name="userName" value="root"/>

                <property name="password" value=""/>

            </dataSource>

        </environment>

    </environments>

    <mappers>

        <mapper resource="com\entity\user.xml"/>

        <!-- 这里是映射实体类的映射 -->

    </mappers>

</configuration>

这个就是Mybatis的基础配置文件。

② 这个xml文件,主要是给出SQL。

<?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.mapper.UserMapper">

    <select id="getUser" parameterType="id" resultType="com.entity.User">

    select id,userName from user_info where id=#{id}

    <!-- select标签中,parameterType表示传入作为查找条件的参数是id,而且返回的数据的格式是User -->

    <!-- 标签中间的是SQL语句,#{id}是待传参数 -->

    </select>

</mapper>

这里使用的SQL列名和POJO的属性名保持一致,因为我们给出了SQL但是并没有给出映射规则,而Mybatis在这个时候会自动提供映射规则,所以可以省去配置映射规则的工作。

③ 再者,我们还需要一个接口。注意这仅仅是一个接口,无需实现类。

public interface UserMapper{

    public User getUser(int id);

}

这里的接口是用于Mybatis映射并操作数据库用的。对应的是②中mapper标签的namespace变量。

④ 为了使用Mybati,我们还需要建立SqlSessionFactory。

public class MyBatisUtil{

    private static SqlSessionFactory sqlSessionFactory = null;

    public static SqlSessionFactory getSqlSessionFactory(){

        InputStream inputStream = null;

        if(sqlSessionFactory==null){

            try{

                String resource = "mybatis_config.xml";

                //引入数据库配置资源

                sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource));

                //用数据库配置的资源作为依据,创建SqlSessionFactory

            }catch(Exception ex){

                System.err.println(ex.getMessage());

                ex.printStackTrack();

            }
        }

        return sqlSessionFactory;
    }
}

应用Mybatis之前的,引用数据库的配置文件,以达到连接到数据库,并且可以使用Mybatis来操作数据。

⑤ 用Mybatis实现JDBC的功能操作数据的功能(可参考JDBC篇的例子:https://www.cnblogs.com/NYfor2018/p/9088254.html

public class MyBatisExample{

    public static void main(String[] args){

        SqlSession sqlSession = null;

        try{

            sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();

            //通过MyBatisUtil配置好的SessionFactory生产Session

            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

            User user = userMapper.getUser(1);

            System.err.println("userName =>"+user.getUserName());

        }finally{

            sqlSession.close();

        }

    }

}

这样便完成了Mybatis的代码编写工作,SQL和映射规则都在XML里面进行了分离,而Mybatis更为灵活。既可以自由书写SQL,定义映射规则。此外,Mybatis提供接口编程的映射只需要一个接口和映射文件便可以运行。

最新文章

  1. 【Android】用HandlerThread模拟AsyncTask功能(ThreadTask)
  2. 在 SQL Server 数据库的 WHERE 语句中使用子查询
  3. Java 进程占用 VIRT 虚拟内存超高的问题研究
  4. 【poi】用POI新建一个xlsx文件【或者说将数据存入到xlsx中】/【将数据从xlsx中获取到项目中】
  5. 监听UITextFiled输入文字长度的变化
  6. CF 55D - Beautiful numbers(数位DP)
  7. systemtap 技巧系列 +GDB
  8. Mysql 进阶操作
  9. angularjs中类似textarea的换行、空格处理
  10. docker环境 快速使用elasticsearch-head插件
  11. 乙方渗透测试之Fuzz爆破
  12. js判断是否在微信中打开
  13. WcPro项目(WordCount优化)
  14. Intro to Airplane Physics in Unity 3D – 2017 and 2018
  15. 洛谷P2512 糖果传递
  16. Confluence 6 白名单允许进入和禁用
  17. 浅谈CSS和JQuery实现鼠标悬浮图片放大效果
  18. Android开发代码规范总结
  19. .net mvc 列名 &#39;Discriminator&#39; 无效
  20. 模拟的confirm

热门文章

  1. 性能测试之Jmeter学习(三)
  2. Flutter实战视频-移动电商-15.首页_商品推荐模块编写
  3. 前端基础 之css
  4. console.log是异步么?
  5. HTML基本标签元素
  6. Unity Mecanim在大型mmo中的应用
  7. nginx 的启动、停止与重启
  8. jq weui 滚动加载的坑
  9. js中 call() ,apply(),bing()方法三者的用法和区别
  10. 慕课笔记-Java入门第二季