您的位置:首页 > 其它

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> 集合标签

每日更新,未完待续。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: