概念: SQL配置文件用于配置SQL语句块以及SQL相关配置:java
mybatis内置别名.mdsql
源码: /mybatis3/数据库
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><properties resource="jdbc/db.propertiesyap"/><!--别名扫描--><typeAliases><!--<typeAlias type="com.yap.pojo.Student" alias="student"/>--><package name="com.yap.pojo"/></typeAliases><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.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><mapper resource="mapper/student-mapper.xml"/><mapper resource="mapper/teacher-mapper.xml"/><mapper resource="mapper/worker-mapper.xml"/></mappers></configuration>复制代码
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="studentSpace"><cache readOnly="true"/><!--sql重用快--><sql id="cols">`id`, `name`, `gender`, `age`, `info`</sql><insert id="insert" parameterType="student" useGeneratedKeys="true" keyProperty="id">INSERT INTO `student` (<include refid="cols"/>) VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><insert id="insertWithSelectKey"><selectKey order="AFTER" keyProperty="id" resultType="int">SELECT last_insert_id()</selectKey>INSERT INTO `student` (<include refid="cols"/>) VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><select id="findById" resultType="student">SELECT<include refid="cols"/>FROM `student` WHERE `id` = #{id}</select><select id="findLikeName" resultType="student">SELECT<include refid="cols"/>FROM `student` WHERE `name` like '%${value}%'</select><select id="findLikeNameWithConcat" resultType="student">SELECT<include refid="cols"/>FROM `student` WHERE `name` like concat('%', #{name}, '%')</select><update id="updateById">UPDATE `student` SET `name` = #{name}, `age` = #{age}, `gender` = #{gender}, `info` = #{info} WHERE `id` = #{id}</update><delete id="deleteById">DELETE FROM `student` WHERE `id` = #{id}</delete><resultMap id="findAllMap" type="student"><id column="name" property="id" javaType="int" jdbcType="INT"/><result column="name" property="name" javaType="string" jdbcType="VARCHAR"/><result column="age" property="age" jdbcType="VARCHAR"/><result column="gender" property="gender"/><result column="info" property="info"/></resultMap><select id="findAll" resultMap="findAllMap">SELECT<include refid="cols"/>FROM `student`</select></mapper>复制代码
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yap.mapper.WorkerMapper"><insert id="insert" useGeneratedKeys="true" keyProperty="id">INSERT INTO `worker` (`id`, `name`, `gender`, `age`, `info`) VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><select id="findById" resultType="worker">SELECT `id`, `name`, `gender`, `age`, `info` FROM `worker` WHERE `id` = #{id}</select><select id="findLikeName" resultType="worker">SELECT `id`, `name`, `gender`, `age`, `info` FROM `worker` WHERE `name` like concat('%', #{name}, '%')</select><update id="updateById">UPDATE `worker` SET `name` = #{name}, `age` = #{age}, `gender` = #{gender}, `info` = #{info} WHERE `id` = #{id}</update><delete id="deleteById">DELETE FROM `worker` WHERE `id` = #{id}</delete></mapper>复制代码
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yap.mapper.TeacherMapper"><cache-ref namespace="studentSpace"/></mapper>复制代码
package com.yap.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.io.Serializable;/** * @author yap */@Data@AllArgsConstructor@NoArgsConstructorpublic class Teacher implements Serializable {private Integer id;private String name;private Integer gender;private Integer age;private String info; }复制代码2. DML语句块
流程: DML操做能够省略 parameterType,必须省略 resultType:apache
源码: /mybatis3/缓存
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="studentSpace"><cache readOnly="true"/><sql id="cols">`id`, `name`, `gender`, `age`, `info`</sql><insert id="insert" parameterType="student" useGeneratedKeys="true" keyProperty="id">INSERT INTO `student` (<include refid="cols"/>) VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><insert id="insertWithSelectKey"><selectKey order="AFTER" keyProperty="id" resultType="int">SELECT last_insert_id()</selectKey>INSERT INTO `student` (<include refid="cols"/>) VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><select id="findById" resultType="student">SELECT<include refid="cols"/>FROM `student` WHERE `id` = #{id}</select><select id="findLikeName" resultType="student">SELECT<include refid="cols"/>FROM `student` WHERE `name` like '%${value}%'</select><select id="findLikeNameWithConcat" resultType="student">SELECT<include refid="cols"/>FROM `student` WHERE `name` like concat('%', #{name}, '%')</select><update id="updateById">UPDATE `student` SET `name` = #{name}, `age` = #{age}, `gender` = #{gender}, `info` = #{info} WHERE `id` = #{id}</update><delete id="deleteById">DELETE FROM `student` WHERE `id` = #{id}</delete><resultMap id="findAllMap" type="student"><id column="name" property="id" javaType="int" jdbcType="INT"/><result column="name" property="name" javaType="string" jdbcType="VARCHAR"/><result column="age" property="age" jdbcType="VARCHAR"/><result column="gender" property="gender"/><result column="info" property="info"/></resultMap><select id="findAll" resultMap="findAllMap">SELECT<include refid="cols"/>FROM `student`</select></mapper>复制代码
package com.yap.crud;import com.yap.pojo.Student;import com.yap.util.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.junit.Test;/** * @author yap */public class StudentTest {private SqlSessionFactory factory = MyBatisUtil.getFactory("mybatis-crud.xml");@Testpublic void insert() { Student zhaosi = new Student(null, "赵四", 1, 58, "亚洲舞王"); Student liunneng = new Student(10, "刘能", 0, 19, "玉田花圃"); SqlSession session = factory.openSession();try { session.insert("studentSpace.insert", zhaosi); session.insert("studentSpace.insert", liunneng); session.commit(); System.out.println(zhaosi); System.out.println(liunneng); } catch (Exception e) { session.rollback(); e.printStackTrace(); } finally { session.close(); } } }复制代码
@Testpublic void insertWithSelectKey() { Student dajiao = new Student(null, "大脚", 0, 18, "大脚超市"); SqlSession session = factory.openSession();try { session.insert("studentSpace.insertWithSelectKey", dajiao); session.commit(); System.out.println(dajiao); } catch (Exception e) { session.rollback(); e.printStackTrace(); } finally { session.close(); } }复制代码
@Testpublic void updateById() { SqlSession session = factory.openSession(); Student zhaosi = new Student(1, "谢广坤", 1, 60, "广坤山货");try { session.update("studentSpace.updateById", zhaosi); session.commit(); } catch (Exception e) { session.rollback(); e.printStackTrace(); } finally { session.close(); } }复制代码
@Testpublic void deleteById() { SqlSession session = factory.openSession();try { session.delete("studentSpace.deleteById", 1); session.commit(); } catch (Exception e) { session.rollback(); e.printStackTrace(); } finally { session.close(); } }复制代码3. DQL语句块
流程: DQL能够省略 parameterType,必须使用 resultType 指定返回值或其泛型的类全名或别名:安全
jdbcType枚举类型.pngsession
源码: /mybatis3/mybatis
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="studentSpace"><cache readOnly="true"/><sql id="cols">`id`, `name`, `gender`, `age`, `info`</sql><insert id="insert" parameterType="student" useGeneratedKeys="true" keyProperty="id">INSERT INTO `student` (<include refid="cols"/>) VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><insert id="insertWithSelectKey"><selectKey order="AFTER" keyProperty="id" resultType="int">SELECT last_insert_id()</selectKey>INSERT INTO `student` (<include refid="cols"/>) VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><select id="findById" resultType="student">SELECT<include refid="cols"/>FROM `student` WHERE `id` = #{id}</select><select id="findLikeName" resultType="student">SELECT<include refid="cols"/>FROM `student` WHERE `name` like '%${value}%'</select><select id="findLikeNameWithConcat" resultType="student">SELECT<include refid="cols"/>FROM `student` WHERE `name` like concat('%', #{name}, '%')</select><update id="updateById">UPDATE `student` SET `name` = #{name}, `age` = #{age}, `gender` = #{gender}, `info` = #{info} WHERE `id` = #{id}</update><delete id="deleteById">DELETE FROM `student` WHERE `id` = #{id}</delete><resultMap id="findAllMap" type="student"><id column="name" property="id" javaType="int" jdbcType="INT"/><result column="name" property="name" javaType="string" jdbcType="VARCHAR"/><result column="age" property="age" jdbcType="VARCHAR"/><result column="gender" property="gender"/><result column="info" property="info"/></resultMap><select id="findAll" resultMap="findAllMap">SELECT<include refid="cols"/>FROM `student`</select></mapper>复制代码
@Testpublic void findById() {try (SqlSession session = factory.openSession();) { System.out.println((Student) session.selectOne("studentSpace.findById", 1)); System.out.println((Student) session.selectOne("studentSpace.findById", new Student(1, null, null, null, null))); } catch (Exception e) { e.printStackTrace(); } }复制代码
@Testpublic void findLikeName() {try (SqlSession session = factory.openSession()) { System.out.println(session.selectList("studentSpace.findLikeName", "刘")); System.out.println(session.selectList("studentSpace.findLikeName", "'or'")); } catch (Exception e) { e.printStackTrace(); } }复制代码
@Testpublic void findLikeNameWithConcat() {try (SqlSession session = factory.openSession()) { System.out.println(session.selectList("studentSpace.findLikeNameWithConcat", "刘")); System.out.println(session.selectList("studentSpace.findLikeNameWithConcat", "'or'")); } catch (Exception e) { e.printStackTrace(); } }复制代码
复制代码4. 接口开发
流程: 接口动态代理模式须要额外开发一个遵照对应关系的java接口:app
源码: /mybatis3/ide
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yap.mapper.WorkerMapper"><insert id="insert" useGeneratedKeys="true" keyProperty="id">INSERT INTO `worker` (`id`, `name`, `gender`, `age`, `info`) VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><select id="findById" resultType="worker">SELECT `id`, `name`, `gender`, `age`, `info` FROM `worker` WHERE `id` = #{id}</select><select id="findLikeName" resultType="worker">SELECT `id`, `name`, `gender`, `age`, `info` FROM `worker` WHERE `name` like concat('%', #{name}, '%')</select><update id="updateById">UPDATE `worker` SET `name` = #{name}, `age` = #{age}, `gender` = #{gender}, `info` = #{info} WHERE `id` = #{id}</update><delete id="deleteById">DELETE FROM `worker` WHERE `id` = #{id}</delete></mapper>复制代码
package com.yap.mapper;import com.yap.pojo.Worker;import java.util.List;/** * @author yap */public interface WorkerMapper {/** * 根据主键查询一条信息 * * @param id 主键 * @return 对应主键的一条信息 */Worker findById(int id);/** * 添加一条工人信息 * * @param worker 工人实体 */void insert(Worker worker);/** * 按照姓名模糊查询全部符合条件的工人 * * @param name 姓名的模糊查询部分 * @return 全部符合条件的工人 */List<Worker> findLikeName(String name);/** * 根据主键修改一条工人信息 * * @param worker 工人实体 */void updateById(Worker worker);/** * 根据主键删除工人 * * @param id 主键 */void deleteById(int id); }复制代码
package com.yap.crud;import com.yap.mapper.WorkerMapper;import com.yap.pojo.Worker;import com.yap.util.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.junit.Test;/** * @author yap */public class WorkerTest {private SqlSessionFactory factory = MyBatisUtil.getFactory("mybatis-crud.xml");@Testpublic void insert() { SqlSession session = factory.openSession(); WorkerMapper workerMapper = session.getMapper(WorkerMapper.class);try { workerMapper.insert(new Worker(null, "赵四", 1, 58, "亚洲舞王")); workerMapper.insert(new Worker(null, "赵五", 1, 58, "亚洲舞王")); workerMapper.insert(new Worker(null, "王四", 1, 58, "亚洲舞王")); workerMapper.insert(new Worker(null, "王五", 1, 58, "亚洲舞王")); session.commit(); } catch (Exception e) { session.rollback(); e.printStackTrace(); } finally { session.close(); } }@Testpublic void findById() {try (SqlSession session = factory.openSession()) { WorkerMapper workerMapper = session.getMapper(WorkerMapper.class); System.out.println(workerMapper.findById(1)); } catch (Exception e) { e.printStackTrace(); } }@Testpublic void findLikeName() {try (SqlSession session = factory.openSession()) { WorkerMapper workerMapper = session.getMapper(WorkerMapper.class); System.out.println(workerMapper.findLikeName("四")); } catch (Exception e) { e.printStackTrace(); } }@Testpublic void updateById() { SqlSession session = factory.openSession(); WorkerMapper workerMapper = session.getMapper(WorkerMapper.class);try { workerMapper.updateById(new Worker(1, "刘能", 1, 58, "村副主任")); session.commit(); } catch (Exception e) { session.rollback(); e.printStackTrace(); } finally { session.close(); } }@Testpublic void deleteById() { SqlSession session = factory.openSession(); WorkerMapper workerMapper = session.getMapper(WorkerMapper.class);try { workerMapper.deleteById(1); session.commit(); } catch (Exception e) { session.rollback(); e.printStackTrace(); } finally { session.close(); } } }复制代码
流程: 接口开发模式下,可以使用注解替代SQL语句块,虽简化了代码,但不适用于复杂SQL:
源码: /mybatis3/
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yap.mapper.TeacherMapper"><cache-ref namespace="studentSpace"/></mapper>复制代码
package com.yap.mapper;import com.yap.pojo.Teacher;import org.apache.ibatis.annotations.*;import java.util.List;/** * @author yap */public interface TeacherMapper {/** * 添加一条教师信息 * * @param teacher 教师实体 */@Insert("INSERT INTO `teacher` (`name`, `gender`, `age`, `info`) VALUES (#{name}, #{gender}, #{age}, #{info})")@Options(useGeneratedKeys = true, keyProperty = "id")void insert(Teacher teacher);/** * 根据主键查询一条信息 * * @param id 主键 * @return 对应主键的一条信息 */@Select("SELECT `id`, `name`, `gender`, `age`, `info` FROM `teacher` WHERE `id` = #{id}")Teacher findById(int id);/** * 按照姓名模糊查询全部符合条件的教师 * * @param name 姓名的模糊查询部分 * @return 全部符合条件的教师 */@Select("SELECT `id`, `name`, `gender`, `age`, `info` FROM `teacher` WHERE `name` like concat('%', #{name}, '%')")List<Teacher> findLikeName(String name);/** * 根据主键修改一条教师信息 * * @param teacher 教师实体 */@Update("UPDATE `teacher` SET `name` = #{name}, `age` = #{age}, `gender` = #{gender}, `info` = #{info} WHERE `id` = #{id}")void updateById(Teacher teacher);/** * 根据主键删除教师 * * @param id 主键 */@Delete("DELETE FROM `teacher` WHERE `id` = #{id}")void deleteById(int id); }复制代码
package com.yap.crud;import com.yap.mapper.TeacherMapper;import com.yap.pojo.Teacher;import com.yap.util.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.junit.Test;/** * @author yap */public class TeacherTest {private SqlSessionFactory factory = MyBatisUtil.getFactory("mybatis-crud.xml");@Testpublic void insert() { SqlSession session = factory.openSession(); TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);try { teacherMapper.insert(new Teacher(null, "赵四", 1, 58, "亚洲舞王")); teacherMapper.insert(new Teacher(null, "赵五", 1, 58, "亚洲舞王")); teacherMapper.insert(new Teacher(null, "王四", 1, 58, "亚洲舞王")); teacherMapper.insert(new Teacher(null, "王五", 1, 58, "亚洲舞王")); session.commit(); } catch (Exception e) { session.rollback(); e.printStackTrace(); } finally { session.close(); } }@Testpublic void findById() {try (SqlSession session = factory.openSession()) { TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class); System.out.println(teacherMapper.findById(1)); } catch (Exception e) { e.printStackTrace(); } }@Testpublic void findLikeName() {try (SqlSession session = factory.openSession()) { TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class); System.out.println(teacherMapper.findLikeName("四")); } catch (Exception e) { e.printStackTrace(); } }@Testpublic void updateById() { SqlSession session = factory.openSession(); TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);try { teacherMapper.updateById(new Teacher(1, "刘能", 1, 58, "村副主任")); session.commit(); } catch (Exception e) { session.rollback(); e.printStackTrace(); } finally { session.close(); } }@Testpublic void deleteById() { SqlSession session = factory.openSession(); TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);try { teacherMapper.deleteById(1); session.commit(); } catch (Exception e) { session.rollback(); e.printStackTrace(); } finally { session.close(); } } }复制代码