框架应用:Mybatis(二) - 动态SQL
MybatisUtil工具类
在实际开发中,我们可以编写一个MybatisUtil辅助类来进行对进行操作。
1)在静态初始化块中加载mybatis配置文件和StudentMapper.xml文件一次
2)使用ThreadLocal对象让当前线程与SqlSession对象绑定在一起
3)获取当前线程中的SqlSession对象,如果没有的话,从SqlSessionFactory对象中获取SqlSession对象
4)获取当前线程中的SqlSession对象,再将其关闭,释放其占用的资源
/**
* MyBatis工具类
* @author AdminTC
*/
public class MyBatisUtil {
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
private static SqlSessionFactory sqlSessionFactory;
static{
try {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private MyBatisUtil(){}
public static SqlSession getSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession == null){
sqlSession = sqlSessionFactory.openSession();
threadLocal.set(sqlSession);
}
return sqlSession;
}
public static void closeSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession != null){
sqlSession.close();
threadLocal.remove();
}
}
public static void main(String[] args) {
Connection conn = MyBatisUtil.getSqlSession().getConnection();
System.out.println(conn!=null?"连接成功":"连接失败");
}
}
MybatisUtil.java
动态SQL
什么是动态SQL,如下图,当你不知道用户会选择多少个筛选条件的时候,你只有等待用户选择而动态地选择SQL查询条件。

