JavaEE-ORM映射器MyBatis
2015-12-15 11:49
489 查看
MyBatis
sf2gis@163.com
2015年12月9日
//mybatis.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>
<environmentsdefault="development">
<environmentid="development">
<transactionManagertype="JDBC" />
<!--配置数据库连接信息 -->
<dataSourcetype="POOLED">
<propertyname="driver" value="com.mysql.jdbc.Driver" />
<propertyname="url" value="jdbc:mysql://localhost:3306/hib4" />
<propertyname="username" value="root" />
<propertyname="password" value="sf" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 注册userMapper.xml文件,userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
<mapperresource="empMapper.xml" />
</mappers>
</configuration>
package lee;
import java.io.Serializable;
public class Employee implements Serializable{
privateint id;
privateString emp_Name;
privateString emp_Address;
privateString emp_Mobile_Nos;
publicint getId() {
returnid;
}
publicvoid setId(int id) {
this.id= id;
}
publicString getEmp_Name() {
returnemp_Name;
}
publicvoid setEmp_Name(String emp_Name) {
this.emp_Name= emp_Name;
}
publicString getEmp_Address() {
returnemp_Address;
}
publicvoid setEmp_Address(String emp_Address) {
this.emp_Address= emp_Address;
}
publicString getEmp_Mobile_Nos() {
returnemp_Mobile_Nos;
}
publicvoid setEmp_Mobile_Nos(String emp_Mobile_Nos) {
this.emp_Mobile_Nos= emp_Mobile_Nos;
}
}
<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper 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="lee.empMapper">
<!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
User类就是users表所对应的实体类
-->
<!--
根据id查询得到一个user对象
-->
<selectid="getUser" parameterType="int"
resultType="lee.Employee">
select * from employee where id=#{id}
</select>
</mapper>
package lee;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
importorg.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Main {
publicstatic void main(String[] args) {
//TODO Auto-generated method stub
//mybatis的配置文件
Stringresource = "mybatis.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = Main.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = newSqlSessionFactoryBuilder().build(is);
//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
//Reader reader = Resources.getResourceAsReader(resource);
//构建sqlSession的工厂
//SqlSessionFactory sessionFactory = newSqlSessionFactoryBuilder().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 ="lee.empMapper.getUser";//映射sql的标识字符串
//执行查询返回一个唯一user对象的sql
Employee user =session.selectOne(statement, 1);
System.out.println(user.getEmp_Name());
}
}
结果:
configuration 配置,根节点
-|properties 属性,变量定义
-|environments 环境,全局配置
--|environment 环境变量,独立的配置,可以定义多个
---|transactionManager 事务管理器,连接池
---|dataSource 数据源,数据库连接配置
-|mappers 映射器,SQL操作映射
mapper:映射根元素,需要指定一个唯一的namespace属性,一般使用文件的包路径。
-|cache – 给定命名空间的缓存配置。
-|cache-ref – 其他命名空间缓存配置的引用。
-|resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
-|sql – 可被其他语句引用的可重用语句块。
-|insert – 插入语句
-|update – 更新语句
-|delete – 删除语句
-|select – 查询语句,包含唯一标识id,参数类型parameterType,返回值类型resultType。
InputStream inputStream =Resources.getResourceAsStream(resource);
//执行查询返回一个唯一user对象的sql
Employee user =session.selectOne(statement, 1);
操作:Hibernate对PO操作,直接映射为SQL操作。MyBatis需要配置操作SQL,然后执行,不能直接映射PO操作。
易用性:Hibernate(推荐)学习较MyBatis更复杂一些,但是操作简单。
参考:http://baike.baidu.com/view/628102.htm
sf2gis@163.com
2015年12月9日
1 目标:实现对象和关系的映射。
包括对象和关系的实体映射及实体操作的映射。2 原理:将表映射为一个类,列映射为类的属性,行映射为对象,OO行为映射为SQL操作(由映射文件配置SQL操作)。
PO=POJO+与表相同列属性。3 流程:安装,配置数据库,创建实体类,创建SQL操作映射文件,操作实体类。
参考:http://www.cnblogs.com/xdp-gacl/p/4261895.html3.1 创建JavaApplication。
3.2 安装:下载mybatis。解压,复制mybatis-3.2.8.jar到lib目录,并添加到classpath。
3.3 配置数据库:复制相应的数据库驱动到lib,并添加到classpath。配置数据库连接参数的xml。
本机使用mysql-connector-java-5.0.8.jar。//mybatis.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>
<environmentsdefault="development">
<environmentid="development">
<transactionManagertype="JDBC" />
<!--配置数据库连接信息 -->
<dataSourcetype="POOLED">
<propertyname="driver" value="com.mysql.jdbc.Driver" />
<propertyname="url" value="jdbc:mysql://localhost:3306/hib4" />
<propertyname="username" value="root" />
<propertyname="password" value="sf" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 注册userMapper.xml文件,userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
<mapperresource="empMapper.xml" />
</mappers>
</configuration>
3.4 创建实体类:创建对应于数据库表的实体类。属性名与列名对应的bean(有get/set,有无参构建函数)。
//Employee.javapackage lee;
import java.io.Serializable;
public class Employee implements Serializable{
privateint id;
privateString emp_Name;
privateString emp_Address;
privateString emp_Mobile_Nos;
publicint getId() {
returnid;
}
publicvoid setId(int id) {
this.id= id;
}
publicString getEmp_Name() {
returnemp_Name;
}
publicvoid setEmp_Name(String emp_Name) {
this.emp_Name= emp_Name;
}
publicString getEmp_Address() {
returnemp_Address;
}
publicvoid setEmp_Address(String emp_Address) {
this.emp_Address= emp_Address;
}
publicString getEmp_Mobile_Nos() {
returnemp_Mobile_Nos;
}
publicvoid setEmp_Mobile_Nos(String emp_Mobile_Nos) {
this.emp_Mobile_Nos= emp_Mobile_Nos;
}
}
3.5 创建SQL映射文件:创建SQL操作对应的映射文件,并将此文件注册到数据库配置文件的mapper中。
//empMapper.xml<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper 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="lee.empMapper">
<!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
User类就是users表所对应的实体类
-->
<!--
根据id查询得到一个user对象
-->
<selectid="getUser" parameterType="int"
resultType="lee.Employee">
select * from employee where id=#{id}
</select>
</mapper>
3.6 操作实体类:连接数据库后,傅SQL操作id,传递参数执行。
//Main.javapackage lee;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
importorg.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Main {
publicstatic void main(String[] args) {
//TODO Auto-generated method stub
//mybatis的配置文件
Stringresource = "mybatis.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = Main.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = newSqlSessionFactoryBuilder().build(is);
//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
//Reader reader = Resources.getResourceAsReader(resource);
//构建sqlSession的工厂
//SqlSessionFactory sessionFactory = newSqlSessionFactoryBuilder().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 ="lee.empMapper.getUser";//映射sql的标识字符串
//执行查询返回一个唯一user对象的sql
Employee user =session.selectOne(statement, 1);
System.out.println(user.getEmp_Name());
}
}
结果:
4 方法:配置和操作
参考:http://mybatis.org/mybatis-3/zh/dynamic-sql.html4.1 数据库配置
4.1.1组织结构
参考:http://mybatis.org/mybatis-3/zh/configuration.htmlconfiguration 配置,根节点
-|properties 属性,变量定义
-|environments 环境,全局配置
--|environment 环境变量,独立的配置,可以定义多个
---|transactionManager 事务管理器,连接池
---|dataSource 数据源,数据库连接配置
-|mappers 映射器,SQL操作映射
4.2 SQL操作配置
参考:http://mybatis.org/mybatis-3/zh/sqlmap-xml.htmlmapper:映射根元素,需要指定一个唯一的namespace属性,一般使用文件的包路径。
-|cache – 给定命名空间的缓存配置。
-|cache-ref – 其他命名空间缓存配置的引用。
-|resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
-|sql – 可被其他语句引用的可重用语句块。
-|insert – 插入语句
-|update – 更新语句
-|delete – 删除语句
-|select – 查询语句,包含唯一标识id,参数类型parameterType,返回值类型resultType。
4.3 实体操作方法
4.3.1目标:连接数据库,进行SQL操作。
4.3.2原理:读取配置,通过驱动连接数据库,进行SQL操作。
4.3.3流程:读取配置文件,创建连接工厂,打开连接,执行SQL映射操作。
4.3.3.1 读取配置文件:读取xml文件为流。
String resource ="org/mybatis/example/mybatis-config.xml";InputStream inputStream =Resources.getResourceAsStream(resource);
4.3.3.2 创建连接工厂:使用配置文件流。
sqlSessionFactory = newSqlSessionFactoryBuilder().build(inputStream);4.3.3.3 打开连接:使用连接工厂打开。
SqlSession session =sqlSessionFactory.openSession();4.3.3.4 执行SQL映射操作:根据SQL映射文件定义的id,传入参数执行。
String statement ="lee.empMapper.getUser";//映射sql的标识字符串//执行查询返回一个唯一user对象的sql
Employee user =session.selectOne(statement, 1);
5 示例:
6 扩展:
6.1 与Hibernate区别
ORM:都实现了ORM,但是Hibernate的实体映射需要配置,MyBatis只需要实体类对应即可。操作:Hibernate对PO操作,直接映射为SQL操作。MyBatis需要配置操作SQL,然后执行,不能直接映射PO操作。
易用性:Hibernate(推荐)学习较MyBatis更复杂一些,但是操作简单。
6.2 iBatis与MyBatis
MyBatis=iBatis3参考:http://baike.baidu.com/view/628102.htm
相关文章推荐
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- ASP也使用ORM,给ASP上所有的SQL注入画上句号
- 分享J2EE的13种核心技术
- 深入浅析mybatis oracle BLOB类型字段保存与读取
- ibatis简单实现与配置
- 仿orm自动生成分页SQL分享
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
- 浅析Mybatis 在CS程序中的应用
- Java Mybatis框架入门基础教程
- 深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
- JavaEE通过response实现请求重定向
- JavaEE实现文件下载
- Laravel 5框架学习之Eloquent (laravel 的ORM)
- 用 Composer构建自己的 PHP 框架之使用 ORM
- JavaEE中关于ServletConfig的小结
- Java简单实现SpringMVC+MyBatis分页插件
- 浅析mybatis和spring整合的实现过程
- J2EE项目代码编写规范分享
- mybatis的动态sql详解(精)
- JavaEE实现前后台交互的文件上传与下载