---直接贴代码

(1)User.Java

package me.gacl.domain;

/**

* @author gacl

* users表所对应的实体类

*/

public class User {

//实体类的属性和表的字段名称一一对应

private int id;

private String name;

private int age;

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 int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "User [id=" + id + ", name=" + name + ", age=" + age + "]";

}  }

(2)UserMapper.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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
 例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
  -->
 <mapper namespace="me.gacl.mapping.userMapper">
     <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
     使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
     resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
     User类就是users表所对应的实体类
     -->
     <!--
         根据id查询得到一个user对象
      -->
     <select id="getUser" parameterType="int"
         resultType="me.gacl.domain.User">
         select * from t_user where id=#{id}
     </select>
 </mapper>

(3)conf.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="oracle.jdbc.driver.OracleDriver" />
                 <property name="url" value="jdbc:oracle:thin:@132.224.24.118:1521:jsfx" />
                 <property name="username" value="sett_analyse" />
                 <property name="password" value="g4el_yj_ha" />
             </dataSource>
         </environment>
     </environments>
     <mappers>
        <!-- 注册userMapper.xml文件,
        userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
                 <mapper resource="me/gacl/mapping/userMapper.xml"/>
                      </mappers>
    
 </configuration>

(4)Test1.java

package me.gacl.test;

import java.io.IOException; import java.io.InputStream; import java.io.Reader; import me.gacl.domain.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Test1 {

public static void main(String[] args) throws IOException {

//mybatis的配置文件

String resource = "conf.xml";

//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)

InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);

//构建sqlSession的工厂

SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);

//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)

//Reader reader = Resources.getResourceAsReader(resource);

//构建sqlSession的工厂

//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

//创建能执行映射文件中sql的sqlSession

SqlSession session = sessionFactory.openSession();

/**          * 映射sql的标识字符串,

* me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,

* getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL

*/

String statement = "me.gacl.mapping.userMapper.getUser";//映射sql的标识字符串

//执行查询返回一个唯一user对象的sql

User user = session.selectOne(statement, 1);

System.out.println(user);

} }

Mybatis访问数据库的步骤:

(1)加载配置文件,

(2)获取SqlSessionFactory工厂

(3)获取sqlSession

(4)获取执行器Executor

(5)Mapper statement对象(包含输入输出)

---总结

(1)映射文件中resultType对应的是单条记录的类型,所以就算返回的是一个对象的集合,这里也和返回一个对象的类型一样

(2)${}表示拼接 like '%${value}%',但是这种写法会引起sql注入,例如1=1 or

(3)在配置文件中配置别名typeAlias      mapper.xml中就可以使用别名,批量别名用package

注意:

在配置文件中引用映射文件时有3中方法:

(1)通过Resource加载单个映射文件

(2)通过mapper接口加载单个文件

<mapper class=...../>

(3)批量加载mapper映射文件

<package name=..../>

第(2)(3)中方式规定:指定mapper接口类名和mapper.xml映射文件名保持一致,且在同一个目录下,前提是使用mapper代理的方法

2、mybatis可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发

默认支持的别名:

类似String  string

Integer integer

单个别名定义:

<typeAliases>

<typeAlias tpye="全路径类名"  alias="别名"/>

</typeAliases>

批量定义别名

<package name=""/>//别名就是类名,大小写都可以

resultMap可以实现延迟加载,resultType无法实现延迟加载。

一对一关联的时候,如果关联表的字段有一样的情况下,<resultMap>标签的列名column写之前,要在select语句中对相同列名定义别名,这是

column用别名代替,不能按照数据库表字段映射;

例如:

<association property="user" javaType="me.gacl.domain.User">
   <id column="user_id" property="id" />
   <result column="userName" property="userName" />
   </association>
   
 </resultMap>
  
   <select id="findCustomeUser"  resultMap="bbb">
  
   select user.id,user.name as userName, customers.id,customers.name,customers.user_id from
   customers,user where customers.user_id = user.id
  
   </select>

如果不加别名,会导致user对象的username属性取值不正确

延迟加载:association、collection自带延迟加载的功能

setting配置:

<settings>
     <setting name="lazyLoadingEnabled" value="true"/>
     <setting name="aggressiveLazyLoading" value="false"/>
     </settings>

java文件中写法:

@Test
 public void queryCustomerUserLazy(){
  
  SqlSession sqlSession = sessionFactory.openSession();
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
     Customers customers = userMapper.queryCustomerUserLazy(48);
     //当调用customer.getUser()方法后才可以加载user的值
     User user = customers.getUser();
     System.out.println(user);
  
 }
 Mapper.xml:

<!-- 实现延迟加载 -->
   <resultMap type="me.gacl.domain.Customers" id="cc">
   <id column="id" property="id"/>
   <result column="name" property="name"/>
   <result column="user_id" property="user_id"/>
   <association property="user" javaType="me.gacl.domain.User"
    select="me.gacl.mapping.UserMapper.queryUser" column="user_id">
    </association>
   </resultMap>
  <select id="queryCustomerUserLazy" parameterType="int" resultMap="cc">
  select * from customers where id=#{id}
  </select>
  <select id="queryUser" parameterType="int"  resultMap="dd">
  select * from user where id = #{value}
  </select>
  <resultMap type="me.gacl.domain.User" id="dd">
  <id column="id" property="id"/>
  <result column="username" property="name"/>
  </resultMap>

