Mybatis-动态SQL

1.1 项目目录

1.2 Log4j日志

简介:

  • Log4j是Apache的一个开源项目
  • 通过使用Log4j,可以控制日志信息输送的目的地:控制台,文本,GUI组件,也可以控制每一条日志的输出格式。
  • 通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

使用步骤:

1、导入log4j的包

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

2、配置文件编写

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/guardwhy.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

3、setting设置日志实现(在sqlMapConfig.xml设置)

<settings>
    <setting name="logImpl" value="LOG4J"/>
</settings>

4、在程序中使用Log4j进行输出!

import org.apache.log4j.Logger;
public class TestUserDao {
    // 日志对象,参数为当前类的class
    static Logger logger = Logger.getLogger(TestUserDao.class);

    @Test
    public void testLog4j(){
        // 日志级别
        logger.info("infoL:进入了testLog4j");
        logger.debug("debug:进入了testLog4j");
        logger.debug("error:进入了testLog4j");
    }
}

5、执行结果

1.3 IF标签

作用:判断条件是否为真,如果为真则将if中字符串接近到SQL语句中

UserMapper接口

package cn.guardwhy.dao;

import cn.guardwhy.domain.User;

import java.util.List;

/**
 * 用户dao的接口
 */
public interface UserMapper {
    // 1.根据用户名称和性别查询用户
    List<User> findUserByNameAndSex(User user);
}

配置UserMapper.xml

  1. 根据用户名称和性别查询用户
  2. if:判断用户名称不为空,且不为空字符串,则作为查询条件。
  3. if:判断用户性别不为空,且不为空字符串,则作为查询条件。
<!--1.多条件查询-->
<select id="findUserByNameAndSex" resultType="user" parameterType="user">
    select * from user where
    <!-- 如果username不为空,而且不为空字符串,则做为查询的条件-->
    <if test="username!=null and username!=''">
        username like '%${username}%'
    </if>
    <if test="sex!=null and sex!=''">
        and sex= #{sex}
    </if>
</select>

1.4 Where标签

基本作用

  1. where标签就相当于SQL语句中where关键字
  2. 去掉多余的and,or,where关键字

配置UserMapper.xml

  1. 根据用户名称和性别查询用户
  2. if标签写在where标签内部
    • if:判断用户名称不为空,且不为空字符串,则作为查询条件。
    • if:判断用户性别不为空,且不为空字符串,则作为查询条件。
<!--1.多条件查询-->
<select id="findUserByNameAndSex" resultType="user" parameterType="user">
    select * from user
    <where>
        <!-- 如果username不为空,而且不为空字符串,则做为查询的条件-->
        <if test="username!=null and username!=''">
            username like '%${username}%'
        </if>
        <if test="sex!=null and sex!=''">
            and sex= #{sex}
        </if>
    </where>
</select>

测试代码

通过用户名和性别查询多个用户,查询条件是"大"和"男"

@Test
public void testFindUserByNameAndSex(){
    // 1.通过工具类得到会话对象
    SqlSession sqlSession = MybatisUtils.getSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    // 2.创建对象
    User user = new User();
    user.setUsername("大");
    user.setSex("男");
    // 将元素添加到集合中
    List<User> list = mapper.findUserByNameAndSex(user);
    list.forEach(System.out::println);
    sqlSession.close();
}

执行结果

1.5 Set标签

基本作用:更新用户信息的时候,有些表单项为空则不用更新

  1. 用在update这个语句,相当于set关键字
  2. 与if标签配合使用,对有值的字段进行更新,可以去掉多余的逗号。

UserMapper接口

// 更新用户
int updateUser(User user);

配置UserMapper.xml

通过id来更新用户名或性别

  • update标签更新用户数据
  • 如果username不为空而且不为空串,则更新
  • 如果sex不为空而且不为空串,则更新
  • 最后加上where条件
<!--2.更新操作-->
<update id="updateUser" parameterType="user">
    update user
    <set>
        <if test="username!=null and username!=''">
            username = #{username},
        </if>
        <if test="sex!=null and sex!=''">
            sex=#{sex}
        </if>
    </set>
    where id=#{id}
</update>

测试代码

// 更新操作
@Test
public void testUpdateUser(){
    // 1.通过工具类得到会话对象
    SqlSession sqlSession = MybatisUtils.getSession();
    // 2.会话对象的得到mapper接口代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    // 3.创建对象
    User user = new User(6,"张佳丽",Date.valueOf("1989-11-6"),"女","江州");
    // 更新行数
    int row = mapper.updateUser(user);
    System.out.println("更新了" + row + "行");
}