动态SQL-选择
加入IUserDao接口,注意因为与数据库互动需要,Dao接口一般要以类作为参数。
package com.harry.dao;
import java.sql.SQLException;
import java.util.List;
import java.util.Set;
import com.harry.entity.User;
public interface IUserDao {
public boolean doCreate(User entity) throws Exception;
public boolean doUpdate(User entity) throws Exception;
public boolean doRemove(Set<Integer> ids)throws Exception;
public User findById(Integer id)throws Exception;
public List<User> findAll() throws Exception;
public List<User> findAllSplite(String column, String keyword, Integer currentPage, Integer lineSize) throws Exception;
public Integer getAllCount(String column, String keyword) throws Exception;
}
IUserDao
书写UserDaoImpl,并在其后添加动态查询的查询方法dynaSQLwithSelect。
package com.harry.dao.impl;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.ibatis.session.SqlSession;
import com.harry.dao.IUserDao;
import com.harry.entity.User;
import com.harry.util.MybatisUtil;
public class UserDaoImpl implements IUserDao {
@Override
public boolean doCreate(User entity) throws Exception {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean doUpdate(User entity) throws Exception {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean doRemove(Set<Integer> ids) throws Exception {
// TODO Auto-generated method stub
return false;
}
@Override
public User findById(Integer id) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public List<User> findAll() throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public List<User> findAllSplite(String column, String keyword, Integer currentPage, Integer lineSize)
throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public Integer getAllCount(String column, String keyword) throws Exception {
// TODO Auto-generated method stub
return null;
}
public List<User> dynaSQLwithSelect(String uname,Character usex) throws Exception{
SqlSession sqlSession = MybatisUtil.getSqlSession();
try{
Map<String,Object> map = new LinkedHashMap<String, Object>();
map.put("uname",uname);
map.put("usex", usex);
return sqlSession.selectList("dynaSQLwithSelect",map);
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
sqlSession.commit();
MybatisUtil.closeSqlSession();
}
}
}
UserDaoImpl
在User.xml中配置相应的SQL方法映射。
<!-- map为调用该方法的外界传入 -->
<select id="dynaSQLwithSelect" parameterType="map" resultType="com.harry.entity.User">
select id,username,sex from user
<where>
<!-- 如果map中uname不为null,则在where后添加username = uname; -->
<if test="uname!=null">
and username=#{uname}
</if>
<!-- 如果map中usex不为null,则在where语句后添加 and sex = usex; -->
<if test="usex!=null">
and sex=#{usex}
</if>
</where>
</select>
User.xml
测试方法
@Test
public void testdynaSQLwithSelect() throws Exception {
UserDaoImpl userDao = new UserDaoImpl();
List<User> list = userDao.dynaSQLwithSelect("张飞", null);
Iterator<User> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
MybatisTest
动态SQL增删改查基本相同,重点是Mybatis通过在配置文件中书写<where>语句来避免数据库SQL拼接。
动态SQL-更新
public boolean dynaSQLwithUpdate(Integer uid, String uname, String usex) throws Exception{
//session应该在事务层进行开关,这里为了方便
SqlSession sqlSession = MybatisUtil.getSqlSession();
try{
Map<String,Object> map = new LinkedHashMap<>();
map.put("uid", uid);
map.put("uname", uname);
map.put("usex", usex);
sqlSession.update("dynaSQLwithUpdate",map);
return true;
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
sqlSession.commit();
MybatisUtil.closeSqlSession();
}
}
UserDaoImpl
<update id="dynaSQLwithUpdate" parameterType="map">
UPDATE user
<set>
<if test="uname!=null">
username=#{user.username},
</if>
<if test="usex!=null">
sex=#{usex},
</if>
</set>
where id=#{uid}
</update>
User.xml
动态SQL-删除
public boolean dynaSQLwithDelete(Integer... ids) throws Exception{
//session应该在事务层进行开关,这里为了方便
SqlSession sqlSession = MybatisUtil.getSqlSession();
try{
Map<String, Object> map = new LinkedHashMap<>();
map.put("ids", ids);
sqlSession.delete("dynaSQLwithDelete",map);
return true;
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
sqlSession.commit();
MybatisUtil.closeSqlSession();
}
}
UserDaoImpl
<delete id="dynaSQLwithDelete" parameterType="map">
DELETE FROM user WHERE id IN
<!-- foreach 用来迭代数组元素 -->
<!-- open表示开始符号 -->
<!-- close表示结束符号 -->
<!-- separator表示分隔符 -->
<!-- item表示迭代的数组 -->
<foreach collection="ids" open="(" close=")" separator="," item="id">
#{id}
</foreach>
</delete>
User.xml
动态SQL- 插入
public boolean dynaSQLwithInsert(User... users) throws Exception{
//session应该在事务层进行开关,这里为了方便
SqlSession sqlSession = MybatisUtil.getSqlSession();
try{
Map<String, Object> map = new LinkedHashMap<>();
map.put("users", users);
sqlSession.insert("dynaSQLwithInsert",map);
return true;
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
sqlSession.commit();
MybatisUtil.closeSqlSession();
}
}
UserDaoImpl
<insert id="dynaSQLwithInsert" parameterType="map" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (username, birthday, sex, address) VALUES
<foreach collection="users" item="user" separator=",">
(#{user.username},#{user.birthday},#{user.sex},#{user.address})
</foreach>
</insert>
</mapper>
User.xml
框架应用:Mybatis(二) - 动态SQL的更多相关文章
- 使用Mybatis实现动态SQL(二)
使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面: *本章节适合有Mybatis基础者观看* 使用Mybatis实现动态SQL ...
- 9、SpringBoot+Mybatis整合------动态sql
开发工具:STS 前言: mybatis框架中最具特色的便是sql语句中的自定义,而动态sql的使用又使整个框架更加灵活. 动态sql中的语法: where标签 if标签 trim标签 set标签 s ...
- MyBatis的动态SQL详解
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...
- mybatis中的.xml文件总结——mybatis的动态sql
resultMap resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功. 如果sql查询字段名和pojo的属性名不一致,可以通过re ...
- MyBatis的动态SQL详解-各种标签使用
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) ...
- Java-MyBatis:MyBatis 3 动态 SQL
ylbtech-Java-MyBatis:MyBatis 3 动态 SQL 1.返回顶部 1. 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架 ...
- 一分钟带你了解下MyBatis的动态SQL!
MyBatis的强大特性之一便是它的动态SQL,以前拼接的时候需要注意的空格.列表最后的逗号等,现在都可以不用手动处理了,MyBatis采用功能强大的基于OGNL的表达式来实现,下面主要介绍下. 一. ...
- Mybatis中动态SQL语句中的parameterType不同数据类型的用法
Mybatis中动态SQL语句中的parameterType不同数据类型的用法1. 简单数据类型, 此时#{id,jdbcType=INTEGER}中id可以取任意名字如#{a,jdbcType ...
- Mybatis解析动态sql原理分析
前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...
随机推荐
- centos7.1磁盘分区 格式化 挂载
1.fdisk -l 查看磁盘状态 2.将 /dev/sdb 分区 fdisk /dev/sdb 3.对分区进行格式化 mkfs -t ext3 /dev/sdb 4.挂载/dev/sdb 到/hom ...
- oracle运行速度与效率高的秘密
使用过Oracle的人都知道,Oracle的运行速度与效率,在同类数据库中是名列前茅的,特别是对大量数据进行访问时,更加有出色的表现.那么,Oracle数据库是靠什么实现的呢?笔者下面将通过一系列的文 ...
- SpringMVC(一)--基础、REST、@RequestParam、POST请求乱码等
1.SpringMVC基本概述 Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 ...
- spring学习笔记2---MVC处理器映射(handlerMapping)三种方式(附源码)
一.根据Beanname访问controller: 在springmmvc-servlet.xml的配置handlermapping中加入beanname,通过该beanname找到对应的contro ...
- struts2-Action处理请求参数
struts2 和 MVC 定义关系 StrutsPrepareAndExecuteFilter : 控制器 JSP : 视图 Action : 可以作为模型,也可以是控制器 struts2 Acti ...
- Python之测试webservice接口
前段时间学习了Python操作http接口,觉得挺容易的.最近项目组也有接触webservice接口,心里想想是否Python也可以操作这类接口.于是利用伟大的度娘,花了6个小时研究出来了,所以迫不及 ...
- Spring中AOP简介与切面编程的使用
Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...
- 移动端踩坑之旅-ios下fixed、软键盘相关问题总结
最近一个项目掉进了移动端的大坑,包括ios下fixed布局,h5唤起键盘等问题,作为一个B端程序员,弱项就是浏览器的兼容性和移动端的适配(毕竟我们可以要求使用chrome),还好这次让我学习了一下相关 ...
- select选择框在谷歌火狐和IE样式的不同
select选择在不同浏览器不同的显示样式, 在IE中 虽然默认和谷歌一样,但是当点击时向下 按钮消失, 解决方法如下: select { /*Chrome和Firefox里面的边框是不一样的,所以复 ...
- poj 1200字符串hash
题意:给出不同字符个数和子串长度,判断有多少个不同的子串 思路:字符串hash. 用字符串函数+map为什么会超时呢?? 代码: #include <iostream> #include ...