Mybatis的初步使用
MyBatis 是当下最流行的持久层框架,也是ORM框架,本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
其中,ORM是指对象-关系映射(OBJECT/RELATIONALMAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于SQL 的关系模型数据库结构中去。这样,我们在具体操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单地操作实体对象的属性和方法 。ORM 技术是在对象和关系之间提供了一座桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
mybatis的特点是:
(1)简单易学:本身就很小且简单。没有任何第三方依赖,安装简单,只要两个jar文件(如:mybatis-3.2.8.jar,mysql-connector-java-5.1.7-bin.jar)+配置几个sql映射文件,易于学习,易于使用,通过文档和源代码,可以比较完全地掌握它的设计思路和实现。
(2)灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,甚至更多。
(3)解除sql与程序代码的耦合:通过提供DAL层(Data Access Layer,数据访问层),将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,也提高了可维护性。
(4)提供映射标签,支持对象与数据库的orm字段关系映射。
(5)提供对象关系映射标签,支持对象关系组建维护。
(6)提供xml标签,支持编写动态sql。
在使用mybatis时,添加mybatis所依赖的jar包。然后配置两个xml文件:
mybatis-config.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="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/XXX?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="2018"/>
</dataSource>
</environment>
</environments>
<!--这个地方也需要配一下。。
引入其他单个实体的ORM映射文件
-->
<mappers>
<mapper resource="config/User.xml"/>
</mappers>
</configuration>
User.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="User">
保证命名空间,和接口的全类名一致,还可以下面这样写,指定一个包可以映射
-->
<mapper namespace="com.itszt.dao.UserDao">
<!-- 映射表和类 -->
<resultMap id="user2Map" type="user2">
<id property="uid" column="uid"></id>
<result property="username1" column="username"></result>
<result property="userage1" column="userage"></result>
<result property="usersalary1" column="usersalary"></result>
<result property="regTime1" column="regTime"></result>
</resultMap>
<!--
id:将来调用该功能的唯一标识,要和方法名保持一致
parameterType:传给通配的参数类型
resultType:最后返回的实体类型
#{uid}:等价于原来的问号通配 uid不是必须写的名称,我们出于见名知意 的原则这样去取名
-->
<select id="findUserByUid" parameterType="int" resultType="com.itszt.User">
SELECT * FROM user WHERE uid=#{uid}
</select>
<!-- resultMap为映射后的类的对象 -->
<select id="findUserByID" parameterType="int" resultMap="user2Map">
SELECT * FROM user WHERE uid=#{uid}
</select> <!--
传入一个实体,插入到数据库,实体的ID由java程序赋值
-->
<insert id="insertTest1" parameterType="itszt.User">
INSERT INTO user VALUES (#{uid},#{username},#{userage},#{usersalary},#{regTime});
</insert>
<!--
传入一个实体,插入到数据库,实体的ID由数据库自动增加
-->
<insert id="insertTest2" parameterType="itszt.User">
INSERT INTO user(username,userage,usersalary,regTime) VALUES (#{username},#{userage},#{usersalary},#{regTime});
</insert> <!--
传入一个实体,插入到数据库,实体的ID由数据库自动增加,并且返回新插入的数据的ID
-->
<insert id="insertTest3" parameterType="itszt.User">
INSERT INTO user(username,userage,usersalary,regTime) VALUES (#{username},#{userage},#{usersalary},#{regTime});
<selectKey keyProperty="uid" keyColumn="uid" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
</insert> <!--
传入一个实体,插入到数据库,实体的ID由数据库自动增加,并且返回新插入的数据的ID,使用order="BEFORE"
-->
<insert id="insertTest4" parameterType="itszt.User2">
INSERT INTO user2 VALUES (#{uid},#{username},#{userage},#{usersalary},#{regTime});
<selectKey keyProperty="uid" keyColumn="uid" resultType="String" order="BEFORE">
select uuid()
</selectKey>
</insert> <!--
查询1:传入一个匹配参数,查询返回单个实体对象
-->
<select id="findUserByUid" parameterType="int" resultType="itszt.User">
SELECT * FROM user WHERE uid=#{uid}
</select>
<!--
1.传入一个实体对象,删除
2.传入一个ID,根据ID进行删除
-->
<delete id="deleteTest1" parameterType="itszt.User">
DELETE FROM user WHERE uid=#{uid}
</delete>
<!--
更新
-->
<update id="updateTest1" parameterType="itszt.User">
UPDATE user set username=#{username} ,userage=#{userage} WHERE uid=#{uid}
</update>
<!--
查询1:传入一个匹配参数,查询返回单个实体对象
-->
<select id="findUserByUid" parameterType="int" resultType="itszt.User">
SELECT * FROM user WHERE uid=#{uid}
</select> <!--
查询2:查询多个实体对象,排序 limit
resultType:依然填写单个实体类型即可
-->
<select id="findUser2" parameterType="double" resultType="itszt.User">
SELECT * FROM user WHERE usersalary>#{value} ORDER BY usersalary DESC limit 0,3
</select> <select id="findUser3" parameterType="String" resultType="itszt.User">
SELECT * FROM user WHERE username LIKE #{value};
</select> <select id="findUser4" parameterType="String" resultType="itszt.User">
SELECT * FROM user WHERE username LIKE '%${value}%';
</select> <select id="findUsersByIDArrays" parameterType="Integer[]" resultType="user">
SELECT * FROM user WHERE uid IN
<foreach collection="array" open="(" close=")" separator="," item="uid">
#{uid}
</foreach>
</select> <!--进行抽取-->
<sql id="sqlUsernamePart">
<if test="username!=null">
AND username=#{username}
</if>
</sql>
<sql id="sqlUseragePart">
<if test="userage!=null">
AND userage=#{userage}
</if>
</sql> <!--演示Sql片段1-->
<select id="testSqlPart1" parameterType="hashMap" resultType="user">
SELECT * FROM user WHERE 1=1
<if test="username!=null">
AND username=#{username}
</if>
<if test="userage!=null">
AND userage=#{userage}
</if>
</select> <!--演示Sql片段2-->
<select id="testSqlPart2" parameterType="hashMap" resultType="user">
SELECT * FROM user
<where>
<if test="username!=null">
AND username=#{username}
</if> <if test="userage!=null">
AND userage=#{userage}
</if>
</where>
</select> <!--演示Sql片段3-->
<select id="testSqlPart3" parameterType="hashMap" resultType="user">
SELECT * FROM user
<where>
<include refid="sqlUsernamePart"></include>
<include refid="sqlUseragePart"></include>
</where>
</select>
</mapper>
下面是User实体类:
package com.itszt;
/**
* 实体类
*/
public class User {
private int uid;
private String username,
userpwd; public int getUid() {
return uid;
} public void setUid(int uid) {
this.uid = uid;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getUserpwd() {
return userpwd;
} public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
} @Override
public String toString() {
return "User{" +
"uid=" + uid +
", username='" + username + '\'' +
", userpwd='" + userpwd + '\'' +
'}';
}
}
测试类:
import com.itszt.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; import java.io.IOException;
import java.io.InputStream; /**
* 测试类
*/
public class Test {
public static void main(String[] args) throws IOException {
//1.基于全局配置文件,加载出一个SqlSessionFactory对象
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2.通过SqlSessionFactory,来获取一个SqlSession,将来我们对于数据库的操作,都是通过SqlSession完成的
SqlSession sqlSession = sqlSessionFactory.openSession(); //3.基于sqlsession调用我们之前在xml中配置好的功能
User user=sqlSession.selectOne("User.findUserByUid",4);
System.out.println("user = " + user); //4.释放资源
sqlSession.close();
}
}
MyBatis 是当下最流行的持久层框架,也是ORM框架,本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
Mybatis的初步使用的更多相关文章
- java 持久框架mybatis的初步学习
什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBati ...
- 对Mybatis的初步认识
1.认识Mybatis MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架. MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索. MyBat ...
- Mybatis学习-初步认知与使用
Mybatis是一款优秀的持久层框架.且支持定制化SQL,存储过程以及高级映射 Mybatis几乎免除了所有的JDBC代码以及设置参数和获取结果集的工作,它使用简单的XML或注解来配置原始类型.接口和 ...
- (一)Mybatis之初步接触
Maven的安装及环境配置 安装及配置只需按照以下三个链接的步骤走 撸帝的博客https://www.funtl.com/zh/maven/Maven-%E5%AE%89%E8%A3%85%E9%85 ...
- 初识 tk.mybatis.mapper
在博客园发表Mybatis Dynamic Query后,一位园友问我知不知道通用mapper,仔细去找了一下,还真的有啊,比较好的就是abel533写的tk.mybatis.mapper. 本次例子 ...
- 初识 tk.mybatis.mapper 通用mapper
在博客园发表Mybatis Dynamic Query后,一位园友问我知不知道通用mapper,仔细去找了一下,还真的有啊,比较好的就是abel533写的tk.mybatis.mapper. 本次例子 ...
- mybatis源码-解析配置文件(二)之解析的流程
目录 1. 简介 2. 配置文件解析流程分析 2.1 调用 2.2 解析的目的 2.3 XML 解析流程 2.3.1 build(parser) 2.3.2 new XMLConfigBuilder( ...
- mybatis源码-解析配置文件(一)之XML的DOM解析方式
目录 简介 Java 中 XML 文件解析 解析方式 DOM 解析 XML 新建 XML 文件 DOM 操作相关类 Java 读取 XML 文件 一起学 mybatis @ 简介 在之前的文章< ...
- SSM初步整合一
SSM(spring+springmvc+mybatis)初步整合一配置步骤: 步骤一.导入所需jar包 步骤二 .配置web.xml文件 <?xml version="1.0&quo ...
随机推荐
- 题解 P1567 【统计天数】
天哪!竟然没人用优先队列! 小金羊又来水题了... 优先队列中的大根堆帮助我们把时间复杂度降到O(n+logn) 首先我们先了解一下大根堆... 大根堆的性质:根节点比子节点大, 这意味着最上面的节点 ...
- 常州day2
Task1 为了测试小 W 的数学水平,果果给了小 W N 个点,问他这 N 个点能构成的三角形个数. 对于 100%的数据:N<=100,保证任意两点不重合,坐标<=10000 恶心题( ...
- 【BZOJ1042】硬币购物(动态规划,容斥原理)
[BZOJ1042]硬币购物(动态规划,容斥原理) 题面 BZOJ Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬 ...
- Python3 字典 fromkeys()方法
Python3 字典 描述 Python 字典 fromkeys() 函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值. 语法 fromkeys()方法语法: ...
- C之面向对象编程20170707
语言只是工具,设计思维才是根本.C虽然是面向过程的语言,但也是可以实现面向对象编程的,本文就是介绍如何使用C语言实现面向对象编程. 我们知道面向对象主要有三大特性:封装,继承,和多态,下面就从这个三个 ...
- C#调用GDI+1.1中的函数实现高斯模糊、USM锐化等经典效果。
http://www.cnblogs.com/Imageshop/archive/2012/12/13/2815712.html 在GDI+1.1的版本中,MS加入不少新的特性,其中的特效类Effec ...
- 安装好dashboard 登录出现错误
验证发生错误.请稍后再试一次. While turning SELinux off certainly does the trick, it is somewhat like using a sled ...
- mac调教指南
最近入手了一个mac, 在此记录下调教的过程. http://note.youdao.com/noteshare?id=5d1eedffab5cb47d4f53970c2ec937aa
- TCP ------ 抓包分析(seq ack)
总结: 1.ACK包可以和其他包合在一起,比如ACK包可以携带数据 2.可以接收多个数据包后,一次性给一个应答,不用每个数据包一一对应给应答 3.在通信过程中,通过接收到的包的ack值可以判断是否是上 ...
- 1.Spring揭秘--Ioc容器
1.Ioc即控制反转,假设一个类需要依赖另外一个类,在最初始的做法就是创建那个依赖类的对象,然后使用这个类提供的功能,如果创建这个依赖类的职责交给Ioc Service Provider去做,那么这就 ...