zoukankan      html  css  js  c++  java
  • 12.动态SQL

    作用:解决大量拼装SQL的工作

    1.动态sql
    	1)<sql>
    		a)把公共的字段抽取出来
    		b)用<include refid="base_user">
    	2)<if>
    		a)条件查询
    		b)修改的时候
    	3)<where>
    		a)自动添加where关键字,去掉多余的and
    	4)<trim>
    		a)可以代替where和set
    	5)<set>
    		a)自动添加set关键字,去掉多余的逗号(传多个逗号,只会去掉一个)
    	6)<choose>
    		a)when
    		b)otherwise
    	7)<foreach>
    		1)collection
    			a)如何是数组就写array
    			b)如何是集合就写list
    			a)如何是Map就写map中的key
    		2)open:循环之前添加
    		3)close:循环之后添加
    		4)separator:分隔符
    		5)item:临时变量

      事例:

    0.数据库

    1.创建项目

    2.建包建配置文件

       com.qf.entity

       com.qf.dao

       com.qf.mapper

       com.qf.utils

    mybatis-config.xml  

    3.con.qf.entity包中创建实体类

    package com.qf.entity;
    
    public class User {
    
    	private Integer id;
    	
    	private String name;
    	
    	private String password;
    	
    	private String isAdmin;
    
    	public User(String name, String password) {
    		this.name = name;
    		this.password = password;
    	}
    	public User() {
    	}
    
    	public String getPassword() {
    		return password;
    	}
    
    	public void setPassword(String password) {
    		this.password = password;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public Integer getId() {
    		return id;
    	}
    
    	public void setId(Integer id) {
    		this.id = id;
    	}
    
    	public String getIsAdmin() {
    		return isAdmin;
    	}
    
    	public void setIsAdmin(String isAdmin) {
    		this.isAdmin = isAdmin;
    	}
    
    	@Override
    	public String toString() {
    		return "User [id=" + id + ", name=" + name + ", password=" + password + ", isAdmin=" + isAdmin + "]";
    	}
    	
    }
    

      

    4.con.qf.dao包中创建接口

    package com.qf.dao;
    
    import java.util.List;
    import java.util.Map;
    
    import com.qf.entity.User;
    
    public interface IUserDao {
    
    	public User getUserById(Integer id);
    	
    	public List<User> findUser(User user);
    	
    	public List<User> findUser2(User user);
    	
    	public List<User> findUser3(User user);
    	
    	public List<User> findUser4(User user);
    	
    	public List<User> findUser5(List<Integer> ids);
    	
    	public List<User> findUser6(int[] ids);
    	
    	public List<User> findUser7(Map<String, Integer[]> map);
    	
    	public void update(User user);
    	
    	public void update2(User user);
    	
    	public List<User> getUserList();
    
    }
    

    5.配置jdbc.properties配置文件

    jdbc.url =jdbc:mysql://localhost:3306/1707_hibernate
    jdbc.name=root
    jdbc.password=root
    jdbc.driver=com.mysql.jdbc.Driver
    

      

    配置mybatis-config.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">
    <configuration>
    
    	<!-- 加载属性文件 
    		resource:本地资源文件
    	-->
    	<properties resource="jdbc.properties"></properties>
    
    	<typeAliases>
    			<package name="com.qf.entity"/>
    	</typeAliases>
    
    	<environments default="development">
    		<environment id="development">
    			<transactionManager type="JDBC" />
    			<dataSource type="POOLED">
    				<property name="driver" value="${jdbc.driver}" />
    				<property name="url" value="${jdbc.url}" />
    				<property name="username" value="${jdbc.name}" />
    				<property name="password" value="${jdbc.password}" />
    			</dataSource>
    		</environment>
    	</environments>
    	
    </configuration>
    

      

    6.com.qf.mapper包创建接口的映射文件

    <?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.qf.dao.IUserDao">
    
    	<resultMap type="user" id="userMap">
    		<result column="is_admin" property="isAdmin"/>
    	</resultMap>
    
    	<!-- 把共用的sql都可以抽取出来 -->
    	<sql id="base_user">
    		id,
    		NAME,
    		PASSWORD,
    		is_admin
    	</sql>
    
    	<select id="getUserById" resultMap="userMap">
    			SELECT
    				<include refid="base_user"></include>
    			FROM
    				t_user
    			WHERE
    				id = #{id}
    	</select>
    	
    	<select id="getUserList" resultMap="userMap">
    		SELECT
    			<include refid="base_user"></include>
    		FROM
    			t_user
    	</select>
    	
    	<!-- 测试if标签 -->
    	<select id="findUser" resultMap="userMap">
    		SELECT
    			<include refid="base_user"></include>
    		FROM
    			t_user
    		WHERE 
    			1 =1 
    			<if test="id != null">
    				and ID = #{id} 
    			</if>
    			<!--字符串判断非空的时候有两种情况 -->
    			<!--concat 链接字符串 -->
    			<if test="name != null and name != ''">
    <!-- 				 and name = #{name} -->
    				 and name like concat("%",#{name},"%")
    			</if>
    	</select>
    	
    	<!-- 测试where标签 -->
    	<select id="findUser2" resultMap="userMap">
    		SELECT
    			<include refid="base_user"></include>
    		FROM
    			t_user
    			<!-- 
    				where标签自动添加where关键字,去掉多余的and关键字
    			 -->
    		<where>
    			<if test="id != null">
    				and ID = #{id} 
    			</if>
    			<if test="name != null and name != ''">
    				 and name like concat("%",#{name},"%")
    			</if>
    		</where>	
    	</select>
    	
    	
    	<!-- 测试trim标签 -->
    	<select id="findUser3" resultMap="userMap">
    		SELECT
    			<include refid="base_user"></include>
    		FROM
    			t_user
    		<!-- 添加前缀,去掉多余的内容 -->
    		<trim prefix="where" prefixOverrides="and">
    			<if test="id != null">
    				and ID = #{id} 
    			</if>
    			<if test="name != null and name != ''">
    				 and name like concat("%",#{name},"%")
    			</if>
    		</trim>
    	</select>
    	
    	
    	<!-- 测试set标签
    		添加set关键字,去掉多余的逗号
    	 -->
    	<update id="update" parameterType="user">
    		UPDATE t_user
    		<set>
    			<if test="name != null and name != ''">
    				 NAME = #{name},
    			</if>
    			
    			<if test="password != null and password != ''">
    				 password = #{password}
    			</if>
    		</set>
    		 where id = #{id}
    	</update>
    	
    	<update id="update2" parameterType="user">
    		UPDATE t_user
    		<trim prefix="set" suffixOverrides=",">
    			<if test="name != null and name != ''">
    				 NAME = #{name},
    			</if>
    			
    			<if test="password != null and password != ''">
    				 password = #{password}
    			</if>
    		</trim>
    		 where id = #{id}
    	</update>
    	
    	
    	<!-- 测试when、otherwise标签 -->
    	<select id="findUser4" resultMap="userMap">
    		SELECT
    			<include refid="base_user"></include>
    		FROM
    			t_user
    		<where>
    			<choose>
    				<when test="name != null and name != ''">
    						name like concat("%",#{name},"%")
    				</when>			
    				<otherwise>
    					name is not null
    				</otherwise>
    		</choose>
    		</where>			
    	</select>
    	
    	<!-- 传递list -->
    	<select id="findUser5" resultMap="userMap">
    		SELECT
    			<include refid="base_user"></include>
    		FROM
    			t_user
    		<where>
    			id in 
    			<foreach collection="list" open="(" close=")" separator="," item="id">
    				#{id}
    			</foreach>				
    		</where>			
    	</select>
    	
    	<!-- 传递数组 -->
    	<select id="findUser6" resultMap="userMap">
    		SELECT
    			<include refid="base_user"></include>
    		FROM
    			t_user
    		<where>
    			id in 
    			<foreach collection="array" open="(" close=")" separator="," item="id">
    				#{id}
    			</foreach>				
    		</where>			
    	</select>
    	
    	<!-- 传递Map -->
    	<select id="findUser7" resultMap="userMap">
    		SELECT
    			<include refid="base_user"></include>
    		FROM
    			t_user
    		<where>
    			id in 
    			<foreach collection="ids" open="(" close=")" separator="," item="id">
    				#{id}
    			</foreach>				
    		</where>			
    	</select>
    	
    </mapper>
    

      

    7.在mybatis-config.xml里面读取Mapper文件

            <!-- Mapper文件 -->
    	<mappers>
    		<mapper resource="com/qf/mapper/IUserDao.xml" />
    	</mappers>
    	
    

    8.com.qf.util工具类

    package com.qf.utils;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    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.xml.sax.InputSource;
    
    public class MyBatisUtil {
    
    	private static SqlSessionFactory sqlSessionFactory;
    
    	public static SqlSessionFactory getSqlSessionFactory() {
    
    		if (sqlSessionFactory == null) {
    			initSqlSessionFactory(); // 为空再去参加
    		}
    		return sqlSessionFactory;
    	}
    
    	private static void initSqlSessionFactory() {
    		InputStream ips = null;
    		try {
    			// 1.指定配置文件
    			ips = Resources.getResourceAsStream("mybatis-config.xml");
    
    			// 2.赋值操作
    			synchronized (MyBatisUtil.class) {
    				if (sqlSessionFactory == null) {
    					sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);
    				}
    			}
    
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			if (ips != null) {
    				try {
    					ips.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }
    

      

    9.测试类

    package com.qf.dao;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.ibatis.session.SqlSession;
    import org.apache.log4j.Logger;
    import org.junit.Test;
    
    import com.qf.entity.User;
    import com.qf.utils.MyBatisUtil;
    
    public class UserDaoTest {
    
    	private Logger logger = Logger.getLogger(UserDaoTest.class);
    
    	/**
    	 * useGeneratedKeys:开启主键回填 keyProperty:回填到那个属性
    	 */
    	/**
    	 * 抽取公共sql,查询当个对象
    	 */
    	@Test
    	public void testGetUserById() {
    		SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
    		IUserDao userDao = sqlSession.getMapper(IUserDao.class);
    		User user = userDao.getUserById(4);
    		System.out.println(user);
    		sqlSession.commit();
    		sqlSession.close();
    	}
    
    	/**
    	 * 抽取公共sql,查询List
    	 */
    	@Test
    	public void testGetUserList() {
    		SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
    		IUserDao userDao = sqlSession.getMapper(IUserDao.class);
    		List<User> userList = userDao.getUserList();
    		for (User user2 : userList) {
    			System.out.println(user2);
    		}
    		sqlSession.commit();
    		sqlSession.close();
    	}
    
    	/**
    	 * 测试if标签 初识if
    	 */
    	@Test
    	public void testFindUser() {
    		SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
    		IUserDao userDao = sqlSession.getMapper(IUserDao.class);
    		User user = new User();
    		user.setPassword("123");
    
    		List<User> findUser = userDao.findUser(user);
    		for (User user2 : findUser) {
    			System.out.println(user2);
    		}
    		sqlSession.commit();
    		sqlSession.close();
    	}
    
    	/**
    	 * 测试if标签 if+模糊查询
    	 */
    	@Test
    	public void testFindUser1() {
    		SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
    		IUserDao userDao = sqlSession.getMapper(IUserDao.class);
    		User user = new User();
    		// 模糊查询
    		user.setName("张");
    
    		List<User> findUser = userDao.findUser1(user);
    		for (User user2 : findUser) {
    			System.out.println(user2);
    		}
    		sqlSession.commit();
    		sqlSession.close();
    	}
    
    	/**
    	 * 测试where标签 初识where
    	 */
    	@Test
    	public void testFindUser2() {
    		SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
    		IUserDao userDao = sqlSession.getMapper(IUserDao.class);
    		User user = new User();
    		user.setPassword("123");
    
    		List<User> findUser = userDao.findUser2(user);
    		for (User user2 : findUser) {
    			System.out.println(user2);
    		}
    		sqlSession.commit();
    		sqlSession.close();
    	}
    
    	/**
    	 * 测试trim标签
    	 */
    	@Test
    	public void testFindUser3() {
    		SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
    		IUserDao userDao = sqlSession.getMapper(IUserDao.class);
    		User user = new User();
    		user.setPassword("123");
    
    		List<User> findUser = userDao.findUser3(user);
    		for (User user2 : findUser) {
    			System.out.println(user2);
    		}
    		sqlSession.commit();
    		sqlSession.close();
    	}
    
    	/**
    	 * 测试update标签
    	 */
    	@Test
    	public void testUpdate() {
    		SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
    		IUserDao userDao = sqlSession.getMapper(IUserDao.class);
    		User user = new User();
    		user.setId(3);
    		user.setName("李四");
    		user.setPassword("435");
    		userDao.update(user);
    		sqlSession.commit();
    		sqlSession.close();
    	}
    
    	@Test
    	public void testUpdate2() {
    		SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
    
    		IUserDao userDao = sqlSession.getMapper(IUserDao.class);
    
    		User user = new User();
    		user.setId(3);
    		user.setName("李5");
    
    		userDao.update2(user);
    		sqlSession.commit();
    		sqlSession.close();
    	}
    
    	/**
    	 * 测试when、otherwise标签
    	 */
    	@Test
    	public void testFindUser4() {
    		SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
    
    		IUserDao userDao = sqlSession.getMapper(IUserDao.class);
    
    		User user = new User();
    		// user.setName("李");
    
    		List<User> findUser4 = userDao.findUser4(user);
    		for (User user2 : findUser4) {
    			System.out.println(user2);
    		}
    		sqlSession.commit();
    		sqlSession.close();
    	}
    
    	/**
    	 * 传递list
    	 */
    	@Test
    	public void testFindUser5() {
    		SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
    
    		IUserDao userDao = sqlSession.getMapper(IUserDao.class);
    
    		List<Integer> list = new ArrayList<Integer>();
    		list.add(2);
    		list.add(3);
    		list.add(4);
    		list.add(5);
    		List<User> findUser4 = userDao.findUser5(list);
    		for (User user2 : findUser4) {
    			System.out.println(user2);
    		}
    		sqlSession.commit();
    		sqlSession.close();
    	}
    
    	/**
    	 * 传递数组
    	 */
    	@Test
    	public void testFindUser6() {
    		SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
    
    		IUserDao userDao = sqlSession.getMapper(IUserDao.class);
    
    		int[] ids = new int[] { 1, 2, 3, 4, 5 };
    
    		List<User> findUser4 = userDao.findUser6(ids);
    		for (User user2 : findUser4) {
    			System.out.println(user2);
    		}
    		sqlSession.commit();
    		sqlSession.close();
    	}
    
    	/**
    	 * 测试map
    	 */
    
    	@Test
    	public void testFindUser7() {
    		SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
    
    		IUserDao userDao = sqlSession.getMapper(IUserDao.class);
    
    		Integer[] ids = new Integer[] { 1, 2, 3, 4, 5 };
    
    		Map<String, Integer[]> map = new HashMap<String, Integer[]>();
    		map.put("ids", ids);
    		List<User> findUser4 = userDao.findUser7(map);
    		for (User user2 : findUser4) {
    			System.out.println(user2);
    		}
    		sqlSession.commit();
    		sqlSession.close();
    	}
    
    }
    

     总结:

       

  • 相关阅读:
    最大子数组问题(分治策略实现)
    Solving the Detached Many-to-Many Problem with the Entity Framework
    Working With Entity Framework Detached Objects
    Attaching detached POCO to EF DbContext
    如何获取qq空间最近访问人列表
    Health Monitoring in ASP.NET 2.0
    problem with displaying the markers on Google maps
    WebMatrix Database.Open… Close() and Dispose()
    Accessing and Updating Data in ASP.NET: Retrieving XML Data with XmlDataSource Control
    Create web setup project that has crystal reports and sql script run manually on client system
  • 原文地址:https://www.cnblogs.com/tournesol/p/8099231.html
Copyright © 2011-2022 走看看