Mybatis如何自动生成sql语句
程序员文章站
2022-06-21 17:43:37
目录mybatis自动生成sql语句mybatis的动态sql语句if标签的使用where标签的使用foreach标签的使用sql语句的简化编写mybatis自动生成sql语句创建maven项目,将该...
mybatis自动生成sql语句
创建maven项目,将该配置文件运行即可生成 sql 语句
<?xml version="1.0" encoding="utf-8"?> <!doctype generatorconfiguration public "-//mybatis.org//dtd mybatis generator configuration 1.0//en" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <!-- mybatis 自动生成sql代码 --> <generatorconfiguration> <!-- 导入jar包(路径) --> <classpathentry location="e:\courseware\mysql\mysql-connector-java-5.1.26-bin.jar" /> <!-- 设置生成代码的规则 targetruntime 开发环境使用mybatis3的版本 --> <context id="db2tables" targetruntime="mybatis3"> <plugin type="org.mybatis.generator.plugins.rowboundsplugin"></plugin> <commentgenerator> <!-- 这个元素用来去除指定生成的注释中是否包含生成的日期 false:表示保护 --> <!-- 如果生成日期,会造成即使修改一个字段,整个实体类所有属性都会发生变化,不利于版本控制,所以设置为true --> <property name="suppressdate" value="true" /> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressallcomments" value="false" /> </commentgenerator> <!-- 连接数据库的四要素 --> <jdbcconnection driverclass="com.mysql.jdbc.driver" connectionurl="jdbc:mysql://localhost:3306/user" userid="root" password="root"> </jdbcconnection> <!-- 该属性用于指定mybatis生成器是否应该强制使用java.math。小数点和数字域的bigdecimal --> <javatyperesolver> <property name="forcebigdecimals" value="false" /> </javatyperesolver> <!-- 定义实体类 bean --> <javamodelgenerator targetpackage="en.et.entity" targetproject="src/main/java"> <property name="enablesubpackages" value="true" /> <property name="trimstrings" value="true" /> </javamodelgenerator> <!-- 接口映射的注解 或者xml文件路径 --> <sqlmapgenerator targetpackage="cn.et.resource" targetproject="src/main/java"> <property name="enablesubpackages" value="true" /> </sqlmapgenerator> <!-- 生成的接口所在的位置 type="xml 或者 注解" --> <javaclientgenerator type="annotatedmapper" targetpackage="en.et.dao" targetproject="src/main/java"> <property name="enablesubpackages" value="true" /> </javaclientgenerator> <!-- 告诉mbg 需要生成代码的数据库的表 --> <table tablename="emp"></table> </context> </generatorconfiguration>
mybatis的动态sql语句
mybatis的动态sql语句主要解决的问题是不同条件sql语句的拼接。
例如:根据用户信息,查询用户列表,当不知道根据的是用户的什么信息时,写出查询的sql语句是有一定困难的,而动态sql语句主要解决的就是此类问题。
if标签的使用
在持久层接口定义方法
/** * 根据用户信息,查询用户列表 * @param user * @return */ list<user> findbyuser(user user);
编写持久层接口对应的映射文件
<!-- 根据用户信息,查询用户列表 --> <select id="findbyuser" resulttype="user" parametertype="user"> select *from user where 1 = 1 <if test="id != 0"> and id = #{id} </if> <if test="username != null and username != '' "> and username like #{username} </if> <if test="birthday != null"> and birthday = #{birthday} </if> <if test="sex != null"> and sex = #{sex} </if> <if test="address != null"> and address = #{address} </if> </select>
编写测试方法
/** * 根据用户信息,查询用户列表 */ @test public void testfindbyuser() { user user = new user(); user.setusername("%王%"); list<user> users = userdao.findbyuser(user); for (user u : users) { system.out.println(u); } }
where标签的使用
为了简化上面 where 1=1 的条件拼接,我们可以采用标签来简化开发,因此修改持久层映射文件
<!-- 根据用户信息,查询用户列表 --> <select id="findbyuser" resulttype="user" parametertype="user"> select *from user <where> <if test="id != 0"> and id = #{id} </if> <if test="username != null and username != '' "> and username like #{username} </if> <if test="birthday != null"> and birthday = #{birthday} </if> <if test="sex != null"> and sex = #{sex} </if> <if test="address != null"> and address = #{address} </if> </where> </select>
foreach标签的使用
froeach是对一个集合进行遍历,通常在构建in条件语句的时候应用
例如:根据一个用户id集合查询用户。
对id集合进行封装,加入到list集合
编写持久层接口方法
/** * 根据id集合查询用户 * @param queryur * @return */ list<user> findinids(queryur queryur);
编写持久层接口映射文件
<!--根据id集合查询用户 --> <select id="findinids" resulttype="user" parametertype="int"> select *from user <where> <if test="ids != null and ids.size() > 0"> <!-- foreach:用于遍历集合 collection:代表要遍历的集合 open:代表语句的开始部分 close:代表语句的结束部分 item:代表需要遍历的集合的每个元素 sperator:代表分隔符 --> <foreach collection="ids" open="id in (" close=")" item="uid" separator=","> #{uid} </foreach> </if> </where> </select>
编写测试方法
/** * 根据id集合查询用户 */ @test public void testfindinids() { queryur queryur = new queryur(); list<integer> ids = new arraylist<integer>(); ids.add(41); ids.add(43); ids.add(45); queryur.setids(ids); list<user> users = userdao.findinids(queryur); for (user user : users) { system.out.println(user); } }
sql语句的简化编写
在映射文件中,可以将重复的sql语句通过sql标签提取出来,使用include标签引用即可,已达到sql重用的效果。如下所示:
<!--抽取重复的语句代码片段--> <sql id="querysql"> select *from user </sql> <select id="findall" resulttype="user" > <include refid="querysql"></include> </select> <!--根据id查询用户--> <select id="findbyid" resulttype="user" parametertype="int"> <include refid="querysql"></include> where id= #{userid}; </select>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
推荐阅读