‘壹’ 真正的Mybatis动态sql —MyBatis Dynamic SQL
这个库是一个用于生成动态SQL语句的框架。可以将它看作是一个类型安全的sQL模板库,它提供了对MyBatis3和Spring JDBC模板的额外支持。该库将生成供MyBatis或Spring使用的格式化的fuL LETE INET、SELECT和UPDATE语句。最常见的用例是生成可以直接由MyBatis使用的语句和一组数学参数。该库还将生成与Spring JDBC模板兼容的语句和参数对象。该库通过实现一个类似SQL的DSL来工作,该DSL创建一个对象,该对象包含完整的SQL语句和该语句所需的任何参数。
https://github.com/mybatis/mybatis-dynamic-sql
https://mybatis.org/mybatis-dynamic-sql/docs/introction.html
org.mybatis.dynamic.sql.SqlTable 表定义包括表的实际名称(包括适当的模式)。如果需要,可以在选择语句中应用表别名。你的Table应该继承SqlTable 类。
org. mybatiss .dynamic.sql. sqlcolumn 用于定义在库中使用的列。应该使用SqlTable中的构建器方法创建SqlColumns。列定义包括:
我们建议使用以下使用模式以提供最大的灵活性。这个模式允许您以“限定”或“非限定”的方式使用表和列名,这看起来像自然的SQL。例如,在下面的列中,一个列可以被称为 firstName 或 user.firstName 。
该库将创建用作 MyBatis mapper 输入的类。这些类包括生成的SQL,以及与生成的SQL匹配的参数集。这两者都是MyBatis所要求的。这些对象应该是 MyBatis mapper 方法的唯一参数。
(注意: MyBatis Dynamic SQL 不需要XML文件就能工作的很好,但并不意味着不支持XML,毕竟 **MyBatis **最初被设计为是一个 XML 驱动的框架。当你使用关联查询,需要复杂的映射,那么使用XML 与 MyBatis Dynamic SQL 结合起来或者是更好选择,你的XML或许只需要包含一些)
‘贰’ MyBatis中动态sql语句foreach用法
<foreach collection="array" item="item" separator="," >
#{item}
</foreach>
#{item}为数组遍历的元素
其他的就按sql添加语法写
‘叁’ mybatis中$和&区别是什么
在mybatis中#和KaTeX parse error: Expected 'EOF', got '#' at position 8: 的主要区别是:#̲传入的参数在SQL中显示为字符,传入的参数在SqL中直接显示为传入的值,$方式无法防止Sql注入。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${};两者都是动态的向sql语句中传入需要的参数。
‘肆’ mybatis mapper sql语句
--OracleSEQUENCE序列语法:CREATESEQUENCE序列名[INCREMENTBYn][STARTWITHn][{MAXVALUE/MINVALUEn|NOMAXVALUE}][{CYCLE|NOCYCLE}][{CACHEn|NOCACHE}];示例:CREATESEQUENCEsq_test--序列名INCREMENTBY1--每次加几个STARTWITH1--从1开始计数MAXVALUE9999999--最大值9999999NOCYCLE--一直累加,不循环NOCACHE;SELECTsq_test.NEXTVALFROMDUAL;可以使用sequence的地方:--不包含子查询、snapshot、VIEW的SELECT语句--INSERT语句的子查询中--NSERT语句的VALUES中--UPDATE的SET中可以看如下例子:INSERTINTOtable_nameVALUES(sq_test.nextval,'CLERK',1200,SYSDATE);
‘伍’ mybatis查询时传入参数是map集合动态sql语句应该怎么写
在MyBatis中可以用以下的方式来传递多个参数1. 用java.util.Map来传递, Code 如下public List<User> getAllUsersByUserName(String username, int start, int limit){ Map<String,Object> params = new HashMap<String, Object>(3); params.put("username",username); params.put("start",start); params.put("limit",limit); return userMapper.getAllUsersByUserName(params); } 对应的XXMapper.xml文件中如下:<select id="getAllUsersByUserName" parameterType="map" resultType="User"> SELECT u.* FROM User u WHERE u.username LIKE #{username} '%' LIMIT #{start}, #{limit} </select>2. 用JavaBean的方式来传递, Code如下:public List<User> getUsersByUserName(String username){ User user = new User(); user.setUsername(username); return userMapper.getUserByUsername(user); }对应的XXMapper.xml文件中如下:<select id="getAllUsersByUserName" parameterType="User" resultType="User"> SELECT u.* FROM User u WHERE u.username = #{username} </select>OK, 就介绍这两种方法吧!!!
‘陆’ 请教Mybatis中如何在程序中获取Mapper中定义的SQL语句
<mappernamespace="AccountMapper">
<updateid="updateLoginTime"parameterType="int">
<![CDATA[
updatesys_accountsetlogin_date=now(),updatedate=now()whereid=#{accountId}
]]>
</update>
</mapper>
举例如上面的xml定义的Mapper,在代码中可以通过AccountMapper.updateLoginTime获取到update sys_account set login_date = now(), updatedate = now() where id = #{accountId}这行sql
‘柒’ 如何在注解式sql中写入动态的SQL语句
在spring中配置
<,念纳-- 通过扫描的模式,扫描目录在com.mrorder.目录下,所有的mapper都继承SqlMapper接口的接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mrorder."/>
<property name="markerInterface" value="com.mrorder..SqlMapper"/>
</bean>
自己写层方法的接口
public interface OrderMapper extends SqlMapper{
@Select("select * from tbl_order where room like #{room} and mydate like #{mydate}"橘高配)
public List<Order> getbyroom(OrderPara op);
}
这样整个语句是写死的圆指,必须有2个参数,在这种模式下,如何能实现根据room和mydate是否为空来动态的拼写sql语句
比如当mydate=""
Select("select * from tbl_order where room like #{room} ")
public List<Order> getbyroom(OrderPara op);
如果用xml来配置语句的话,可以用<when test="title ,= null">
and mydate= #{mydate}
</when>
如果是用@Select 这种 改如何做呢?
利用自定义注解,通过反射,拼出SQL语句。
‘捌’ MyBatis之Mapper动态代理
Mybatis可以通过接口直接定位到Mapper文件中的SQL语句,这就是mapper的动态代理
需要将IUserDao中的方法名与mapper.xml文件中的id名称做拿要一致,这样子mybatis就可以将方法和sql语句一一对应上了
这样mybatis就会将当前的mapper.xml文件与IUserDao对应上。
通过调用SqlSession的getMapper方法,将要获取的对象的class传入,然后MyBatis就会自己创造IUserDao的对象,采用的是jdk的动态代理技术扰则。
将的实纯李搭现类删除之后,mybatis底层只会调用selectOne()或selectList()方法。而框架选择方法的标准是层方法中用于接收返回值的对象类型。若接收类型为 List,则自动选择 selectList()方法;否则,自动选择 selectOne()方法。