mybaties

Posted zlatanlk9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybaties相关的知识,希望对你有一定的参考价值。

Mybaties介绍

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

Mybaties 架构

1、Mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2、通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程

工程搭建

1.新建项目工程
2.导入Mybaties相关jar包

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>

在classpathe下创建log4j.properties
  1. 在classpath下创建SqlMapConfig.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>
    	<!-- 和spring整合后 environments配置将废除-->
    	<environments default="development">
    		<environment id="development">
    		<!-- 使用jdbc事务管理-->
    			<transactionManager type="JDBC" />
    		<!-- 数据库连接池-->
    			<dataSource type="POOLED">
    				<property name="driver" value="com.mysql.jdbc.Driver" />
    				<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
    				<property name="username" value="root" />
    				<property name="password" value="root" />
    			</dataSource>
    		</environment>
    	</environments>
    </configuration>
    
  2. 1创建POJO类 就是实体类
  3. 在classpath下的sqlmap目录下创建sql映射文件:

    	<?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="test">
    	</mapper>

7.加载映射文件,将sql映射文件加载到SqlMapConfig.xml:

<mappers>
		<mapper resource="sqlmap/User.xml"/>
</mappers>

 

 

映射文件中的Sql语句编写

<select>代表查询 sql <interst>插入 <update>修改 <deleate>删除

在sql映射文件中添加:

<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
	select * from user where id = #{id}
</select>

parameterType:定义输入到sql中的映射类型,#{id}表示使用。#{id}只是一个占位符相当于"?" "{}"中的字母id可以是任意的其他什么不一定要叫id
preparedstatement设置占位符号并将输入变量id传到sql。
resultType:定义结果映射类型。
意思是 方法的名字叫做findUserById 方法参数 int类型的值 返回结果User类型的实体

<select id="findUserByUsername" parameterType="java.lang.String" 
		resultType="cn.itcast.mybatis.po.User">
   select * from user where username like ‘%${value}%‘ 
</select>

parameterType:定义输入到sql中的映射类型,v a l u e 表 示 使 用 参 数 将 {value}表示使用参数将value使将{value}替换,做字符串的拼接。
注意:如果是取简单数量类型的参数,括号中的值必须为value
resultType:定义结果映射类型。

#{}和${}的区别

#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

表 示 拼 接 s q l 串 , 通 过 {}表示拼接sql串,通过sql过{}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, 可 以 接 收 简 单 类 型 值 或 p o j o 属 性 值 , 如 果 p a r a m e t e r T y p e 传 输 单 个 简 单 类 型 值 , {}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,pojoparameterType,{}括号中只能是value。

DAO层开发mapper动态代理

Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper接口开发需要遵循以下规范:
1、Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
Mapper.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="cn.itcast.mybatis.mapper.UserMapper">
<!-- 根据id获取用户信息 -->
	<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
		select * from user where id = #{id}
	</select>
<!-- 自定义条件查询用户列表 -->
	<select id="findUserByUsername" parameterType="java.lang.String" 
			resultType="cn.itcast.mybatis.po.User">
	   select * from user where username like ‘%${value}%‘ 
	</select>
<!-- 添加用户 -->
	<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
	<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
		select LAST_INSERT_ID() 
	</selectKey>
	  insert into user(username,birthday,sex,address) 
	  values(#{username},#{birthday},#{sex},#{address})
	</insert>

</mapper>

mapper.java接口文件

		Public interface UserMapper {
			//根据用户id查询用户信息
			public User findUserById(int id) throws Exception;
			//查询用户列表
			public List<User> findUserByUsername(String username) throws Exception;
			//添加用户信息
			public void insertUser(User user)throws Exception; 
		}

根据阿里开发手册 方法前的修饰词最好不要加。
接口定义有如下特点:
1、Mapper接口方法名和Mapper.xml中定义的statement的id相同
2、Mapper接口方法的输入参数类型和mapper.xml中定义的statement的parameterType的类型相同
3、Mapper接口方法的输出参数类型和mapper.xml中定义的statement的resultType的类型相同

自定义映射类型别名

7.3.2自定义别名:
在SqlMapConfig.xml中配置:

<typeAliases>
		<!-- 单个别名定义 -->
		<typeAlias alias="user" type="cn.itcast.mybatis.po.User"/>
		<!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) -->
		<package name="cn.itcast.mybatis.po"/>
	</typeAliases>

单个别名定义和扫描包方式不能同时使用。

parameterType 的类型可以是简单类型(四类八种)也可以是POJO类型
当传入的参数是POJO类型时可以通过#{实体类属性}的方法获取对应的属性值
当实体类中封装着另一个实体类时可以通过{“属性.属性”}的方法来获取

<select id="findUserByQueryVo" parameterType="queryvo" resultType="user">
		SELECT * FROM user where username like ‘%${user.username}%‘
</select>

resultMap

resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

动态sql

<if>   <where>    <foreach>

where If

select id="findUserList" parameterType="user" resultType="user">
	select * from user 
	<where>
	<if test="id!=null and id!=‘‘">
	and id=#{id}
	</if>
	<if test="username!=null and username!=‘‘">
	and username like ‘%${username}%‘
	</if>
	</where>
</select>

where if 经常一起使用
if 标签 当test 条件符合时就会将标签里的sql语句拼接上
<where> 相当于 where 并且自动消除第一个符合 if 条件里sql语句前面的’and’

foreach

向sql传递数组或List,mybatis使用foreach解析

<if test="ids!=null and ids.size>0">
	    	<foreach collection="ids" open=" and id in(" close=")" item="id" separator="," >
	    		#{id}
	    	</foreach>
</if>

接受了一个名为ids的数组然后foreach遍历数组ids中每个元素名为id与#{id}对应
每个元素之间以 ","分隔 相当于 and id in (id1,id2,id3)

 




































以上是关于mybaties的主要内容,如果未能解决你的问题,请参考以下文章

SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

mybatis动态sql片段与分页,排序,传参的使用

MyBatis动态SQL标签用法

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

mybatis动态sql之利用sql标签抽取可重用的sql片段

[mybatis]动态sql_sql_抽取可重用的sql片段