发展介绍:https://github.com/mybatis/mybatis-3/releases
- MyBatis是apache的一个开源项目iBatis, 实质上Mybatis对ibatis进行一些改进。
- MyBatis是一个持久层框架,它对jdbc操作数据库的过程进行封装;开发者只需要关注SQL本身,不需要去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程。
原理:
Mybatis通过xml或注解方式将要执行的各种statement(statement、preparedStatement、CallableStatement)配置,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
Mybatis执行流程
配置文件
- 全局配置:数据源、事务等
- 映射配置:配置了SQL执行相关
全局配置:SqlMapConfig.xml
Mybatis配置文件头---可以从mybatis-3.x.x.pdf文件复制
<?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>
<!-- 数据源信息可以用${}配置 ,下面写了,此处可不写 全局修改-->
<!-- 读取数据库连接信息 -->
<properties resource="db.properties"/>
<!-- 配置mybatis的环境信息 -->
<environments default="development">
<environment id="development">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源,采用dbcp连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="12345"/>
</dataSource>
<!-- 配置数据源,采用dbcp连接池 配合 db.properties 全局修改-->
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- mybatis加载映射文件-->
<mappers>
<package name="com.zjc.mapper"></package>
</mappers>
<!-- 配置别名 -->
<typeAliases>
<!-- 方式一:直接指定类名,自定义别名-->
<typeAlias type="com.zjc.model.User" alias="user"></typeAlias>
<!-- 方式二:指定包名时,别名就是类名的小写,例如 User类 别名就是user-->
<package name="com.zjc.model"></package>
</typeAliases>
</configuration>
typeAliases别名:
-
在映射文件中可以方便的去指定参数和结果集的类型
- 方式一:直接指定类名,自定义别名
- 方式二:指定包名时,别名就是类名的小写,例如 User类 别名就是user
加载映射文件方式:
- 方式一:写映射文件的名字(仅限dao方式) <mapper resource="com/zjc/mapper/UserMapper.xml"></mapper>
- 方式二:写类名,一定要有个映射文件与之对应 <mapper class="com.zjc.mapper.UserMapper"></mapper>
- 如果没有,那么在UserMapper要声明注解(mapper.xml中的执行语句)(不建议)
- 方式三:写包名 <package name="com.zjc.mapper"></package>(强力推荐)(mapper方式)
映射文件配置:User.xml映射文件 (com.zjc.mapper)
Mybatis的映射文件---可以从mybatis-3.x.x.pdf文件中复制
<?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="com.zjc.mapper.XxxMapper">
<!-- 测试 -->
<select id="findUserById" parameterType="int" resultType="com.zjc.model.User">
SELECT * FROM USER WHERE id = #{id}
</select>
</mapper>
- id:statement的id,要求在命名空间内唯一
- parameterType:传入参数的java类型
- resultType:查询出的单条结果集对应的java类型
- #{}: 表示一个占位符?
- #{id}:表示该占位符待接收参数的名称为id。如果参数为简单类型时,#{}里面的参数名称可以任意定义
resultType和resultMap关系
使用resultType进行结果映射时,列名和映射的pojo属性名完全一致,该列才能映射成功(全不为null),全部不一致,则不会创建pojo对象;有一个一致,就会创建pojo对象(部分为null);如果查询出来的列名和属性名不一致,可以通过定义一个resultMap将列名和pojo属性名之间作一个映射关系。
<!--.设置返回数据为resultMap --> <resultMap id="userResultMap" type="user"> <id property="id" column="id_"></id> <result property="username" column="username_"></result> <result property="sex" column="sex_"></result> <result property="birthday" column="birthday_"></result> <result property="address" column="address_"></result> </resultMap> <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap"> SELECT id id_, username username_, sex sex_, birthday birthday_, address address_ FROM user WHERE id = #{id} </select>
案例分析:
模糊查询 like '%${value}%' value在方法调用传入
<select id="findUserByName" parameterType="String" resultType="com.gyf.domain.User"> SELECT * FROM USER WHERE username like '%${value}%' </select>
- ${}:表示拼接SQL字符串
- ${value}:参数为简单类型时,参数名称必须为value
- ${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname
增删改
<!--插入数据--> <insert id="insertUser" parameterType="com.zjc.model.User"> INSERT INTO user (username,sex,birthday,address) VALUE (#{username},#{sex},#{birthday},#{address}); </insert> <!--删除--> <delete id="deleteUser" parameterType="int"> DELETE FROM user where id = #{id}; </delete> <!--更新--> <update id="updateUser" parameterType="com.zjc.model.User"> UPDATE user SET address = #{address},sex = #{sex} WHERE id = #{id} </update>
主键返回:自增主键 :获取到刚插入的自增主键
<insert id="insertUser" parameterType="com.zjc.model.User"> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO USER (username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address}) </insert>
- selectKey标签:通过select查询来生成主键
- keyProperty:自增主键对应数据库列名
- resultType:主键所对应的Java类型
- order:指定查询主键SQL语句的执行顺序,after==执行完insert查询语句返回主键
- last_insert_id:MySQL的函数,要配合insert语句一起使用
主键返回:自增UUID
<insert id="insertUser" parameterType="com.zjc.model.User"> <selectKey keyProperty="id" resultType="String" order="BEFORE"> SELECT UUID() </selectKey> INSERT INTO USER (username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address}) </insert>