框架应用: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 ...
随机推荐
- Struts2学习笔记(一)——环境搭建
1.创建Web项目并导入Struts2的主要jar包 在MyEclipse中新建Web项目,然后在lib目录下添加必须的jar包: 2.创建jsp页面 1).创建test.jsp页面: <bod ...
- 如何编写更好的SQL查询:终极指南-第一部分
结构化查询语言(SQL)是数据挖掘分析行业不可或缺的一项技能,总的来说,学习这个技能是比较容易的.对于SQL来说,编写查询语句只是第一步,确保查询语句高效并且适合于你的数据库操作工作,才是最重要的.这 ...
- 使用build_opener 自定义 opener
使用build_opener 自定义 opener,这种方法的好处是可以方便的拓展功能. import urllib.request import http.cookiejar def makeMyO ...
- MySQL(二)之服务管理与初始化文件修改和连接MySQL
上一篇给大家介绍了怎么在linux和windows中安装mysql,本来是可以放在首页的,但是博客园说“安装配置类文件”不让放在首页.接下来给大家介绍一下在linux和windows下MySQL的一下 ...
- HAproxy功能配置
author:JevonWei 版权声明:原创作品 haproxy配置文档 https://cbonte.github.io/haproxy-dconv/ 环境 前端HAProxy 172.16.25 ...
- JAVA实用案例之验证码开发
验证码在很多地方都会遇到,实现的方法和形式也有很多,主要的目的就是为了安全,防止一些恶意的攻击等.说实话那么多年竟然没注意过这东西,原理很简单,贴出来给大家做个参考. 1.简单介绍 一般稍微有些经验的 ...
- vue2+swiper(用户操作swiper后,不能autoplay了)
将autoplayDisableOnInteraction设置为false
- Java数据库连接池比较(c3p0,dbcp,proxool和BoneCP)
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp21 Java框架数据库连接池比较(c3p0,dbcp和proxool,Bo ...
- Xamarin介绍
郑重声明: 本文非Xamarin使用详解,也没什么有用的干货,只是给不知道Xamarin到底是什么的大家提供一点点微不足道的小介绍,看完以后啥收获都没有也不是没可能的(*/ω\*).so......ε ...
- [js高手之路]Vue2.0基于vue-cli+webpack父子组件通信教程
在git命令行下,执行以下命令完成环境的搭建: 1,npm install --global vue-cli 安装vue命令行工具 2,vue init webpack vue-demo 使用v ...