文章目录
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 >= #{minAge} <!-- > -->
</if>
<if test="maxAge != null">
and age <= #{maxAge} <!-- < -->
</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 >= #{minAge} <!-- > -->
</if>
<if test="maxAge != 0">
and age <= #{maxAge} <!-- < -->
</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
数据源中的 driver
和 url
的名字不一样,需要改正,而且 type
要改为我们自己创建的连接池工厂。