MyBatis框架学习(三)——动态SQL、模糊查询、配置Druid数据源

1. 动态SQL

动态SQL即随着用户的输入不同,查询的条件也不相同。

  • 指定相关的数据库。数据库中相关信息的目录如下:
    在这里插入图片描述
  • 创建相关实体类:
@NoArgsConstructor
@ToString
@AllArgsConstructor
@Data
public class Person {
    private int p_id;
    private String p_gender;
    private int p_age;
    private String p_city;
    private String p_name;
}
  • 创建DAO接口
public interface PersonDAO {
	//在多条件查询中,如果查询条件不确定,可以直接使用HashMap作为参数
    //优点:无需单独定义传递查询条件的类
    //缺点:当向Map中存放参数时,key必须与动态sql保持一致()
    public List<Person> searchPerson(HashMap<String,Object> params);
}
  • 创建映射文件 PersonMapper.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">
<mapper namespace="com.mr.DAO.PersonDAO">
    <resultMap id="PersonMap" type="com.mr.things.Person">
        <id column="id" property="p_id"/>
        <result column="gender" property="p_gender"/>
        <result column="age" property="p_age"/>
        <result column="city" property="p_city"/>
        <result column="name" property="p_name"/>
    </resultMap>

    
</mapper>
  • 添加到主配置文件
<mappers>
    <mapper resource="mappers/PersonMapper.xml"></mapper>
</mappers>

1.1 if语句

<select id="searchPerson" resultMap="PersonMap">
    select * from novels.members
    where 1=1
    <if test="gender != null">  <!--gender 就是参数对象的属性/参数Map的key-->
        and gender=#{gender}
    </if>
    <if test="minAge != null">
        and age &gt;= #{minAge}   <!-- &gt; -->
    </if>
    <if test="maxAge != null">
        and age &lt;= #{maxAge}  <!-- &lt; -->
    </if>
    <if test="city != null">
        and city = #{city}
    </if>
</select>

1=1 之所以会被写入,是因为如果没有 1=1 ,那么第一个句子 gender 判断中就不能加上 and ,故为了保证句式一致,加上此句话。
测试

@Test
public void searchPerson() {

    HashMap<String,Object> params = new HashMap<String, Object>();
    params.put("gender", "女");
    params.put("minAge", 18);
    params.put("maxAge", 25);


    PersonDAO personDAO = MyBatisUtil.getMapper(PersonDAO.class);
    List<Person> members = personDAO.searchPerson(params);

    for (Person m: members) {
        System.out.println(m);
    }
}

1.2 where语句

加上 where 语句后,就不用硬加上 1=1 这句话也能够在第一个判断中加上 and

<select id="search" resultMap="PersonMap">
    select * from novels.members
    <where>
        <!--gender 就是参参数Map的key-->
        <if test="gender != null">
            and gender=#{gender}
        </if>
        <if test="minAge != 0">
            and age &gt;= #{minAge}   <!-- &gt; -->
        </if>
        <if test="maxAge != 0">
            and age &lt;= #{maxAge}  <!-- &lt; -->
        </if>
        <if test="city != null">
            and city = #{city}
        </if>
    </where>
    order by age
</select>

1.3 foreach语句

  • 添加DAO函数
public interface PersonDAO {
    public List<Person> searchPerson(HashMap<String,Object> params);
    public List<Person> searchCities(List<String> cities);
}
  • 写出映射文件
<select id="searchCities" resultMap="PersonMap">
    select * from novels.members where city in
    <foreach collection="list" item="cityName" separator="," open="(" close=")">
        #{cityName}
    </foreach>
</select>

foreach 语句中的信息依次是,代表传入的语句的类型是 list ,传入的语句以 , 间隔,传入的语句以 ( 开头以及 ) 结尾。

  • 测试
@Test
public void searchCities() {
    List<String> cities = new ArrayList<String>();
    cities.add("荆州");
    cities.add("南充");
    PersonDAO personDAO = MyBatisUtil.getMapper(PersonDAO.class);
    List<Person> members = personDAO.searchCities(cities);
    for (Person m: members) {
        System.out.println(m);
    }
}

2. 模糊查询

2.1 模糊查询的实现

  • DAO文件的实现
public interface PersonDAO {
    // 模糊查询需要使用${}取值,与sql进行拼接
    // 在使用${}时,即使只有一个参数也需要使用@Param注解声明参数的key(非String对象参数可以不用声明)
    public List<Person> searchMemberByNick(@Param("keyWord") String keyWord);
}
  • 映射文件
<select id="searchMemberByNick" parameterType="java.lang.String" resultMap="memberMap">
    select *
    from novels.members
    where name like '%${keyWord}%'
</select>

上述语句中的 '%${keyWord}%' 中两边的 % 表示通配符, ${keyWord} 表示模糊查询的变量。

  • 测试
@Test
public void searchMemberByNick() {
    PersonDAO memberDAO = MyBatisUtil.getMapper(PersonDAO.class);
    List<Person> members = memberDAO.searchMemberByNick("小");
    for (Person m: members) {
        System.out.println(m);
    }
}

2.2 #{}${} 的区别

  • ${key} 表示获取参数,先获取参数的值拼接到SQL语句中,再编译执行SQL语句;可能引起SQL注入问题 ,模糊查询中使用
  • #{key} 表示获取参数,先完成SQL编译(预编译),预编译之后再将获取的参数设置到SQL与中 ,可以避免SQL注入问题

3. 配置Druid数据源

当我们配置MyBatis数据源时,只要配置了dataSource标签的type属性值为POOLED时,就可以使用MyBatis内置的连接池管理连接。

如果我们想要使用第三方的数据库连接池,则需进行自定义配置。
现以配置第三方连接池 Druid 做示例。

3.1 添加依赖

配置 Druid 连接池需要添加 Druid 依赖,依赖如下,

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.5</version>
</dependency>

3.2 创建数据源工厂

Mybatis 需要一个连接池工厂,这个工厂可以产生数据库连接池,所以我们需要在 Utils 文件夹中创建 Druid 的数据源工厂。

public class DruidDataSourceFactory extends PooledDataSourceFactory {
    public DruidDataSourceFactory() {
        this.dataSource = new DruidDataSource();
    }
}

3.3 将连接池工厂配置给 MyBatis

<environments default="mysql">
    <environment id="mysql">
        <!--transactionManager标签用于配置数据库管理方式-->
        <transactionManager type="JDBC"></transactionManager>
        <dataSource type="com.mr.Utils.DruidDataSourceFactory">
            <property name="driverClass" value="${driver}"/>
            <property name="jdbcUrl" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>

</environments>

注意 Druid 数据源中的 driverurl 的名字不一样,需要改正,而且 type 要改为我们自己创建的连接池工厂。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值