关于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 &gt; #{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() &lt; 5">
                <bind name="likename" value="'%'+username+'%'"/>
                  username like #{likename}
            </when>
            <when test="username.length() &lt; 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"/>

 

posted @ 2024-09-08 15:27  MvloveYouForever  阅读(5)  评论(0编辑  收藏  举报