Mapper动态代理方式
注册 SqlMapConfig.xml
<mappers> <mapper resource="com.zym.mapper/User.xml"></mapper> </mappers>
User.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"> <!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 --> <mapper namespace="com.zym.mapper.User"> <!-- id:statement的id 或者叫做sql的id--> <!-- parameterType:声明输入参数的类型 --> <!-- resultType:声明输出结果的类型,应该填写pojo的全路径 --> <!-- #{}:输入参数的占位符,相当于jdbc的? --> <select id="queryUserById" parameterType="int" resultType="com.zym.pojo.User"> SELECT * FROM `User` WHERE id = #{id} </select> <!--<insert id="addUser" parameterType="com.zym.pojo.User" >--> <!---- 添加返回主键,属性说明--> <!--<!– selectKey 标签实现主键返回 –>--> <!--<!– keyColumn:主键对应的表中的哪一列 –>--> <!--<!– keyProperty:主键对应的pojo中的哪一个属性 –>--> <!--<!– order:设置在执行insert语句前执行查询id的sql,孩纸在执行insert语句之后执行查询id的sql –>--> <!--<!– resultType:设置返回的id的类型 –>--> <!--<selectKey resultType="int" keyColumn="id" order="AFTER" keyProperty="id">--> <!--select last_insert_id()--> <!--</selectKey>--> <!--insert into User(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})--> <!--</insert>--> <!--<select id="selectAll" resultType="com.zym.pojo.User">--> <!--select * from User ;--> <!--</select>--> </mapper>
User接口
package com.zym.mapper; import java.util.List; public interface User { com.zym.pojo.User queryUserById(int id); List<com.zym.pojo.User> queryUserByUsername(String username); void saveUser(com.zym.pojo.User user); }
注意红色的地方,需要保持一致
SqlMapConfig.xml配置文件
qlMapConfig.xml中配置的内容和顺序如下:
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
properties
在SqlMapConfig.xml同级别的源文件夹下创建db.properties文件
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8 jdbc.username=root jdbc.password=root
之后可以在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>
<!-- 是用resource属性加载外部配置文件 -->
<properties resource="db.properties">
<!-- 在properties内部用property定义属性 -->
<!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖 -->
<property name="jdbc.username" value="root123" />
<property name="jdbc.password" value="root123" />
</properties>
自定义别名
<typeAliases> <!-- 单个别名定义 --> <typeAlias alias="user" type="com.jy.pojo.User" /> <!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) --> <package name="com.jy.pojo" /> <package name="其它包" /> </typeAliases>
定义之后type就可以写成 user了
mappers
注册指定包下的所有mapper接口
如:<package name="com.jy.mapper"/>
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
动态sql
if条件
<!-- 根据条件查询用户 --> <select id="queryUserByWhere" parameterType="user" resultType="user"> SELECT id, username, birthday, sex, address FROM `user` WHERE 1=1 <if test="sex != null and sex != ''"> AND sex = #{sex} </if> <if test="username != null and username != ''"> AND username LIKE '%${username}%' </if> </select>
Where标签
注意字符串类型的数据需要要做不等于空字符串校验。
<!-- 根据条件查询用户 --> <select id="queryUserByWhere" parameterType="user" resultType="user"> SELECT id, username, birthday, sex, address FROM `user` <!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 --> <where> <if test="sex != null"> AND sex = #{sex} </if> <if test="username != null and username != ''"> AND username LIKE '%${username}%' </if> </where> </select>
Sql片段
Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。 把上面例子中的id, username, birthday, sex, address提取出来,作为sql片段,如下: <!-- 根据条件查询用户 --> <select id="queryUserByWhere" parameterType="user" resultType="user"> <!-- SELECT id, username, birthday, sex, address FROM `user` --> <!-- 使用include标签加载sql片段;refid是sql片段id --> SELECT <include refid="userFields" /> FROM `user` <!-- where标签可以自动添加where关键字,同时处理sql语句中第一个and关键字 --> <where> <if test="sex != null"> AND sex = #{sex} </if> <if test="username != null and username != ''"> AND username LIKE '%${username}%' </if> </where> </select> <!-- 声明sql片段 --> <sql id="userFields"> id, username, birthday, sex, address </sql>
foreach
user.xml
<select id="queryUserByList" parameterType="int" resultType="com.zym.pojo.User"> <!--select * from `User` where id in--> <!--<foreach collection="list" index="index" item="item" open="(" separator="," close=")">--> <!--#{item}--> <!--</foreach>--> select * from `User` <where> <foreach collection="list" open="id in (" close=")" separator="," item="ddd"> #{ddd} </foreach> </where> </select>
mapper.user
public List<com.zym.pojo.User> queryUserByList(List<Integer> ids);
测试
User mapper = sqlSession.getMapper(User.class); List<Integer> ids = new ArrayList<Integer>(); ids.add(1); ids.add(2); ids.add(3); System.out.println(ids); List<com.zym.pojo.User> user = mapper.queryUserByList(ids); System.out.println(user);
、