Mybatis的动态sql拼接语句

Posted lijiahaoAA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis的动态sql拼接语句相关的知识,希望对你有一定的参考价值。

Mybatis的动态sql拼接语句


技术图片

1.主配置文件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>
 ?
     <properties resource="jdbcConfig.properties"/>
 ?
     <!--配置别名-->
     <typeAliases>
         <package name="com.itheima.domain" ></package>
     </typeAliases>
 ?
     <!--配置环境-->
     <environments default="mysql">
         <!--配置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>
 ?
     <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
     <mappers>
         <package name="com.itheima.dao"></package>
     </mappers>
 </configuration>
2.dao接口映射配置文件
 <?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.itheima.dao.IUserDao">
     <!--配置查询所有-->
     <!--    resultType:返回值要封装的全限定类名
             parameterType:传递自定义参数时,写入参数的全限定类名
                           传递基本类型时,写入java.lang.Integer/INT/Integer都可以
                           -->
 ?
     <!--抽取重复的sql代码-->
     <sql id="asdfgh" >
         select * from user;
     </sql>
 ?
     <select id="findAll" resultType="user">
         <include refid="asdfgh"></include>
         <!-- select * from user;  -->
     </select>
 ?
 ?
     <!--根据id查找一个用户的信息-->
     <select id="findById" parameterType="INT" resultType="user">
         select * from user where id = #{userid}
     </select>
 ?
     <!--根据名称模糊查询-->
     <select id="findByName" parameterType="string" resultType="com.itheima.domain.User">
         select * from user where username like #{name}
         /* select * from user where username like ‘%${value}%‘ */
     </select>
 ?
     <!--根据QueryVo的条件查询用户-->
     <select id="findUserByVo" parameterType="com.itheima.domain.QueryVo" resultType="com.itheima.domain.User">
           select * from user where username like #{user.username}
     </select>
 ?
     <!--根据条件查询-->
     <select id="findUserByCondition" resultType="com.itheima.domain.User" parameterType="user">
         select * from user
         <where>
             <if test="username != null">
                 and username = #{username}
             </if>
             <if test="sex != null">
                 and sex = #{sex}
             </if>
         </where>
     </select>
 ?
     <!--根据queryvo中的id集合实现查询用户列表-->
     <select id="findUserInIds" resultType="com.itheima.domain.User" parameterType="com.itheima.domain.QueryVo">
         select * from user
         <where>
             <if test="ids != null and ids.size() > 0">
                 <foreach collection="ids" item="uid" separator="," open="and id in (" close=")">
                     #{uid}
                 </foreach>
             </if>
         </where>
     </select>
 </mapper>
3.jdbc连接池
 jdbc.driver=com.mysql.cj.jdbc.Driver
 jdbc.url=jdbc:mysql://localhost:3306/eesy?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
 jdbc.username=root
 jdbc.password=123456
4.日志
 ### 设置###
 log4j.rootLogger = debug,CONSOLE,LOGFILE
 ?
 log4j.logger.org.apache.axis.enterprise=FATAL,CONSOLE
 ?
 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
 ?
 ### 输出ERROR 级别以上的日志到=E://logs/error.log ###
 log4j.appender.LOGFILE = org.apache.log4j.FileAppender
 log4j.appender.LOGFILE.FILE = F://logs/error.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
5.实体类user
 package com.itheima.domain;
 ?
 import java.io.Serializable;
 import java.util.Date;
 ?
 /**
  * @Author: lijiahao
  * @Description:
  * @Data: Create in 21:37 2020/2/22
  * @Modified By:
  */
 public class User implements Serializable {
     private Integer id;
     private String username;
     private Date birthday;
     private String sex;
     private String address;
 ?
     public Integer getId() {
         return id;
    }
 ?
     public void setId(Integer id) {
         this.id = id;
    }
 ?
     public String getUsername() {
         return username;
    }
 ?
     public void setUsername(String username) {
         this.username = username;
    }
 ?
     public Date getBirthday() {
         return birthday;
    }
 ?
     public void setBirthday(Date birthday) {
         this.birthday = birthday;
    }
 ?
     public String getSex() {
         return sex;
    }
 ?
     public void setSex(String sex) {
         this.sex = sex;
    }
 ?
     public String getAddress() {
         return address;
    }
 ?
     public void setAddress(String address) {
         this.address = address;
    }
 ?
     @Override
     public String toString() {
         return "User{" +
                 "id=" + id +
                 ", username=‘" + username + ‘‘‘ +
                 ", birthday=" + birthday +
                 ", sex=‘" + sex + ‘‘‘ +
                 ", address=‘" + address + ‘‘‘ +
                 ‘}‘;
    }
 }
 ?
