Mybatis如何⾃动⽣成sql语句
⽬录
Mybatis⾃动⽣成sql语句
Mybatis的动态sql语句
if标签的使⽤
where标签的使⽤
foreach标签的使⽤
db2数据库sql语句sql语句的简化编写
Mybatis⾃动⽣成sql语句
创建maven项⽬,将该配置⽂件运⾏即可⽣成 sql 语句
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-////DTD MyBatis Generator Configuration 1.0//EN" "/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="ator.plugins.RowBoundsPlugin"></plugin>
<commentGenerator>
<!-- 这个元素⽤来去除指定⽣成的注释中是否包含⽣成的⽇期 false:表⽰保护 -->
<!-- 如果⽣成⽇期,会造成即使修改⼀个字段,整个实体类所有属性都会发⽣变化,不利于版本控制,所以设置为true -->
<property name="suppressDate" value="true" />
<!-- 是否去除⾃动⽣成的注释 true:是: false:否 -->
<property name="suppressAllComments" value="false" />
</commentGenerator>
<!-- 连接数据库的四要素 -->
<jdbcConnection
driverClass="sql.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="ity" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 接⼝映射的注解或者xml⽂件路径 -->
<sqlMapGenerator targetPackage="source" 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>
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。