文章目录
前言
提示:本文主要使用mybatis里面映射文件的方式,通过if,where和foreache来实现SQL语句动态拼接查询
提示:以下是本篇文章正文内容,下面案例可供参考
一、配置步骤
- 搭建数据库表user,设置有name、password、address三个字段
- 搭建目录结构如下:
- 首先导入坐标,pom.xml文件,如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mybatis_day03_zj</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
</project>
再配置资源设置resources下的日志文件log4j和SqlMapConfig.xml文件
log4j.properties文件:
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
SqlMapConfig.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置mysql的环境-->
<environment id="mysql">
<!-- 配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_day01"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<mapper resource="cn/it/dao/UserDao.xml"/>
</mappers>
</configuration>
二、搭建好目录结构后,进行实现
1.在domain实体目录下封装实体user,并实现get,set,toString方法
2.实现实体QueryVoc
package cn.it.domain;
import java.util.List;
public class QueryVo {
private List<Integer> ids;
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
}
3.实现接口UserDao
代码如下(示例):
package cn.it.dao;
import cn.it.domain.QueryVo;
import cn.it.domain.Users;
import java.util.List;
public interface UserDao {
List<Users> findAll();
//动态查询 <if>,<where>标签模糊查询
List<Users> findByUser(Users user);
//动态标签<foreach>标签
List<Users> findByIds(QueryVo queryVo);
}
4.实现映射文件UserDao.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="cn.it.dao.UserDao">
<!-- namespace:把要映射的接口路径加载过来-->
<!--表属性和实体类映射别名-->
<!--<resultMap id="userMap" type="cn.it.domain.Users">
<id column="id" property="ID"/>
<result column="name" property="user_Name"/>
<result column="password" property="passWord"/>
<result column="address" property="add_Ress"/>
</resultMap>-->
<!--查询所有-->
<select id="findAll" resultType="cn.it.domain.Users">
SELECT * from users
</select>
<!--动态拼接查询-->
<!--定义aql片段-->
<sql id="defaultSql">
SELECT * from users
</sql>
<!--select * from users where 1=1-->
<!--<if>,<where>标签-->
<select id="findByUser" resultType="cn.it.domain.Users" parameterType="cn.it.domain.Users">
<include refid="defaultSql"></include>
<where>
<if test="name!=null and name != '' ">
and name like #{name}
</if>
<if test="address != null">
and address like #{address}
</if>
</where>
</select>
<!--foreach标签 动态范围查询-->
<select id="findByIds" resultType="cn.it.domain.Users" parameterType="cn.it.domain.QueryVo">
<include refid="defaultSql"></include>
<where>
<if test="ids != null and ids.size() > 0">
<foreach collection="ids" open="id in (" separator="," item="iditem" close=")">
#{iditem}
</foreach>
</if>
</where>
</select>
</mapper>
5.实现测试类test
代码如下(示例):
package cn.it.test;
import cn.it.dao.UserDao;
import cn.it.domain.QueryVo;
import cn.it.domain.Users;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class mybatis_test {
//使用封装的方式
private InputStream in;
private SqlSessionFactory factory;
private SqlSession session;
private UserDao userDao;
//初始化方法
@Before
public void init() throws IOException {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory
factory = builder.build(in);
//4.使用工厂生产SqlSession对象,设True自动提交事务openSession(True)
session = factory.openSession();
//5.使用SqlSession创建Dao接口的代理对象
userDao = session.getMapper(UserDao.class);
}
//关闭资源
@After
public void closeResources() throws IOException{
//移交表
session.commit();
//6.释放资源
session.close();
in.close();
}
//查询所有
@Test
public void findAll(){
//5.使用代理对象执行方法
List<Users> users = userDao.findAll();
for(Users user : users){
System.out.println(user);
}
}
/*动态查询,if,where标签*/
@Test
public void testFindByUser() {
Users u = new Users();
u.setUsername("%强");
u.setAddress("%深圳%");
List<Users> users = userDao.findByUser(u);
for(Users user1 : users) {
System.out.println(user1);
}
}
/*动态标签之foreach标签,实现范围查询*/
@Test
public void findByIDs(){
QueryVo qVo = new QueryVo();
ArrayList<Integer> ids = new ArrayList<Integer>();
ids.add(3129);
ids.add(3130);
ids.add(3131);
qVo.setIds(ids);
List<Users> usersList = userDao.findByIds(qVo);
for(Users users1: usersList){
System.out.println(users1);
}
}
}
总结
提示:以上就是简单的对mybatis映射文件方式使用if、where和foreache对SQL语句动态拼接的实现内容,希望对您有用,感谢你的阅读!!!