6.实体类QueryVo
 package com.itheima.domain;
 ?
 import java.util.List;
 ?
 /**
  * @Author: lijiahao
  * @Description:
  * @Data: Create in 16:04 2020/2/24
  * @Modified By:
  */
 public class QueryVo {
 ?
     private User user;
 ?
     private List<Integer> ids;
 ?
     public List<Integer> getIds() {
         return ids;
    }
 ?
     public void setIds(List<Integer> ids) {
         this.ids = ids;
    }
 ?
     public User getUser() {
         return user;
    }
 ?
     public void setUser(User user) {
         this.user = user;
    }
 }
 ?
7.接口
 package com.itheima.dao;
 ?
 import com.itheima.domain.QueryVo;
 import com.itheima.domain.User;
 ?
 import java.util.List;
 ?
 /**
  * @Author: lijiahao
  * @Description: 用户的持久层接口
  * @Data: Create in 21:42 2020/2/22
  * @Modified By:
  */
 public interface IUserDao {
 ?
     List<User> findAll();
 ?
     //根据id查询用户信息
     User findById(Integer userId);
 ?
     //根据名称模糊查询用户信息
     List<User> findByName(String username);
 ?
     //根据QueryVo中的条件查询用户
     List<User> findUserByVo(QueryVo vo);
 ?
     /**
      * @Author Lijiahao
      * @Description 根据传入的参数条件查询
      * @Date 18:35 2020/2/25
      * @Param [user] 传入的条件:有可能有用户名,有可能有性别,也有可能有地址,也可能全都有
      * @return java.util.List<com.itheima.domain.User>
      **/
     List<User> findUserByCondition(User user);
 ?
     /**
      * @Author Lijiahao
      * @Description 根据QueryVo中提供的id集合,查询用户信息
      * @Date 23:11 2020/2/25
      * @Param [vo]
      * @return java.util.List<com.itheima.domain.User>
      **/
     List<User> findUserInIds(QueryVo  vo);
 ?
 }
 ?
8.接口实现
 package com.itheima.dao.impl;
 ?
 import com.itheima.dao.IUserDao;
 import com.itheima.domain.QueryVo;
 import com.itheima.domain.User;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
 ?
 import java.util.List;
 ?
 /**
  * @Author: lijiahao
  * @Description:
  * @Data: Create in 16:39 2020/2/24
  * @Modified By:
  */
 public class UserDaoImpl implements IUserDao {
 ?
     private SqlSessionFactory factory;
 ?
     public UserDaoImpl(SqlSessionFactory factory){
         this.factory = factory;
    }
 ?
     public List<User> findAll() {
         //1.根据factory获取SqlSession对象
         SqlSession sqlSession = factory.openSession();
         //2.调用SqlSession中的方法实现查询列表
         List<User> users  = sqlSession.selectList("com.itheima.dao.IUserDao.findAll");//参数就是能获得配置信息的key
         //3.释放资源
         sqlSession.close();
         return users;
    }
 ?
     public void saveUser(User user) {
         //1.根据factory获取SqlSession对象
         SqlSession sqlSession = factory.openSession();
         //2.调用SqlSession中的方法实现更新列表
         sqlSession.insert("com.itheima.dao.IUserDao.saveUser",user);
         //3.提交事务
         sqlSession.commit();
         //4.关闭资源
         sqlSession.close();
    }
 ?
     public void updateUser(User user) {
         //1.根据factory获取SqlSession对象
         SqlSession sqlSession = factory.openSession();
         //2.调用SqlSession中的方法实现更新列表
         sqlSession.update("com.itheima.dao.IUserDao.updateUser",user);
         //3.提交事务
         sqlSession.commit();
         //4.关闭资源
         sqlSession.close();
    }
 ?
     public void deleteUser(Integer userId) {
         //1.根据factory获取SqlSession对象
         SqlSession sqlSession = factory.openSession();
         //2.调用SqlSession中的方法实现更新列表
         sqlSession.delete("com.itheima.dao.IUserDao.deleteUser",userId);
         //3.提交事务
         sqlSession.commit();
         //4.关闭资源
         sqlSession.close();
    }
 ?
     public User findById(Integer userId) {
         //1.根据factory获取SqlSession对象
         SqlSession sqlSession = factory.openSession();
         //2.调用SqlSession中的方法,实现查询一个
         User user = sqlSession.selectOne("com.itheima.dao.IUserDao.findById",userId);
         //3.提交事务
         sqlSession.commit();
         //4.关闭资源
         sqlSession.close();
         return user;
    }
 ?
     public List<User> findByName(String username) {
         //1.根据factory获取SqlSession对象
         SqlSession sqlSession = factory.openSession();
         //2.调用SqlSession中的方法,实现查询一个
         List<User> users = sqlSession.selectList("com.itheima.dao.IUserDao.findByName",username);
         //3.提交事务
         sqlSession.commit();
         //4.关闭资源
         sqlSession.close();
         return users;
    }
 ?
     public List<User> findUserByVo(QueryVo vo) {
         return null;
    }
 ?
     public List<User> findUserByCondition(User user) {
         //1.根据factory获取SqlSession对象
         SqlSession sqlSession = factory.openSession();
         //2.调用SqlSession中的方法,实现查询一个
         List<User> users = sqlSession.selectList("com.itheima.dao.IUserDao.findUserByCondition",user);
         //3.提交事务
         sqlSession.commit();
         //4.关闭资源
         sqlSession.close();
         return users;
 }
 ?
     public List<User> findUserInIds(QueryVo vo) {
         //1.根据factory获取SqlSession对象
         SqlSession sqlSession = factory.openSession();
         //2.调用SqlSession中的方法,实现查询一个
         List<User> users = sqlSession.selectList("com.itheima.dao.IUserDao.findUserInIds",vo);
         //3.提交事务
         sqlSession.commit();
         //4.关闭资源
         sqlSession.close();
         return users;
    }
 ?
     public int findTotal() {
         //1.根据factory获取SqlSession对象
         SqlSession sqlSession = factory.openSession();
         //2.调用SqlSession中的方法,实现查询一个
         Integer count = sqlSession.selectOne("com.itheima.dao.IUserDao.findTotal");
         //3.提交事务
         sqlSession.commit();
         //4.关闭资源
         sqlSession.close();
         return count;
    }
 }
 ?
