MyBatis简单实例
---直接贴代码
(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简单实例的更多相关文章
- SpringMVC笔记——Spring+MyBatis组合开发简单实例
简介 SSH框架很强大,适合大型项目开发.但学无止境,多学会一门框架组合开发会让自己增值许多. SSM框架小巧精致,适合中小型项目快速开发,对于新手来说也是简单上手的.在SSM框架搭建之前,我们先学习 ...
- TypeHandler的简单实例
转自:http://ccchhhlll1988-163-com.iteye.com/blog/1420149 TypeHandler是MyBatis config文件中可选的配置选项,其可以对实体属性 ...
- SpringMVC笔记——SSM框架搭建简单实例
落叶枫桥 博客园 首页 新随笔 联系 订阅 管理 SpringMVC笔记——SSM框架搭建简单实例 简介 Spring+SpringMVC+MyBatis框架(SSM)是比较热门的中小型企业级项目开发 ...
- mybatis简单项目
1,mybatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可 ...
- 浅析MyBatis(二):手写一个自己的MyBatis简单框架
在上一篇文章中,我们由一个快速案例剖析了 MyBatis 的整体架构与整体运行流程,在本篇文章中笔者会根据 MyBatis 的运行流程手写一个自定义 MyBatis 简单框架,在实践中加深对 MyBa ...
- Hibernate(二)__简单实例入门
首先我们进一步理解什么是对象关系映射模型? 它将对数据库中数据的处理转化为对对象的处理.如下图所示: 入门简单实例: hiberante 可以用在 j2se 项目,也可以用在 j2ee (web项目中 ...
- 最新 Eclipse IDE下的Spring框架配置及简单实例
前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...
- 修改js confirm alert 提示框文字的简单实例
修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...
- 利用navicat创建存储过程、触发器和使用游标的简单实例
利用navicat创建存储过程.触发器和使用游标的简单实例 标签: navicat存储过程触发器mysql游标 2013-08-03 21:34 15516人阅读 评论(1) 收藏 举报 分类: 数 ...
随机推荐
- torch7安装
按照官网进行安装即可;(http://torch.ch/docs/getting-started.html#_) # in a terminal, run the commands WITHOUT s ...
- Java 多字符分割字符串
有时候要对不规整的数据进行分割处理,数据中可能会出现一个或多个不同的分割符,这时需要用到 String.split() 方法来进行分割,代码如下: String string = "张三:李 ...
- Eclipse 的 Debug 介绍与技巧【转载】
没有任何程序员能够一气呵成的写出没有任何 Bug 的代码,所以很多程序员有相当一部分时间是花费在 Debug 上的,程序调试是每个程序员必须面对的工作.如何使用 Eclipse 进行有效的.尤其是高效 ...
- c#中ref和out 关键字
问题:为什么c#中要有ref和out?(而java中没有)需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class ...
- AC自动机 LA 4670 Dominating Patterns
题目传送门 题意:训练指南P216 分析:求出现最多次数的字串,那么对每个字串映射id,cnt记录次数求最大就可以了. #include <bits/stdc++.h> using nam ...
- mvn exec用法,运行jar后台驻留进程
java工程如果打包成war,那依赖的jar包都会被包含进去. 不过如果开发java的后台驻留进程,那一般会打包成jar包的形式,要想在运行进程的时候找到所有的依赖包,基本有如下两种方式: 方式一: ...
- 安装和配置Tomcat
今天第一个技术难题,说难也不难,被鄙视的彻彻底底. 理解上的问题纠正:Xftp里面我们看到的只是自己电脑上和所连接服务器里面的文件,集群里面有master 服务器和slaves 服务器 ,一个Nam ...
- ReSharper 配置及用法(一)
ReSharper是一个JetBrains公司出品的著名的代码生成工具,其能帮助Microsoft Visual Studio成为一个更佳的IDE.它包括一系列丰富的能大大增加C#和Visual Ba ...
- SolrCloud-4.10.2源代码启动流程梳理
SolrCloud-4.10.2源代码 web.xml中filter配置 SolrDispatchFilter <filter-name>SolrRequestFilter</fil ...
- 对只转发结果集的无效操作 first
今天只用jdbc连接Oracle查询结果时,出现了一个: 对只转发结果集的无效操作 first 的错误java.sql.sqlexception. 出现这个结果的原因是:使用 Statement st ...