使用的mysql数据库
一.如何在xml里写create语句
<select id="createTable" >
CREATE TABLE ${name} AS SELECT * FROM TB_HISTORY WHERE 1=2
</select>
上面这个语句的意思就是,查询TB_HISTORY表字段,并以该表字段创建一个新表,表名为传进来的table变量的值,所以xml可以通过select标签写create语句
二.如何在xml里以表名作为变量
<select id="createTable" >
CREATE TABLE ${name} AS SELECT * FROM TB_HISTORY WHERE 1=2
</select>
在mybatis plus的xm文件中,我们一般都是使用#{}来传递变量值,但若是以表明作为变量名,应该使用${}传递变量名
三.#{}与${}传值的区别
a.#{} 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符;而${}仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
b. #{} 解析之后会将String类型的数据自动加上引号,其他数据类型不会;而${} 解析之后是什么就是什么,他不会当做字符串处理。
c. #{} 很大程度上可以防止SQL注入(SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作);而${} 主要用于SQL拼接的时候,有很大的SQL注入隐患。
如
<select id="getTeacher" resultType="Teacher">
SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
</select>
#{id}传值为1的话,则最终发送的sql为:select t_id id,t_name name from teacher where t_id=1
又比如
select * from table where name = #{name} ,
这时sql语句解析是会加上'',若传入的name为小李,那么最后打印出来的就是 select * from table where name = ‘小李’,
而用${}传值
select * from table where name = ${name}
传入的值也为小李,那么解析出来的sql就是 select * from table where name = 小李
四.in查询的两种写法
有两种方式一种是用#{}传值,一种使用${}传值
1.方式1
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
使用这种方式需要注意的是,传入进来的id的值是以数组的形式传递,而不是1,2,3以逗号分割的字符串分割的这种形式
2.方式2
这种方式的传值就可以直接用1,2,3以逗号分割的字符串的形式
五、xml中<号的写法
xml中<号需要转义,需要用<来代替
>好可以用>来代替
六、事务的实现
在方法上加上@Transactional注解即可
事务失效的几种原因
1.方法未用public修饰
2.同一个类中方法调用,如A方法调用B方法,注解@Transactional在B上,导致@Transactional失效
3.注解的方法捕捉了异常
4.数据库引擎不支持事务,这种情况出现的概率并不高,事务能否生效数据库引擎是否支持事务是关键。常用的MySQL数据库默认使用支持事务的innodb引擎。一旦数据库引擎切换成不支持事务的myisam,那事务就从根本上失效了。
七、mybatis plus 打印SQL语句到日志文件或控制台
需要打印日志到控制台加上以下配置
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
需要打印到日志文件里加上以下配置
logging.level.com.montnets.db.dao=debug
logging.level.com.montnets.db.dao为mapper接口所造的包路径
八、mybatis plus 调用存储过程的写法
<select id="createTableByP" >
call CREATE_TABLE_BACKHIS(#{name})
</select>
<select id="createTableByP2" >
{call CREATE_TABLE_BACKHIS(#{name})}
</select>
如上sql所示,直接用select标签包裹,然后通过call调用存储过程名即可,整个sql可以用{}包裹起来,也不不用包裹,区别读者可自行去研究