Mybatis学习--15.动态SQL
动态SQL为什么需要动态SQL
学习新技术前我们需要知道为什么需要学习这个技术,即这项技术有什么用,在我们的开发过程中有哪些场景可以用到?
我们之前的SQL语句要么是静态的,要么是可以预测的(参数固定的)。但在实际应用中在很多场景下,sql语句并不是固定的。比如:批量删除功能,我们无法预测用户需要删除多少数据,因此我们无法提前编写好sql语句。再比如:用户指定多个属性进行查询,我们也无法确定用户是根据哪些属性进行查询。
以上的业务场景,都不能使用现有的技术来解决,或者说如果使用现有技术会十分麻烦。而动态SQL能够很好的解决该问题。
所谓动态SQL,简单来说就是指SQL语句是动态变化的。能够根据不同的业务场景,得到合适的SQL语句。
if标签
使用场景:多条件查询
<select id="selectByMulti" resultType="car">
<!--test属性为真则执行标签内的语句-->
select * from t_car where 1 = 1
...
Mybatis学习--17.Mybatis的缓存
Mybatis的缓存
在mybatis中提供了一种缓存机制,内存中有一块区域用来存放从数据库中查询的结果。当下次再执行相同的查询语句时,就不需要通过IO的方式从数据库中取数据(数据库中的数据实际上是存放在硬盘文件中),而是直接从缓存中取数据。一方面减少了IO操作次数,另一方面不再执行繁琐的查询算法,提高了查询效率。
缓存机制是计算机中优化性能的一种重要手段。比如计算机系统中cache,java中的字符串常量池,整数常量池(-127-128),线程池、连接池等。都是缓存机制的应用
mybatis缓存包括:一级缓存(将查询的结果存储到SqlSession中)、二级缓存(将查询的结果存储到SqlSessionFactory中)或者集成第三方的缓存
mybatis的缓存机制只针对DQL语句(select),目的是提高查询效率
一级缓存
一级缓存是默认开启的,不需要配置
如果在同一个SqlSession对象执行相同的select语句,就会使用缓存机制,只在第一次执行select语句,其余语句不会执行,而是直接从缓存中取出结果返回。
当SqlSession对象不同或者查询条件不同时,不会使用 ...
Mybatis学习--14.查询专题
#####自定义结果集映射
可以在mapper.xml文件中通过resultMap标签自定义一个结果映射集resultmap,用来指定pojo类的属性和数据库表的字段之间的对应关系。解决了我们编写查询sql语句时需要给字段名重命名的麻烦。
该标签中有两个重要属性:
id:用于唯一标识该映射集
type:指定对应的pojo类
<mapper namespace="com.deng.mybatis.mapper.StudentMapper">
<resultMap id="studentResultMap" type="student" >
<!--为了提高mybatis效率,建议加上数据库表的主键,即使主键字段名和pojo类属性名一致-->
<id property="id" column="id"></id>
<result property="n ...
Mybatis学习--13.Mybatis的参数处理
MyBatis的参数处理单个简单类型参数
单个:接口中方法的参数只有一个
简单类型:接口中方法的参数类型为简单类型。包括基本数据类型 + 包装类 + String + java.util.Date + java.sql.Date
其实sql标签中有一个属性:parameterType。顾名思义,它用来指定参数的类型,但由于mybatis能够在获得参数后自动推断出该参数的类型,因此该属性可以省略。并且mybatis对这些类型也起了别名,比如byte的别名为_byte.
<select id="selectById" resultType="student" parameterType="long">
select * from t_student where id = ${id};
</select>
12345678910111213141516* 还有map集合作为参数,pojo类作为参数。mybatis都能自动推断其类型* ##### 多参数* 指接 ...
Mybatis学习--12.Mybatis小技巧
MyBatis小技巧
‘#{}’和’${}’
两者均能用于sql语句中
‘#{}’:底层使用的是preparedStatement,先进行sql语句的编译,再给sql语句的?传值,可以避免sql注入
‘${}’:底层使用的是Statement,先对sql语句进行拼接,再对sql语句进行编译,存在sql注入的问题
注意:#{}和${}用于sql语句中,非sql语句没有必要使用。
优先使用’#{}‘,避免sql注入的问题。
使用#{}取值时,取出来的值默认会带 ‘’ .
使用${}的情况
将sql语句中的关键字进行传输,就要使用’${}’,比如根据用户指定的排序规则(asc,desc)进行数据查询。如果使用’#{asc}‘,那么在sql语句中出现的是’asc’,是一个字符串,而采用后者,会将参数直接拼接到sql语句上,那么出现的就是asc了。
批量删除
批量删除的方法
delete from xxx where xx = xx or xx = xx;
delete from xxx where xx in(xx,xx,xx);
当使用第二种方法时,我们 ...
Mybatis学习--11.动态代理生成实现某个接口的对象
MyBatis中通过动态代理生成实现接口的对象
在mybatis中对javassist进行了二次封装,即可以在mybatis中使用javassist
经过我们的改造,我们的dao层的AccountDaoImpl类已经变成了以下模样
package com.deng.bank.dao.impl;
import com.deng.bank.dao.AccountDao;
import com.deng.bank.pojo.Account;
import com.deng.bank.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
public class AccountDaoIm implements AccountDao {
public Account select(String actno){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
Account act = ( ...
Mybatis学习--10.利用javassist动态生成类
利用javassist动态生成类12345678910111213141516171819202122232425262728293031package com.deng.javaSsist;import javassist.CtClass;import javassist.CtMethod;import org.junit.Test;import javassist.ClassPool;import java.lang.reflect.Method;public class javassistTest { @Test public void testGenerateFirstClass() throws Exception{ //get the class pool ClassPool pool = ClassPool.getDefault(); //make a class; CtClass ctClass = pool.makeClass("com.deng.bank.dao.imp ...
Mybatis学习--9.Web项目中使用Mybatis
在WEB项目中使用MyBatis(以银行转账业务为例)
使用maven新建项目,在pom文件中将打包方式改为war,并重载(reload)项目。在pom文件中引入相关依赖
编写mybatis配置文件及logback配置文件:mybatis-config.xml,XxxMapper.xml,logback.xml
右键项目,找到openMouduleSettings。双击红色路径,这一步是在项目中引入web框架
在webapp目录下新建一个html文件(当作欢迎页使用),编写前端代码。项目逻辑:从前往后
编写后端代码
采用三层架构
建包:web(表现层)、service(业务层)、dao(可持久层)、util(工具包)、exceptions(异常包)、pojo(javaBean)
在web包下创建Servlet类,接收前端用户提交的数据,并调用相关业务方法。于此同时,编写pojo类
package com.deng.bank.web;
import com.deng.bank.exceptions.moneyNotEnoughException;
impo ...
Mybatis学习--7.解析Mybatis配置文件
解析MyBatis配置文件#####解析核心配置文件
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748package com.deng.testmybatisxml;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.io.SAXReader;import org.junit.Test;import java.io.InputStream;import java.util.List;public class ParseXmlByDom4jTest { @Test public void testMybatisXmlConfig() throws Exception{ //获取SAXReader 对象 SAXReader reader = new SAXReader(); ...
Mybatis学习--6.Mybatis核心配置文件
MyBatis核心配置文件
environments标签
配置mybatis环境的标签
在该标签体中可以配置mybatis的多个环境,一个环境就对应一个数据库,也就对应一个SqlSessionFactory对象
default属性。用来指定默认环境,也就是说在不指定环境的情况下,创建的SqlSessionFactory对象对应的是默认环境中的数据库。那么也就是说我们可以在创建SqlSessionFactory的时候指定其对应的环境(数据库)。
transactionManager标签:mybatis的事务管理器。有两种值
jdbc:mybatis负责管理事务,其底层采用jdbc事务管理机制
managed:mybatis不负责管理事务,交给其他容器(Spring)来管理
mybatis底层提供了transcation接口来管理事务。如果选择jdbc,则会实例化JdbcTranscation对象;如果选择managed,则会实例化ManagedTranscation对象
dataSource标签:数据源。为程序提供Connection对象。实际上,dataSource是一套 ...
Mybatis学习--5.使用Mybatis进行CRUD
步骤
使用maven创建工程
引入依赖:mybatis依赖、mysql-connector依赖,junit依赖,logback依赖
编写核心配置文件:mybatis-config.xml,并放在resource根路径下
创建XxxMapper.xml文件,在其中编写sql语句
<insert id="insertCar">
insert into t_car values(null,#{car_num},#{brand},#{guide_price},#{produce_time},#{car_type});
</insert>
<delete id="deleteById">
delete from t_car where id = #{id};
</delete>
<update id=" ...
Mybatis学习--4.Mybatis集成日志文件
MyBatis集成日志文件
有了MyBatis集成日志文件,可以让我们调试起来更加方便
常见的集成日志组件
SLF4J
LOG4J
LOG4J2
STDOUT_LOGGING
…
其中STDOUT_LOGGING是标准日志,MyBatis框架已经实现了这种标准,我们只需开启即可。在mybatis-config.xml文件中配置如下代码
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
该配置信息需要在evrionments前