查询结果

1.6 Foreach标签

1.6.1 参数类型集合

拼接SQL语句,中间用到循环,有一段SQL语句出现多次。

Mapper接口方法

// 批量添加用户
int addUsers(List<User> users);

配置UserMapper.xml

批量新增用户,参数类型是: list

foreach标签的属性作用
collection两个取值:list 表示集合 array 表示数组
item集合中每个变量名字
separator每次遍历后添加分隔符
#{变量名.属性}引用每个属性
<!--3.批量添加用户-->
<insert id="addUsers" parameterType="list">
    insert into user values
    <!--
        collection:两个取值:list 表示集合 array 表示数组
        item:集合中每个变量名字
        separator:每次遍历后添加分隔符
        -->
    <foreach collection="list" item="user" separator=",">
        (null,#{user.username},#{user.birthday}, #{user.sex}, #{user.address})
    </foreach>
</insert>

测试代码

// 添加批量元素
@Test
public void testAddUsers(){
    // 1.通过工具类得到会话对象
    SqlSession sqlSession = MybatisUtils.getSession();
    // 2.会话对象的得到mapper接口代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    // 3.创建集合对象
    List<User> users = new ArrayList<>();
    users.add(new User(7,"王大辉", Date.valueOf("1988-01-30"),"男","岭西"));
    users.add(new User(8,"侯国龙", Date.valueOf("1975-05-08"),"男","江州"));
    users.add(new User(9,"杨红英", Date.valueOf("1993-11-01"),"女","江州"));
    int row = mapper.addUsers(users);
    System.out.println("添加了" + row + "行");
}

执行结果

1.6.2 参数类型数组

mapper接口

// 批量删除用户
int deleteUsers(int[] ids);

配置UserMapper.xml

parameterType 因为内置别名中没有数组类型的参数,所以当参数传递的是list和数组,都写成list

<!--批量删除用户-->
<delete id="deleteUsers" parameterType="list">
    delete from user where id in
    <foreach collection="array" open="(" item="id" separator="," close=")">
        #{id}
    </foreach>
</delete>

测试代码

  1. 删除多个用户
  2. 返回影响的行数
// 删除多个用户
@Test
public void testDeleteUsers(){
    // 1.通过工具类得到会话对象
    SqlSession sqlSession = MybatisUtils.getSession();
    // 2.会话对象的得到mapper接口代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    // 3.定义数组
    int[] arrays = {14,15,16};
    int row = mapper.deleteUsers(arrays);
    System.out.println("删除了" + row + "行");
}

查询结果

1.7 Sql和include标签

基本作用

sql标签:定义一段可以重用的SQL语句。
include标签: 引用上面定义的SQL语句。

mapper接口

 // 根据条件查询多个用户
List<User> findUserByCondition(Map<String, Object> condition);

// 根据条件查询有多少用户
int findUserCount(Map<String, Object> condition);

配置UserMapper.xml

<!--定义一个可以重用的代码块-->
<sql id="conditionSql">
    <where>
        <if test="username!=null and username!=''">
            username like '%${username}%'
        </if>
        <if test="minDate!=null and minDate!=''">
            and birthday &gt;= #{minDate}
        </if>
        <if test="maxDate!=null and maxDate!=''">
            and birthday &lt;= #{maxDate}
        </if>
    </where>
</sql>

<!--
    根据条件查询多个用户 map有三个键:username, minDate, maxDate
    -->
<select id="findUserByCondition" parameterType="map" resultType="user">
    select * from user
    <!-- 引用以上代码块-->
    <include refid="conditionSql"/>
</select>

<select id="findUserCount" parameterType="map" resultType="int">
    select count(*) from user
    <!-- 引用以上代码块-->
    <include refid="conditionSql"></include>
</select>

测试代码

  // 根据条件查询用户
@Test
public void testFindUserByCondition(){
    HashMap<String, Object> map = new HashMap<>();
    map.put("username", "候");
    map.put("minDate","1980-1-1");
    map.put("maxDate","1993-12-1");
    List<User> userList = userMapper.findUserByCondition(map);
    // 遍历集合
    userList.forEach(System.out::println);
}

// 根据条件查询用户的个数
@Test
public void testFindUserCount(){
    HashMap<String, Object> map = new HashMap<>();
    map.put("username", "候");
    map.put("minDate","1980-1-1");
    map.put("maxDate","1993-12-1");
    int count = userMapper.findUserCount(map);
    // 输出个数
    System.out.println("共有用户" + count + "个");
}

查询结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值