关于mybatis
1、junit方法 @Test @Before @After
2、数据类型与别名
3、参数定义方法:
#{name} 直接表示对象的属性名,只有一个参数的时候 #{} 内的名称随便写。
'%${name}%' 模糊查询拼接字符串
<select id="findByUsernameLike" parameterType="string" resultType="com.itbaizhan.pojo.User"> select * from user where username like '%${value}%' </select>
模糊查询的推荐写法,使用bind标签
<select id="findByUsernameLike" parameterType="string" resultType="com.itbaizhan.pojo.User"> <bind name="likeName" value="'%'+username+'%'"/> select * from user where username like # {likeName} </select>
4、多参书写方式,
注解方式
List<User> findPage1(@Param("startIndex") int startIndex, @Param("pageSize")int pageSize);
<select id="findPage1" resultType="com.itbaizhan.mapper.User"> select * from user limit #{startIndex},# {pageSize} </select>
Map传参
List<User> findPage3(Map<String,Object>
params);
<select id="findPage3" resultType="com.itbaizhan.pojo.User" parameterType="map"> select * from user limit # {startIndex},#{pageSize} </select>
@Test public void testFindPage3(){ Map<String,Object> params = new HashMap(); params.put("startIndex",0); params.put("pageSize",4); List<User> users = userMapper.findPage3(params); users.forEach(System.out::println); }
5、主键回填
void add(User user);
<insert id="add" parameterType="com.itbaizhan.user.User"> <!-- keyProperty:主键属性名,keyColumn:主 键列名,resultType:主键类型,order:执行时机 --> <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID(); </selectKey> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},# {address}) </insert> <!-- SELECT LAST_INSERT_ID():查询刚刚插入的记录的主键 值,只适用于自增主键,且必须和insert语句一起执行。-->
@Test public void testAdd(){ User user = new User("尚学堂", new Date(), "男", "北京"); userMapper.add(user); session.commit(); System.out.println(user.getId()); }
6、正确配置数据库连接的方法
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybat is jdbc.username=root jdbc.password=root
在配置文件中引入db.properties
<properties resource="db.properties"> </properties> <environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC"> </transactionManager> <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>
7、类别名
<!-- mybatis配置文件 --> <typeAliases> <typeAlias type="com.itbaizhan.pojo.User" alias="User"> </typeAlias> </typeAliases>
映射文件
<select id="findAll" resultType="User"> select * from user </select>
为一个所有包下的所有类配置别名
<typeAliases> <package name="com.itbaizhan.pojo"> </package> </typeAliases>
8、 <mappers> 用于注册映射文件或持久层接口
<!-- 注册一个包下的所有持久层接口 --> <mappers> <package name="com.itbaizhan.mapper"/> </mappers
9、返回属性与对象名不一致时
resultMap
<!-- id:自定义映射名 type:自定义映射的对象类型 --> <resultMap id="teacherMapper" type="com.itbaizhan.pojo.Teacher"> <!-- id定义主键列 property:POJO属性名 column:数据库列名 --> <id property="id" column="tid"></id> <!-- result定义普通列 property:POJO属性 名 column:数据库列名 --> <result property="teacherName" column="tname"></result> </resultMap> <select id="findAll" resultMap="teacherMapper"> select * from teacher </select>
sql语句as
<select id="findAll" resultType="com.itbaizhan.pojo.Teacher"> select tid as id,tname as teacherName from teacher; </select>
10、复用sql方法
<sql id="selectAllField"> select tid as id,tname as teacherName </sql> <select id="findAll" resultType="com.itbaizhan.pojo.Teacher"> <include refid="selectAllField"> </include> from teacher; </select> <select id="findById" resultType="com.itbaizhan.pojo.Teacher"> <include refid="selectAllField"></include> from teacher where tid = #{id} </select>
11、MyBatis映射文件_特殊字符处理
<select id="findById2" resultType="com.itbaizhan.pojo.Teacher"> <include refid="selectAllField"> </include> from teacher where tid > #{id} </select>
12、动态sql
if
// 用户通用查询 List<User> findByCondition(User user);
<select id="findByCondition" parameterType="com.itbaizhan.pojo.User" resultType="com.itbaizhan.pojo.User"> select * from user where 1 = 1 <if test="username != null and username.length() != 0"> and username like #{username} </if> <if test="sex != null and sex.length() != 0"> and sex = #{sex} </if> <if test="address != null and address.length() != 0"> and address = #{address} </if> </select>
1 if中的条件不能使用&&/||,而应该使用and/or
2 if中的条件可以直接通过属性名获取参数POJO的属性值,并且该值可以调用方法。
3 where后为什么要加1=1?
任意条件都可能拼接到Sql中。如果有多个条件,从第二个 条件开始前都需要加And关键字。加上1=1这个永久成立的
条件,就不需要考虑后面的条件哪个是第一个条件,后面的条件前都加And关键字即可。
where 标签
<where> 可以代替sql中的where 1=1 和第一个and,更符合程序员的
开发习惯
<select id="findByCondition" resultType="com.itbaizhan.user.User" parameterType="com.itbaizhan.user.User"> select * from user <where> <if test="username != null and username.length() != 0"> username like #{username} </if> <if test="sex != null and sex.length() != 0"> and sex = #{sex} </if> </where> </select>
<set>标签
<update id="update" parameterType="com.itbaizhan.user.User"> update user <set> <if test="username != null and username.length() > 0"> username = #{username}, </if> <if test="sex != null and sex.length() > 0"> sex = #{sex}, </if> </set> <where> id = #{id} </where> </update>
动态SQL_<choose>、<when>、<otherwise>
这些标签表示多条件分支,类似JAVA中的 switch...case 。 <choose> 类似
switch , <when> 类似 case , <otherwise> 类似 default ,用法如下:
<select id="findByCondition" resultType="com.itbaizhan.user.User" parameterType="com.itbaizhan.user.User"> select * from user <where> <choose> <when test="username.length() < 5"> <bind name="likename" value="'%'+username+'%'"/> username like #{likename} </when> <when test="username.length() < 10"> username = #{username} </when> <otherwise> id = 1 </otherwise> </choose> </where> </select>
这段代码的含义为:用户名<5时使用模糊查询,用户名>=5并且 <10时使用精确查询,否则查询id为1的用户
动态SQL_<foreach>
collection:遍历的对象类型
open:开始的sql语句
close:结束的sql语句
separator:遍历每项间的分隔符
item:表示本次遍历获取的元素,遍历List、Set、数组时表示每项元素,遍历map时表示键值对的值。
index:遍历List、数组时表示遍历的索引,遍历map时表示键值对的键。
void deleteBatch(int[] ids);
<delete id="deleteBatch" parameterType="int"> delete from user <where> <foreach open="id in(" close=")" separator="," collection="array" item="id" > #{id} </foreach> </where> </delete>
注:传入的是 int数组, paramterType 写 int
遍历Map、多查询
/** * 多条件查询 * @param map 查询的条件键值对 键:属性名 值:属性值 * @return */ List<User> findUser(@Param("queryMap") Map<String,Object> map);
<select id="findUser" parameterType="map" resultType="com.itbaizhan.pojo.User"> select * from user <where> <foreach collection="queryMap" separator="and" index="key" item="value"> ${key} = #{value} </foreach> </where> </select>
12、关于缓存
1、一级缓存存在 SqlSession中
2、二级缓存在 SqlSessionFactory 中
清空一级缓存方法: close() clearCache() commit()
SqlSession 调用增删改方法:操作会清空一级缓存数据,因为增删改后数据库发生改变,缓存数
据将不准确。
开启二级缓存
// POJO类实现Serializable接口 public class User implements Serializable { private int id; private String username; private String sex; private String address; }
<!-- 配置文件中 --> <settings> <setting name="cacheEnabled" value="true"/> </settings>
<!-- 映射文件中增加 。 如果查询到的集合中对象过多,二级缓存只能缓存1024个对 象引用。可以通过 <cache /> 标签的size属性修改该数量。--> <cache size="2048"/>