Mybatis(一):Mybatis基础架构和入门案例

来源:互联网 发布:手机去广告软件 编辑:程序博客网 时间:2024/06/05 22:05

Mybatis介绍

  1. MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。 目前mybatis在github上托管。git(分布式版本控制,当前比较流程)
  2. MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
  3. Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

Mybatis架构

这里写图片描述

Mybatis解决jdbc编程的问题

1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4.对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型

Mybatis与Hibernate重要区别

相同点:屏蔽jdbc api的底层访问细节,使用我们不用与jdbc api打交道,就可以访问数据。
Mbatis的好处:屏蔽jdbc api的底层访问细节;将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能,queryForList返回对象集合,用queryForObject返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。

Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,Mbatis需要我们自己在xml配置文件中写sql语句,hibernate要比Mbatis功能负责和强大很多。因为hibernate自动生成sql语句,我们无法控制该语句,我们就无法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候用Mbatis就是不错的选择,因为Mbatis还是由我们自己写sql语句。

Mybatis入门程序

  1. 实现用户查询:根据用户id(主键)查询用户信息(单条记录)
  2. Project结构以及要导入的jar包
    这里写图片描述这里写图片描述

  3. log4j.properties

# Global logging configuration,建议开发环境中要用debuglog4j.rootLogger=DEBUG, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

4.SqlMapConfig.xml

<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <!-- 和spring整合后 environments配置将废除-->    <environments default="development">        <environment id="development">        <!-- 使用jdbc事务管理-->            <transactionManager type="JDBC" />        <!-- 数据库连接池-->            <dataSource type="POOLED">                <property name="driver" value="${jdbc.driver}"/>                <property name="url" value="${jdbc.url}"/>                <property name="username" value="${jdbc.username}"/>                <property name="password" value="${jdbc.password}"/>            </dataSource>        </environment>    </environments>     <!--加载mapper映射    如果将和spring整合后,可以使用整合包中提供的mapper扫描器,此处的mappers不用配置了。     -->    <mappers>        <!-- 通过resource引用mapper的映射文件 -->        <mapper resource="sqlmap/User.xml" />               </mappers>  </configuration>

5.根据用户id(主键)查询用户信息(单条记录)
pojo(User.java)

public class User {    private int id;    private String username;    private String sex;    private Date birthday;    private String address;}

User.xml(建议命名规则:表名+mapper.xml)

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace命名空间,为了对sql语句进行隔离,mapper开发dao方式,使用namespace有特殊作用--><mapper namespace="test"><!-- 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象mapper.xml以statement为单位管理sql语句 -->    <!-- 根据id查询用户信息 -->    <!--         id:唯一标识 一个statement        #{}:表示 一个占位符,如果#{}中传入简单类型的参数,#{}中的名称随意        parameterType:输入 参数的类型,通过#{}接收parameterType输入 的参数        resultType:输出结果 类型,不管返回是多条还是单条,指定单条记录映射的pojo类型     -->    <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">        SELECT * FROM USER WHERE id= #{id}      </select></mapper>

创建SqlSessionFactory

public class MybatisFirst {    // 会话工厂    private SqlSessionFactory sqlSessionFactory;    // 创建工厂    @Before    public void init() throws IOException {        // 配置文件(SqlMapConfig.xml)        String resource = "SqlMapConfig.xml";        // 加载配置文件到输入 流        InputStream inputStream = Resources.getResourceAsStream(resource);        // 创建会话工厂        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);    }    // 测试根据id查询用户(得到单条记录)    @Test    public void testFindUserById() {        // 通过sqlSessionFactory创建sqlSession        SqlSession sqlSession = sqlSessionFactory.openSession();        // 通过sqlSession操作数据库        // 第一个参数:statement的位置,等于namespace+statement的id        // 第二个参数:传入的参数        User user = null;        try {            user = sqlSession.selectOne("test.findUserById", 2);        } catch (Exception e) {            e.printStackTrace();        } finally {            // 关闭sqlSession            sqlSession.close();        }        System.out.println(user);    }

6.备注
(1)、#{}表示一个占位符,向占位符输入参数,mybatis自动进行java类型和jdbc类型的转换。程序员不需要考虑参数的类型,比如:传入字符串,mybatis最终拼接好的sql就是参数两边加单引号。
(2)#{}接收pojo数据,可以使用OGNL解析出pojo的属性值。
(3)sql{}接收参数,将参数的内容不加任何修饰拼接在sql中。${}也可以接收pojo数据,可以使用OGNL解析出pojo的属性值。

原创粉丝点击