延迟加载的思考:

不使用mybatis提供的association、collection中延迟加载的功能,如何实现延迟加载呢?

实现方法如下:

定义2个mapper方法,分别调用

什么是查询 缓存:

mybatis提供查询缓存,用户减轻数据的压力,提供数据库性能

mybatis提供一级缓存、二级缓存

修改、添加、删除后commit会清空一级缓存区域

二级缓存是mapper级别的缓存,除了在conf.xml配置文件中添加配置:

<setting name="cacheEnabled" value="true"/>

在映射文件中也要开启:

<mapper namespace="......">

<cache/>//开启本mapper的namespace下的 二级缓存

可能需要对pojo实现序列化 具体不懂

这样配置后再每一个statement中 useCache默认是true 开启二级缓存

刷新缓存:flushCache="true"

总结:一般下执行完commit操作都需要刷新缓存,flushCache=true表示刷新缓存,这样可以避免数据库脏读。

MyBatis简单实例的更多相关文章

  1. SpringMVC笔记——Spring+MyBatis组合开发简单实例

    简介 SSH框架很强大,适合大型项目开发.但学无止境,多学会一门框架组合开发会让自己增值许多. SSM框架小巧精致,适合中小型项目快速开发,对于新手来说也是简单上手的.在SSM框架搭建之前,我们先学习 ...

  2. TypeHandler的简单实例

    转自:http://ccchhhlll1988-163-com.iteye.com/blog/1420149 TypeHandler是MyBatis config文件中可选的配置选项,其可以对实体属性 ...

  3. SpringMVC笔记——SSM框架搭建简单实例

    落叶枫桥 博客园 首页 新随笔 联系 订阅 管理 SpringMVC笔记——SSM框架搭建简单实例 简介 Spring+SpringMVC+MyBatis框架(SSM)是比较热门的中小型企业级项目开发 ...

  4. mybatis简单项目

    1,mybatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可 ...

  5. 浅析MyBatis(二):手写一个自己的MyBatis简单框架

    在上一篇文章中,我们由一个快速案例剖析了 MyBatis 的整体架构与整体运行流程,在本篇文章中笔者会根据 MyBatis 的运行流程手写一个自定义 MyBatis 简单框架,在实践中加深对 MyBa ...

  6. Hibernate(二)__简单实例入门

    首先我们进一步理解什么是对象关系映射模型? 它将对数据库中数据的处理转化为对对象的处理.如下图所示: 入门简单实例: hiberante 可以用在 j2se 项目,也可以用在 j2ee (web项目中 ...

  7. 最新 Eclipse IDE下的Spring框架配置及简单实例

    前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...

  8. 修改js confirm alert 提示框文字的简单实例

    修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...

  9. 利用navicat创建存储过程、触发器和使用游标的简单实例

    利用navicat创建存储过程.触发器和使用游标的简单实例 标签: navicat存储过程触发器mysql游标 2013-08-03 21:34 15516人阅读 评论(1) 收藏 举报  分类: 数 ...

随机推荐

  1. JAVA Day2

          标识符(类名:变量.属性.方法名: )      组成:类名开头不能是数字,只能有字母数字_$组成.         命名规范: 类名每一个单词首字母大写(HelloWorld大驼峰法则) ...

  2. HTML meta viewport属性说明(mark)

    什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤 到很小的窗口中(这样会破坏没有针对手 ...

  3. BZOJ 2631 Tree ——Link-Cut Tree

    [题目分析] 又一道LCT的题目,LCT只能维护链上的信息. [代码] #include <cstdio> #include <cstring> #include <cs ...

  4. 泛型容器单元(Generics.Collections)[2]: TQueue<T> 队列列表

    TQueue 和 TStack, 一个是队列列表, 一个是堆栈列表; 一个是先进先出, 一个是先进后出. TQueue 主要有三个方法.一个属性:Enqueue(入列).Dequeue(出列).Pee ...

  5. 【Highcharts】 绘制饼图和漏斗图

    1.outModel类设计 设计outModel类首先研究下Highcharts中series的data数据格式,发现饼图和漏斗图都可以使用这样格式的数据 series: [{ name: 'Uniq ...

  6. 不同java 版本的新功能

    Java 5 泛型 自动装箱/拆箱 增强的for 类型安全的枚举 可变参数 静态导入 Annotation Concurrent Package Java 6 Web Service 支持Annota ...

  7. Ubuntu 修改源

    Steps 打开Ubuntu的终端,输入 sudo gedit /etc/apt/sources.list 删掉里边所有旧的内容,把新的源内容贴进去 执行 sudo apt-get update 源 ...

  8. 利用TaskCompletionSource将EAP转换成TAP

        1.原始的异步方法的调用   我们来看个简单的例子,在这里演示调用 WebClient.DownloadStringAsync 方法(这个方法不是 TAP),然后由 WebClient.Dow ...

  9. ASP.NET 操作Cookie详解 增加,修改,删除

    Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密).定义于RFC2109.它是网景公司的前雇员Lou Montulli在1993年3 ...

  10. 记忆用户设置-提升程序的体验VB/C#

    有时候,设计的程序有很多的控件,甚至多达近百个,尤其是一些工控软件等,程序运行所需的各种参数都是由用户通过这些控件设置而来,那么记录用户的设置就显得十分必要.如果程序出现异常,起码重新打开可以不用再一 ...