---直接贴代码

(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. HTML DOM学习之二

    1.HTML DOM属性: **innerHTML属性-获取元素内容的最简单方法是使用innerHTML属性,innerHTML属性对于获取或替换HTML元素的内容很有用 <html> & ...

  2. PHP学习笔记(一)

    by Alina.Xia, dated on 2016.11.27 一.MyAql数据库PHP在开发web站点或管理一些系统时,需要对大量的数据进行保存.XML文件和文本文件虽然可以作为数据的整体,但 ...

  3. redis 的使用 (sort set排序集合类型操作)

    sort set排序集合类型 释义: sort set 是 string 类型的集合 sort set 的每个元素 都会关联一个 权 通过 权值 可以有序的获取集合中的元素 应用场合: 获取热门帖子( ...

  4. 封装原生Ajax

    var Chef = { createAjax:function() { var xhr = null; try { //IE系列浏览器 xhr = new ActiveXObject("m ...

  5. JS验证金额

    <script type="text/javascript">        function ismoney(obj) {            check(obj) ...

  6. 获取ItemsControl中当前item的binding数据

    直接用 {Binding} 就可以了,如下: <ItemsControl ItemsSource="{Binding Path=ProcessItems}"> < ...

  7. How to retrieve instance parameters from an uninstantiated (uninserted) family

    The trick to be able to read the default values for instance parameters is to get to the FamilyManag ...

  8. CF#335 Freelancer's Dreams

    Freelancer's Dreams time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. Unity Standard Assets 简介之 2D

    这篇介绍2D资源包. 文件夹比较多,但是很多都是prefab的基础资源,所以我们只介绍 Prefabs 和 Scripts 文件夹. Prefabs文件夹: CharacterRobotBoy: 提供 ...

  10. [转]error while loading shared libraries 错误解决办法总结

    http://blog.csdn.net/wallwind/article/details/7580659 错误信息: error while loading shared libraries: li ...