9.测试
 package com.itheima;
 ?
 import com.itheima.dao.IUserDao;
 import com.itheima.dao.impl.UserDaoImpl;
 import com.itheima.domain.QueryVo;
 import com.itheima.domain.User;
 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.Date;
 import java.util.List;
 ?
 /**
  * @Author: lijiahao
  * @Description:
  * @Data: Create in 22:56 2020/2/22
  * @Modified By:
  */
 public class test {
 ?
     private InputStream in;
     private IUserDao userDao;
 ?
     @Before
     public void init() throws IOException {
         //1.读取配置文件
         in = Resources.getResourceAsStream("SqlMapConfig.xml");
         //2.创建SqlSessionFactory工厂
         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
         SqlSessionFactory sqlSessionFactory =  sqlSessionFactoryBuilder.build(in);
         //3.使用工厂生产dao对象
         userDao = new UserDaoImpl(sqlSessionFactory);
    }
 ?
     @After
     public void destory() throws IOException {
         in.close();
    }
 ?
     @Test
     public void testFindAll() throws IOException {
         //5.使用代理对象执行方法
         List<User> users = userDao.findAll();
         for(User user : users){
             System.out.println(user);
        }
    }
 ?
     /*测试根据id查找信息操作*/
     @Test
     public void testFindById() throws IOException {
         //5.执行保存方法
         User user = userDao.findById(43);
         System.out.println(user);
    }
 ?
     /*测试模糊查询操作*/
     @Test
     public void testFindByName() throws IOException {
         //5.执行保存方法
         List<User> users = userDao.findByName("%王%");
         //List<User> users = userDao.findByName(王);
         for(User user : users){
             System.out.println(user);
        }
    }
 ?
     /*测试Query条件查询操作*/
     @Test
     public void testFindByVo() throws IOException {
         QueryVo queryVo  = new QueryVo();
         User user = new User();
         user.setUsername("%王%");
         queryVo.setUser(user);
         //5.执行保存方法
         List<User> users = userDao.findUserByVo(queryVo);
         //List<User> users = userDao.findByName(王);
         for(User user1 : users){
             System.out.println(user1);
        }
    }
 ?
     /*测试Query条件查询操作*/
     @Test
     public void testFindByCondition() throws IOException {
         User user = new User();
         user.setUsername("老王");
         user.setSex("女");
 ?
         //5.执行保存方法
         List<User> users = userDao.findUserByCondition(user);
         for(User user1 : users){
             System.out.println(user1);
        }
    }
 ?
     /*测试foreach标签的使用*/
     @Test
     public void testFindInIds() throws IOException {
         QueryVo queryVo = new QueryVo();
         List<Integer> list = new ArrayList<Integer>();
         list.add(41);
         list.add(43);
         list.add(44);
         queryVo.setIds(list);
 ?
         //5.执行保存方法
         List<User> users = userDao.findUserInIds(queryVo);
         for(User user1 : users){
             System.out.println(user1);
        }
    }
 }
 ?

 

以上是关于Mybatis的动态sql拼接语句的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis学习笔记:动态SQL

Mybatis的动态sql拼接语句

mybatis入门基础----动态SQL

Mybatis中的动态 SQL

mybatis如何传入java中拼接的sql语句

Mybatis动态SQL语句使用