mybatis执行SQL查不到数据,在数据库执行可以查到

mybatis执行SQL查不到数据,在数据库执行可以查到,第1张

datasource或者jdbc中的配置url不对 , 设置编码格式,表创建时候的编码格式需要在url中声明,并且传入的数据也应该是相同编码格式的(这个没注意,一直用的utf8)

比如 你创建一张表 使用的是engine innodb charset utf8;那么你的数据源url连接就应该是 jdbc:mysql://(数据库地址+端口)/(数据库名)useUnicode=true&characterEncoding=utf8(可能还会有别的参数需要指定);

究其原因 还是因为编码格式的问题,你的李四 到数据库的前,会在myabtis做一些处理,做这些处理的时候,李四就可能不在是李四了 所以使用mybatis查询不到,但是在mysql中直接查询是查询得到的

首先,楼主需了解何为动态sql,何为静态sql,这是他们的区别:

静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。静态SQL在编译时已经确定了引用的表和列。 宿主变量不改变表和列信息。 可以使用主变量改变查询参数值, 但是不能用主变量代替表名或列名。

动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,不在编译时确定 SQL 的表和列,而是让程序在运行时提供,并将SQL 语句文本传给 DBMS 执行。 静态 SQL 语句在编译时已经生成执行计划。 而动态 SQL 语句,只有在执行时才产生执行计划。动态 SQL 语句首先执行 PREPARE 语句要求 DBMS 分析、确认和优化语句,并为其生成执行计划。例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。

下面是一个典型的在MyBatis中使用动态SQL:

<update id="update" parameterType="orgformatdynamicproxymybatisbeanUser"> UPDATE users <trim prefix="SET" prefixOverrides=","> <if test="name != null and name != ''"> name = #{name} </if> <if test="age != null and age != ''"> , age = #{age} </if> <if test="birthday != null and birthday != ''"> , birthday = #{birthday} </if> </trim> where id = ${id}</update>

首先是大体一致的,只是分页查询时oracle用的伪列(rownum),mysql用的是limit,具体的可以百度一下分页;

另外oracle对sql语句要求更为严格,而且oracle里变量较mysql更多点,oracle中有number型,有大数据类型,mysql没得;

另外举个例子,oracle不能插入为空列,而mysql是可以的(个人觉得,不知道正确与否)。还有他们两者函数有不同之处,如转日期函数oracle是to_date('要转的字符串','格式') -- select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dual,而mysql是str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09//都是针对字符串转日期来的。

还有一点,我们常常希望主键可以自动增长,避免我们插入数据时的重复问题,但是oracle不能设置列自动增长,而mysql是可以的,oracle可以用序列加触发器来解决自动增长问题达到与mysql一样的效果。

总体来说百分之九十的sql语句是没区别的。总体来说oracle的格式严格点,对有些字符型的还必须加单引号才能插入,mysql要求就没这么多了。还有当向数据库插入一个日期时,mysql可以直接插入成功,但是oracle需要先转化为sql里面的日期类型才行;oracle较mysql而言更安全,但是收费的,一般大公司用的多。oracle还有存储过程和函数,触发器这些这是mysql没有的。大体就是这样吧。

<select id="getUserInfo" parameterType="javautilMap" resultMap="userResult">

SELECT TUUSERID, TUUSERNAME, TUPASSWORD, TUGROUPIDEN, TUROLEID

, TUIREALNAME, TUIGENDER, TUIBIRTHDAY, TUIPERSONID, TUIEMAIL, TUIMOBILENUMBER

<if test="#{group == 'MANAGER'} || #{group == 'COMPANY'}">

, TUSJOBNUMBER, TUSCOMPANYID FROM TAB_USER TU,

TAB_USER_INFO TUI, TAB_USER_STAFF TUS

</if>

<if test="#{group == 'CONSUMER'}">

, TUCADDRESS, TUCAREAID FROM TAB_USER TU,

TAB_USER_INFO TUI, TAB_USER_CONSUMER TUC

</if>

WHERE

<if test="#{group == 'MANAGER'} || #{group == 'COMPANY'}">

TUUSERID = TUIUSERID AND TUUSERID = TUSUSERID AND TUIUSERID = TUSUSERID AND TUUSERNAME = #{userName}

</if>

<if test="#{group == 'CONSUMER'}">

TUUSERID = TUIUSERID AND TUUSERID = TUCUSERID AND TUIUSERID = TUCUSERID AND TUUSERNAME = #{userName}

</if>

</select>

这样试试呢?

这些字段应该在一张表中定义。

然后编写一个对应表的业务bean。在mapperjava开发对应的接口传入对应的参数,然后在mapperxml创建该接口方法的select标签,设置好返回类型和Sql语句。

最后跑项目

mybatis的sql和你在数据库客户端执行的sql是一样的,但是在mybatis中调用的sql一般都是动态的,所以用到了参数传递。这个mybatis有对应的标签以及相应的变量来实现。你可以搜索下mybatis标签。同时给你一个参考的你看看,这个是一个查询用户的

<select id="queryUsers" parameterType="map" resultType="xxxxxxbeanUserBean">

<![CDATA[

select

ID,

LOGIN_NAME AS loginName,

PASSWORD,

REAL_NAME AS realName,

POSITION,

(SELECT DPOSITION_NAME FROM UNIT_POSITION D WHERE DPOSITION_CODE=TPOSITION) POSITIONNAME,

USER_TYPE AS userType,

SEX,

PID,

TO_CHAR(TBIRTHDAY,'YYYY-MM-DD') BIRTHDAY,

EMAIL,

CONTACT_TEL AS contactTel,

CONTACT_MOBILE AS contactMobile,

CONTACT_FAX AS contactFax,

CONTACT_ZIP AS contactZip,

CONTACT_ADDR AS contactAddr,

STATUS,

EDUCATION,

(SELECT DEDUCATION_NAME FROM UNIT_EDUCATION D WHERE DEDUCATION_CODE=TEDUCATION AND DSTATUS=0) EDUCATIONNAME,

NATION,

POLITICAL,

REMARK,

TO_CHAR(TCREATE_DATE,'YYYY-MM-DD HH24:MI:SS') createDate,

(SELECT DREAL_NAME FROM UNIT_USER D WHERE DID= TCREATE_USER_ID) createUserId,

TO_CHAR(TUPDATE_DATE,'YYYY-MM-DD HH24:MI:SS') updateDate,

(SELECT DREAL_NAME FROM UNIT_USER D WHERE DID= TUPDATE_USER_ID) updateUserId

from UNIT_USER T

]]>

<where>

TSTATUS='1'

<if test="realName !=null and realName !=''">

and TREAL_NAME like '%${realName}%'

</if>

<if test="nexusDpartment !=null">

AND TID IN (SELECT DISTINCT DUSER_ID FROM UNIT_USER_DEPT D WHERE DDEPT_CODE IN (${nexusDpartment}))

</if>

<if test="deptCode !=null and deptCode !=''">

AND TID IN (SELECT DISTINCT DUSER_ID FROM UNIT_USER_DEPT D WHERE DDEPT_CODE = #{deptCode})

</if>

</where>

<if test="sort != null and sort != ''">

order by ${sort}

<if test="direction != null and direction != ''">

${direction}

</if>

</if>

</select>

以上就是关于mybatis执行SQL查不到数据,在数据库执行可以查到全部的内容,包括:mybatis执行SQL查不到数据,在数据库执行可以查到、如何MyBatis中使用动态SQL查询与注释、在mybatis中的动态sql在mysql数据库和orecal数据库的有什么区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9786730.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存