简介
什么是 MyBatis ?
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
注意
使用mybatis接口模式方法不能重载 类模式可以重载
但开发都是接口模式 id=方法名
- 类模式
//增删改是有事物的 查可以说没有
//MyBatis默认是执行SQL语句之前是写了begin的
//MyBatis默认是是手动提交,那就需要显示的写代码提交
sqlSession.commit();
Mapper XML 文件
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 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">
SQL 映射文件有很少的几个顶级元素
- mapper namespace="" 命名空间=包名.类名
<mapper namespace ="top.maniy.mapper.PhotoMapper">
- cache – 给定命名空间的缓存配置。
- cache-ref – 其他命名空间缓存配置的引用。
(mybatis的缓存一般很少用)
如果接口参数是对象,sql语句中的#{name}需要和对象属性名一致
- insert – 映射插入语句
<!--增删改返回值都是int,所有resultType="int" ,但是增删改的resultType可以不写-->
<!-- 处理主键的生成<insert id="insertAuthor" useGeneratedKeys="true"
keyProperty="id">
-->
<insert id="saveUser" parameterType="top.maniy.mybatisdemo.entity.User">
insert into e_user(username,address) values (#{username},#{address})
</insert>
- update – 映射更新语句
<update id="updateUserByMap">
update e_user set username=#{username} WHERE id=#{id}
</update>
- delete – 映射删除语句
<delete id="deleteUserByUserId">
DELETE from e_user where id=#{id}
</delete>
- select – 映射查询语句
<!-- 查询总数 -->
<select id="count" resultType="int">
SELECT COUNT(*) FROM e_user
</select>
<!-- 查询表全部数据 返回的是List集合 resultType是集合包含的类型 -->
<select id="getAllUserList" resultType="top.maniy.mybatisdemo.entity.User">
SELECT * FROM e_user
</select>
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>
<!-- 别名 -->
<typeAliases>
<package name="top.maniy.entity"/>
</typeAliases>
</configuration>
- sql – 可被其他语句引用的可重用语句块。
<sql id="selectAll">
SELECT * FROM photo
</sql>
<!-- sql可以把经常使用的重复语句块提出来-->
<!-- 用include 引入 -->
<select id="getPhotosByAlbumId" resultType="Photo">
<include refid="selectAll"></include>
WHERE albumid=#{albumid}
</select>
parameterType无论在什么情况下,增删改查中都可以不写
Mapper XML中标签有多个参数且不是一个对象中需要接口加@Param
//接口方法有多个参数的时候,需要使用@Param注解给形参取名字,名字可以随便取,但是最好只能用参取名字
User getUserByUsernameAndPassword(@Param("username") String username,@Param("password") String password);
<select id="getUserByUsernameAndPassword" resultType="top.maniy.mybatisdemo.entity.User">
SELECT * FROM e_user WHERE username=#{username} AND address=#{password}
</select>
MyBatis参数解析(附带模糊查询两中写法)
<!-- 根据用户名模糊查询用户列表
#{} 占位符 #{1}=‘1’
${} 字符串拼接 ${1}=1 '%${value}%'
#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
-->
<!-- MyBatis里面传参数,#表示用的preparedstatement
$表示用的statement
因此模糊查询可以多种写法
/* SELECT * from e_user where username LIKE concat('%',#{username},'%')*/
-->
<select id="getUserListLikeUserName" resultType="top.maniy.mybatisdemo.entity.User">
SELECT * from e_user where username LIKE '%${username}%'
</select>
-
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
-
parameterMap – 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除。