`
AlanDeng2012
  • 浏览: 10876 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Mybatis使用总结

阅读更多
本文分为三部分,一是入门总结,二是自动代码生成,三是深入总结。

一 入门总结

什么是Mybatis?
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。

Mybatis入门
  每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得。SqlSessionFactoryBuilder对象可以从XML配置文件,或从Configuration类的习惯准备的实例中构建SqlSessionFactory对象
   从XML文件中构建SqlSessionFactory的实例:
   String resource = "org/mybatis/example/Configuration.xml";
   Reader reader = Resources.getResourceAsReader(resource);
   sqlMapper = new SqlSessionFactoryBuilder().build(reader);
  
  XML配置文件的一个简单的示例: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="${driver}"/>
           <property name="url" value="${url}"/>
           <property name="username" value="${username}"/>
           <property name="password" value="${password}"/>
       </dataSource>
      </environment>
   </environments>
   <mappers>
      <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
   </configuration>
当然,在XML配置文件中还有很多可以配置的,上面的示例指出的则是最关键的部分。要注意XML头部的声明,需要用来验证XML文档正确性。environment元素体中包含对事务管理和连接池的环境配置。mappers元素是包含所有mapper(映射器)的列表,这些mapper的XML文件包含SQL代码和映射定义信息。

XML映射文件BlogMapper.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="org.mybatis.example.BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog">
      select * from Blog where id = #{id}
</select>
</mapper>
在命名空间“com.mybatis.example.BlogMapper”中,它定义了一个名为“selectBlog”的映射语句,这样它允许你使用完全限定名“org.mybatis.example.BlogMapper.selectBlog”来调用映射语句。

从SqlSessionFactory中可以获取SqlSession,SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法。你可以用SqlSession实例来直接执行已映射的SQL语句
SqlSession session = sqlMapper.openSession();
try {
   Blog blog = (Blog) session.selectOne(
         "org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
     session.close();
}

以我自己练手的例子为例,附有源代码。

1、前提说明:   

   数据库:MySql5.5.8;

    相关Jar包:mybatis-3.0.4.jar;  mysql-connector-java-bin.jar

      数据库表的定义:User(id, username, psw)

2、实现步骤:

(1)给项目添加jar包:mybatis-3.0.4.jar;  mysql-connector-java-bin.jar。

(2)创建entity类

(3)创建Mybatis的配置文件,然后创建SQL映射文件(位于config包下)

(4)创建mybatis公共类GetSqlSessionFactory

(5)创建Dao层接口和实现类

(6)写main类,测试运行(保证数据库已经存在相关的表)

3、相关文件如下:

(1)Mybatis的配置文件:

<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/test"/>
    <property name="username" value="root"/>
    <property name="password" value=""/>
   </dataSource>
  </environment>
</environments>
<mappers>  <!-- 定义SQL映射语句 -->
    <mapper resource="cn/com/config/UserMapper.xml"/>
</mappers>
</configuration>

(2)SQL映射文件如下:

<mapper namespace="cn.com.config">
    <!-- 描述如何从数据库结果集中来加载对象,即把数据库字段和pojo类的属性相关联 -->
    <!-- property对应的是pojo类的属性,column对应的是数据库字段 -->
    <resultMap type="cn.com.entity.User" id="userAlia">
        <id property="uid" column="id" javaType="int" jdbcType="INTEGER" />
        <result property="userName" column="userName" javaType="string"
            jdbcType="VARCHAR" />
        <result property="upsw" column="psw" javaType="string"
            jdbcType="VARCHAR" />
    </resultMap>
    <!-- SQL语句 parameterType是传进来的参数的类型;resultMap是返回的结果集,对应上面的映射关联 -->
    <select id="selectById" parameterType="int" resultMap="userAlia">
        select *
        from user where id=#{uid}
    </select>
    <insert id="insertvalues" parameterType="cn.com.entity.User">
        insert into user
        (userName,psw) values (#{userName},#{upsw})
    </insert>
    <update id="updatevalue" parameterType="cn.com.entity.User">
        update user set
        userName=#{name} where id=#{id}
    </update>
</mapper>

(3)GetSqlSessionFactory文件,读取配置文件,创建sqlsessionFactory实例

public class GetSqlSessionFactory {
    private static SqlSessionFactory sqlSessionFactory = null;
    private static GetSqlSessionFactory getSqlSessionFactory = null;
  
    private GetSqlSessionFactory(){//在构造方法内创建SqlSessionFactory实例
        String rs = "cn/com/config/sqlMapConfig.xml";
        Reader reader = null;
        try {
            reader = Resources.getResourceAsReader(rs);//加载资源文件

        } catch (IOException e) {
            e.printStackTrace();
        }   //创建SqlSessionFactory实例
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    }
    //获取类的实例,单例模式
    public static GetSqlSessionFactory getInstance(){
        if(getSqlSessionFactory == null){
            getSqlSessionFactory = new GetSqlSessionFactory();
        }
        return getSqlSessionFactory;
    }
    //获取SqlSessionFactory实例
    public  SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}

(4)实现Mybatis映射方法,操作数据库

//从数据库读取记录,User为实体类
    public User getUser(int id) {
        SqlSession session = GetSqlSessionFactory.getInstance().getSqlSessionFactory()
                            .openSession();//获取session实例
        User user = null;
        try{ //select方法,selectById已经在UserMapper.xml中定义
            user = (User)session.selectOne("selectById", id);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            session.close();//记得关闭session
        }
        return user;
    }
//插入记录
    public void insertUser(User user) {
    SqlSession session = GetSqlSessionFactory.getInstance().getSqlSessionFactory()
                          .openSession();//获取session实例
    try{
        session.insert("insertvalues",user);//insert方法
        session.commit();//记得要提交,否则无法写入数据库
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        session.close();//记得关闭session
    }

    }

4 、Mybatis配置文件的编码方式要注意一下


5、测试运行:

public static void main(String[] args){
        TestDao t = new TestDaoImpl();
        User u = new User();
        u.setUserName("test");
        u.setUpsw("123");
        t.insertUser(u);
        User u1 = t.getUser(2);
        System.out.println(u1.getUserName());
    }

二 自动代码生成


以我自己练手的例子为例,附有源代码。

1、前提说明:

使用工具:mybatis-generator-core-1.3.1

需要数据库驱动,本例使用mysql-connector-java-bin.jar

    在Eclipse里新建一个项目,本例为mybatisGeneratorExample

2、步骤


(1)创建配置文件:generator.xml,和mysql-connector-java-bin.jar都放在mybatis-generator-core-1.3.1目录下面。

<generatorConfiguration>
    <!-- 注意:以下的文件路径中不可以出现中文字符 -->
  <!-- classPathEntry:数据库的JDBC驱动,换成你自己的驱动位置 -->
  <classPathEntry location="F:\mybatis-generator-core-1.3.1\mysql-connector-java-bin.jar" />
  
  <context id="DB2Tables" targetRuntime="MyBatis3">
      
      <!-- 去除自动生成的注释 -->
      <commentGenerator>
          <property name="suppressAllComments" value="true" />
      </commentGenerator>
      
      <jdbcConnection driverClass="com.mysql.jdbc.Driver"
          connectionURL="jdbc:mysql://localhost/test" userId="root" password="">
      </jdbcConnection>
      
      <javaTypeResolver >
          <property name="forceBigDecimals" value="false" />
      </javaTypeResolver>
      
      <!-- targetProject:自动生成代码的位置 -->
       <!-- 生成po类 targetPackage指生成的包名,targetProject指生成的包位于那个项目下面,由于我之前已经在Eclipse中新建了项目mybatisGeneratorExample,所以指向该项目-->
      <javaModelGenerator targetPackage="com.mybatis.generator.po"
          targetProject="F:\Alan_Eclipse\mybatisGeneratorExample\src">
          <property name="enableSubPackages" value="true" />
          <!-- <property name="trimStrings" value="true" />  -->
      </javaModelGenerator>
      <!-- 生成配置文件  -->
     <sqlMapGenerator targetPackage="com.mybatis.generator.mapper"
         targetProject="F:\Alan_Eclipse\mybatisGeneratorExample\src">
       <property name="enableSubPackages" value="true" />
      </sqlMapGenerator>
      <!-- 生成Dao类文件 -->
      <javaClientGenerator type="XMLMAPPER" targetPackage="com.mybatis.generator.dao"
          targetProject="F:\Alan_Eclipse\mybatisGeneratorExample\src">
          <property name="enableSubPackages" value="true" />
      </javaClientGenerator>
      
      <!--  tableName:用于自动生成代码的数据库表名;domainObjectName:对应于数据库表的javaBean类名   -->
      <table tableName="user" domainObjectName="UserPO" enableSelectByExample="false"
          selectByExampleQueryId="false" enableCountByExample="false"  enableDeleteByExample="false"
          enableUpdateByExample="false" selectByPrimaryKeyQueryId="false"/>
  </context>
      
</generatorConfiguration>

(2)在命令行里运行一下命令:

java -jar F:\mybatis-generator-core-1.3.1\lib\mybatis-generator-core-1.3.1.jar -configfile F:\mybatis-generator-core-1.3.1\generator.xml -overwrite

(3)在Eclipse中刷新mybatisGeneratorExample,就可以看见自动生成的文件了,不过还需要自己手动配置Mybatis的配置文件,可以直接复制上一个例子中的sqlMapConfig.xml文件,然后按需要修改一下SQL映射文件就行了。

(4)测试运行,ok

三 深入总结


1、通过使用mybatis-spring插件,Mybatis可以通过dao层中的接口直接映射到sql映射文件,而不需要实现dao层中的接口,即不需要daoImpl包了;

2、dao层接口的方法传递多参数时可以用javabean对象、map对象或者用(@Param("字段名")类名 参数名)定义;

3、映射配置文件中#与$的区别,总结如下:
(1) #是把传入的数据当作字符串,如# number,#传入的是20(数字),则生成的sql语句是这样,order by "20",这当然会报错;
(2) $传入的数据直接生成在sql里,如# number ,#传入的是20,则sql语句生成是这样,orderby 20,这就对了;
(3) #方式能够很大程度防止sql注入;
(4)$方式无法防止sql注入;
(5) $方式一般用于传入数据库对象.例如传入表名;
  所以,一般能用#的就别用$。
分享到:
评论

相关推荐

    MyBatis基本使用总结

    总结,MyBatis通过核心配置文件、映射文件和Mapper接口实现了数据库操作的便捷和灵活。其强大的动态SQL功能、丰富的参数映射和结果集映射,以及缓存机制,都为Java开发人员提供了高效、可控的数据库访问手段。在实际...

    【狂神说】mybatis学习总结笔记(全)PDF格式文档 MyBatis.pdf

    MyBatis学习总结笔记 MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原始...

    mybatis学习总结:mybatis和spring, spring boot的集成

    这篇“mybatis学习总结”着重探讨了MyBatis如何与Spring和Spring Boot进行集成,这对于构建高效、可维护的企业级应用至关重要。 首先,MyBatis与Spring的集成主要通过Spring的IoC(Inversion of Control)容器来...

    mybatis的总结一

    ### MyBatis总结 #### JDBC回顾与MyBatis简介 **JDBC(Java Database Connectivity)** 是Java中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。它由一组用Java语言...

    【狂神说】mybatis学习总结后源码下载(全) mybatis-study.zip

    总结,MyBatis作为一个轻量级的持久层框架,通过灵活的XML或注解配置,将Java对象与数据库操作紧密结合,简化了开发工作,提高了开发效率。同时,其强大的动态SQL功能和良好的扩展性,使其在Java Web开发中广泛应用...

    mybatis老师总结

    ### MyBatis 知识点总结 #### 一、MyBatis 概述 - **起源与发展**:MyBatis 最初是 Apache 的一个开源项目 iBatis,于2010年由 Apache Software Foundation 迁移到了 Google Code,并更名为 MyBatis。2013年11月,...

    mybatis总结

    ### MyBatis总结 #### 一、MyBatis概述与特点 ##### 1. MyBatis支持SQL查询映射及动态映射标记 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。通过将接口定义与SQL语句分离,MyBatis...

    Spring mvc 和 mybatis 整合,mybatis使用注解模式

    总结来说,Spring MVC与MyBatis的整合使得我们能够充分利用两者的优势:Spring MVC提供了强大的MVC架构和依赖注入,而MyBatis的注解模式则简化了SQL映射。通过这种方式,开发者可以更专注于业务逻辑,提高开发效率和...

    MyBatis SpringMVC 整合总结

    可以使用`&lt;mybatis:scan&gt;`标签来扫描Mapper接口。 3. **创建Mapper接口**:在业务层,定义Mapper接口,这些接口将对应MyBatis的XML映射文件。接口中的方法将映射到SQL语句。 4. **Mapper XML文件**:在资源目录下...

    mybatis学习总结:基础示例

    【标题】:“mybatis学习总结:基础示例” 在IT领域,MyBatis是一个非常流行的持久层框架,它简化了Java开发中数据库操作的复杂性。这篇“mybatis学习总结:基础示例”旨在帮助初学者理解MyBatis的核心概念,并通过...

    MYBatis总结.docx

    - `&lt;setting name="useColumnLabel" value="true"&gt;`:使用列标签而不是列名,兼容不同的数据库驱动。 - `&lt;setting name="useGeneratedKeys" value="true"&gt;`:启用自动生成主键,依赖于数据库驱动。 - `...

    Mybatis详细总结

    Mybatis详细总结

    mybatis知识总结.zip

    7. **动态SQL**:MyBatis允许在XML映射文件中使用条件标签如`&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`等,实现SQL语句的动态生成。 8. **缓存机制**:MyBatis内置了两级缓存,一级缓存是SqlSession级别的,二级...

    mybatis问题总结.docx

    首先,针对"Mybatis问题总结",我们关注的是MyBatis框架在实际开发中可能遇到的错误和解决方案。MyBatis是一个轻量级的持久层框架,它简化了Java开发者与数据库之间的交互,通过XML或注解方式来配置SQL语句。 1. ...

    mybatis学习总结:annotation与xml结合示例

    本篇文章将聚焦于MyBatis中的注解(Annotation)与XML配置的结合使用,旨在帮助开发者更深入地理解这一关键特性。 首先,MyBatis允许我们使用注解来简化Mapper接口的定义,无需编写XML映射文件。例如,我们可以在...

    mybatis小小总结文档

    mybatis学习知识点小小总结。。。。。。。。。。。。。。。。。。。。。。。

    MyBatis的helloworld(不使用Mapper接口实现MyBatis查询数据库).zip

    总结来说,本示例展示了如何在不使用Mapper接口的情况下,通过MyBatis的XML配置文件和SqlSession执行SQL查询。这种方式虽然略显繁琐,但对于学习MyBatis的基本操作非常有帮助。在实际开发中,结合Mapper接口和注解...

    Mybatis学习总结之mybatis使用建议

    在使用MyBatis的过程中,有几点使用建议可以帮助提高代码的可读性和可维护性: 1. **Mapper层参数设计**: - Mapper接口通常不直接使用重载方法,因为其机制限制。在这种情况下,可以考虑在Service层实现方法的...

    MyBatis知识点总结.ppt

    Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是...Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象pro

Global site tag (gtag.js) - Google Analytics