mybatis入门教程
2016-03-30 07:35
337 查看
刚刚才开始学习mybatis-3.3.0,写这篇博文记录一下
希望随着理解的深入能够不断编辑更新,纠正一些存在谬误的地方,提出一些自己的想法和见解
希望大家多多指教 :)
==========================
mybatis是【半自动化持久层框架】
核心对象是SqlSessionFactory和SqlSession
配置文件 mybatis.cfg.xml
在建立映射和书写sql语句上,有书写xml映射配置文件和注解配置两种方式,一般我们会采用两者结合使用的方式
对于一些简单的sql语句我们使用注解,而复杂的则书写在配置文件中以适应需求、提高性能、便于开发者更好维护
======================================================================================
以web项目为例
第一步是导入JAR包,mybatis-3.3.0.jar、mysql-connector-java-5.1.7-bin.jar
之后我们会在src文件夹中新建【properties文档】,以键值对的格式写明一些用于连接数据库的基本参数信息
jdbc.driver & com.mysql.jdbc.Driver
jdbc.url & jdbc:mysql://localhost:3306/mybatis115?useUnicode=true&characterEncoding=utf-8
jdbc.name & loginName
jdbc.password & password
因为mysql数据库采用GBK编码格式,所以在此写明
useUnicode=true&characterEncoding=utf-8来指明字符的编码解码格式
jdbc.name和jdbc.password分别对应着连接数据库的登录名和密码
采用properties文档而非直接写入mybatis.cfg.xml文件使得项目在数据库连接上更为灵活
==================================================================
现在我们开始在src文件夹中新建【mybatis.cfg.xml】文档书写配置文件
按照惯例
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
使用<properties>标签引入我们刚刚书写的properties文档
<properties resource="datasources.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.name}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
使用<transactionManager>设置事务管理器
这里设置type="POOLED"表明支持JDBC数据源连接池
采用${}的形式取出properties文档中键对应值
现在开始根据业务需求书写实体类和持久层接口
在书写实体类时可以在实体类中
设置访问权限为private,书写公共的无参构造和有参构造、get/set方法,重写toString方法以测试使用mybatis框架
在书写持久层接口后,我们暂时不书写实现类,我们先将尝试使用xml映射配置文件的形式完成一些基本的数据库操作
此时我们需要在mybatis.cfg.xml配置文件<properties>、<environments>标签之间加入<typeAliases>标签
<typeAliases>
<package name=" "></package>
</typeAliases>
将包内的所有实体类的类名,来作为该类的类别名
在<environments>标签之后书写<mappers>标签
<mappers>
<package name=" "/>
</mappers>
告知包内的持久层接口与xml映射配置文件
注意mybatis.cfg.xml配置文件中书写格式由mybatis-3-config.dtd格式文档确立
==========================================================
现在我们开始在放置持久层接口的包中,书写【xml映射配置文件】
按照惯例
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
书写<mapper namespace=" ">命名空间
用于更好的分类sql语句块,防止sql语句块重名
在设置了命名空间后,方可使用“命名空间.语句块名”的形式进行调用相应的sql语句
【添加一条表记录】
首先在添加方法的参数中书写别名
public int saveUserEntity(@Param("u")UserEntity user);
然后书写<insert>标签
<insert id="saveUserEntity" parameterType="UserEntity" useGeneratedKeys="true" keyProperty="u.id">
insert into t_user (user_name,password) values (#{u.userName},#{u.password})
</insert>
id="saveUserEntity" 属性值应与持久层接口对应的方法名一致
parameterType="UserEntity" 用于对应的持久层接口方法接受的参数类型
useGeneratedKeys="true"表示执行完添加语句后可以返回自动增长列的主键值
keyProperty="u.id"表示将返回的主键值填充当前对象id的属性值
#{u.userName}由于在参数中书写别名,所以在此可以使用“别名.属性名”的形式
【修改一条表记录】
<update id="updateUserEntity">
update t_user set user_name = #{userName} where id= #{id}
</update>
【查询一条表记录】
在查询之前我们一般需要在<mapper>标签中书写<resultMap>标签,建立实体类属性和数据库字段的映射关系
一个简单的映射示例:
<resultMap id="userMap" type="UserEntity">
<id property="id" column="id"/>
<result property="id" column="id"/>
<result property="userName" column="user_name"/>
<result property="password" column="password"/>
</resultMap>
id属性是此结果集映射的唯一标识,用于<select>对此映射的调用
type属性指出这个字段对应的数据对象的数据类型
<id>标签可以帮助提高整体效能,特别对于缓存和嵌入结果映射
<select id="getUserEntityByNameAndPassword" resultMap="userMap">
select * from t_user where user_name = #{userName} and password = #{password}
</select>
在上面的<select>标签中,我们利用 resultMap="userMap" 表明适用的结果集映射
虽然这里通过 userName 、password 的匹配,查询用户对象,但显然此用户也没有更多的数据信息了 :)
在实际业务需求中可以设置更多属性(字段)
【删除一条表记录】
<delete id="deleteUserEntity">
delete from t_user where id = #{id}
</delete>
以上即是一些最为基本的增加、修改、查询以及删除的操作了
【关于#和%】
#在生成SQL时,对于字符类型参数,会拼装引号
$在生成SQL时,不会拼装引号
例如:
<select id="findByName" resultMap="userMap">
select * from t_user where u_userName like '%${userName}%'
</select>
====================================================
【批量操作】
批量增加表记录:
<insert id="batchAddUserEntity" parameterType="java.util.List">
insert into t_user (user_name,password) values
<foreach collection="list" item="user" separator=",">
(#{user.userName},#{user.password})
</foreach>
</insert>
批量删除表记录
<delete id="batchDeleteUserEntity">
delete from t_user where id in
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
parameterType="java.util.List" 用于表明对应的mapper接口方法接受的参数类型
<foreach>标签类似于java语言中的for each循环,用于遍历集合中的元素
collection属性的值必须是指定的
如果传入的是单参数且参数类型是一个List集合的时候,collection属性值为list
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
如果传入的参数Map集合,且Map集合中以键值对的形式封装了List集合或array数组
此时collection属性值为List或array对象在Map集合中的键
item 是元素别名
open="(" 表示以英文括号开始
close=")" 表示以英文括号结束
两者之间为遍历结果
separator="," 表示以英文逗号分隔遍历结果
=================================
【动态条件查询】
查询条件是由用户选择的,所以查询语句是动态可变的
为方便代码重用,我们首先将在<mapper>标签中书写条件语句
<sql id="condition">
<if test="userName != null and userName != ''">
and user_name like '%${userName}%'
</if>
<if test ="gender != null and gender != ''">
and gender = #{gender}
</if>
</sql>
<sql>标签用于定义可重用的sql代码段
id="condition" 是此条件语句的唯一标识,以便于查询语句对其的调用
若test="true"则拼接<if>标签中的sql语句
<select id="selectUserEntityByCondition" resultMap="userMap">
select * from t_user where 1=1
<include refid="condition"/>
</select>
使用<include refid="condition"/>即完成了条件语句的动态拼接
===============================================
【mybatis注解】
在建立映射和书写sql语句上,有书写xml映射配置文件和注解配置两种方式,一般我们会采用两者结合使用的方式
使用mybatis注解开发,可以省去类配置文件,简洁方便
但对于复杂的sql语句则书写在配置文件中以适应需求、提高性能、便于开发者更好维护
在书写持久层接口方法时,对应使用mybatis注解:
@Insert("insert into t_user(user_name, password) values(#{u.userName},#{u.password})")public void saveUserEntity(@Param("u")UserEntity user) throws Exception;
@Update("update t_user set user_name = #{userName} where id = #{id}")
public void updateUserEntity(Integer id, String userName);
@Delete("delete from t_user where id = #{id}")public void del(Integer id) throws Exception;
由于查询语句需要涉及<resultMap>结果集映射
如果书写在持久层接口中显得可读性差且不易维护
尤其是在面临连表查询时,激增的代码量使得这一缺陷更为突出
所以我们一般将其保留在xml映射配置文件中
=================================
【连表查询】
由于在业务需求中我们往往面临多样的数据库间表关系,一对一、一对多、多对多
因而mybatis提供了关联查询语句以满足开发者需求
在进行连表查询之前我们需要认识两个非常相似的标签:
<association> 关联标签
<collection> 集合标签
每日更新,未完待续。
希望随着理解的深入能够不断编辑更新,纠正一些存在谬误的地方,提出一些自己的想法和见解
希望大家多多指教 :)
==========================
mybatis是【半自动化持久层框架】
核心对象是SqlSessionFactory和SqlSession
配置文件 mybatis.cfg.xml
在建立映射和书写sql语句上,有书写xml映射配置文件和注解配置两种方式,一般我们会采用两者结合使用的方式
对于一些简单的sql语句我们使用注解,而复杂的则书写在配置文件中以适应需求、提高性能、便于开发者更好维护
======================================================================================
以web项目为例
第一步是导入JAR包,mybatis-3.3.0.jar、mysql-connector-java-5.1.7-bin.jar
之后我们会在src文件夹中新建【properties文档】,以键值对的格式写明一些用于连接数据库的基本参数信息
jdbc.driver & com.mysql.jdbc.Driver
jdbc.url & jdbc:mysql://localhost:3306/mybatis115?useUnicode=true&characterEncoding=utf-8
jdbc.name & loginName
jdbc.password & password
因为mysql数据库采用GBK编码格式,所以在此写明
useUnicode=true&characterEncoding=utf-8来指明字符的编码解码格式
jdbc.name和jdbc.password分别对应着连接数据库的登录名和密码
采用properties文档而非直接写入mybatis.cfg.xml文件使得项目在数据库连接上更为灵活
==================================================================
现在我们开始在src文件夹中新建【mybatis.cfg.xml】文档书写配置文件
按照惯例
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
使用<properties>标签引入我们刚刚书写的properties文档
<properties resource="datasources.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.name}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
使用<transactionManager>设置事务管理器
这里设置type="POOLED"表明支持JDBC数据源连接池
采用${}的形式取出properties文档中键对应值
现在开始根据业务需求书写实体类和持久层接口
在书写实体类时可以在实体类中
设置访问权限为private,书写公共的无参构造和有参构造、get/set方法,重写toString方法以测试使用mybatis框架
在书写持久层接口后,我们暂时不书写实现类,我们先将尝试使用xml映射配置文件的形式完成一些基本的数据库操作
此时我们需要在mybatis.cfg.xml配置文件<properties>、<environments>标签之间加入<typeAliases>标签
<typeAliases>
<package name=" "></package>
</typeAliases>
将包内的所有实体类的类名,来作为该类的类别名
在<environments>标签之后书写<mappers>标签
<mappers>
<package name=" "/>
</mappers>
告知包内的持久层接口与xml映射配置文件
注意mybatis.cfg.xml配置文件中书写格式由mybatis-3-config.dtd格式文档确立
==========================================================
现在我们开始在放置持久层接口的包中,书写【xml映射配置文件】
按照惯例
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
书写<mapper namespace=" ">命名空间
用于更好的分类sql语句块,防止sql语句块重名
在设置了命名空间后,方可使用“命名空间.语句块名”的形式进行调用相应的sql语句
【添加一条表记录】
首先在添加方法的参数中书写别名
public int saveUserEntity(@Param("u")UserEntity user);
然后书写<insert>标签
<insert id="saveUserEntity" parameterType="UserEntity" useGeneratedKeys="true" keyProperty="u.id">
insert into t_user (user_name,password) values (#{u.userName},#{u.password})
</insert>
id="saveUserEntity" 属性值应与持久层接口对应的方法名一致
parameterType="UserEntity" 用于对应的持久层接口方法接受的参数类型
useGeneratedKeys="true"表示执行完添加语句后可以返回自动增长列的主键值
keyProperty="u.id"表示将返回的主键值填充当前对象id的属性值
#{u.userName}由于在参数中书写别名,所以在此可以使用“别名.属性名”的形式
【修改一条表记录】
<update id="updateUserEntity">
update t_user set user_name = #{userName} where id= #{id}
</update>
【查询一条表记录】
在查询之前我们一般需要在<mapper>标签中书写<resultMap>标签,建立实体类属性和数据库字段的映射关系
一个简单的映射示例:
<resultMap id="userMap" type="UserEntity">
<id property="id" column="id"/>
<result property="id" column="id"/>
<result property="userName" column="user_name"/>
<result property="password" column="password"/>
</resultMap>
id属性是此结果集映射的唯一标识,用于<select>对此映射的调用
type属性指出这个字段对应的数据对象的数据类型
<id>标签可以帮助提高整体效能,特别对于缓存和嵌入结果映射
<select id="getUserEntityByNameAndPassword" resultMap="userMap">
select * from t_user where user_name = #{userName} and password = #{password}
</select>
在上面的<select>标签中,我们利用 resultMap="userMap" 表明适用的结果集映射
虽然这里通过 userName 、password 的匹配,查询用户对象,但显然此用户也没有更多的数据信息了 :)
在实际业务需求中可以设置更多属性(字段)
【删除一条表记录】
<delete id="deleteUserEntity">
delete from t_user where id = #{id}
</delete>
以上即是一些最为基本的增加、修改、查询以及删除的操作了
【关于#和%】
#在生成SQL时,对于字符类型参数,会拼装引号
$在生成SQL时,不会拼装引号
例如:
<select id="findByName" resultMap="userMap">
select * from t_user where u_userName like '%${userName}%'
</select>
====================================================
【批量操作】
批量增加表记录:
<insert id="batchAddUserEntity" parameterType="java.util.List">
insert into t_user (user_name,password) values
<foreach collection="list" item="user" separator=",">
(#{user.userName},#{user.password})
</foreach>
</insert>
批量删除表记录
<delete id="batchDeleteUserEntity">
delete from t_user where id in
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
parameterType="java.util.List" 用于表明对应的mapper接口方法接受的参数类型
<foreach>标签类似于java语言中的for each循环,用于遍历集合中的元素
collection属性的值必须是指定的
如果传入的是单参数且参数类型是一个List集合的时候,collection属性值为list
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
如果传入的参数Map集合,且Map集合中以键值对的形式封装了List集合或array数组
此时collection属性值为List或array对象在Map集合中的键
item 是元素别名
open="(" 表示以英文括号开始
close=")" 表示以英文括号结束
两者之间为遍历结果
separator="," 表示以英文逗号分隔遍历结果
=================================
【动态条件查询】
查询条件是由用户选择的,所以查询语句是动态可变的
为方便代码重用,我们首先将在<mapper>标签中书写条件语句
<sql id="condition">
<if test="userName != null and userName != ''">
and user_name like '%${userName}%'
</if>
<if test ="gender != null and gender != ''">
and gender = #{gender}
</if>
</sql>
<sql>标签用于定义可重用的sql代码段
id="condition" 是此条件语句的唯一标识,以便于查询语句对其的调用
若test="true"则拼接<if>标签中的sql语句
<select id="selectUserEntityByCondition" resultMap="userMap">
select * from t_user where 1=1
<include refid="condition"/>
</select>
使用<include refid="condition"/>即完成了条件语句的动态拼接
===============================================
【mybatis注解】
在建立映射和书写sql语句上,有书写xml映射配置文件和注解配置两种方式,一般我们会采用两者结合使用的方式
使用mybatis注解开发,可以省去类配置文件,简洁方便
但对于复杂的sql语句则书写在配置文件中以适应需求、提高性能、便于开发者更好维护
在书写持久层接口方法时,对应使用mybatis注解:
@Insert("insert into t_user(user_name, password) values(#{u.userName},#{u.password})")public void saveUserEntity(@Param("u")UserEntity user) throws Exception;
@Update("update t_user set user_name = #{userName} where id = #{id}")
public void updateUserEntity(Integer id, String userName);
@Delete("delete from t_user where id = #{id}")public void del(Integer id) throws Exception;
由于查询语句需要涉及<resultMap>结果集映射
如果书写在持久层接口中显得可读性差且不易维护
尤其是在面临连表查询时,激增的代码量使得这一缺陷更为突出
所以我们一般将其保留在xml映射配置文件中
=================================
【连表查询】
由于在业务需求中我们往往面临多样的数据库间表关系,一对一、一对多、多对多
因而mybatis提供了关联查询语句以满足开发者需求
在进行连表查询之前我们需要认识两个非常相似的标签:
<association> 关联标签
<collection> 集合标签
每日更新,未完待续。
相关文章推荐
- 编译gRPC
- 如何通过DBMS_SQL获取DBA权限的
- google多语言通信框架gRPC
- lintcode-medium-Maximal Square
- Gradle sync failed: Gradle version 2.2 is required. Current version is 2.10.
- 【杭电】[1874]畅通工程续
- 【杭电】[2544]最短路
- 【杭电】[1087]Super Jumping! Jumping! Jumping!
- bzoj4408 神秘数 主席树
- 数据结构之双端(通用)链表的实现
- 【BZOJ 3048】【USACO2013 Jan】Cow Lineup 滑块思想
- poj2396
- 15电气臧洪颖15个数的大小排序
- Qt13 Creating connection open and close function with sqlite database
- 15电气臧洪颖比较两个数的大小
- 【BZOJ-2879】美食节 最小费用最大流 + 动态建图
- 关于.NET技术前途问题的讨论
- 基于轻量型Web服务器Raspkate的RESTful API的实现
- fire net
- 作业4词频统计2