mybatis中SQL语句的三表联查

原问题:mybatis中SQL语句的三表联查
分类:编程开发 > 最后更新时间:【2017-07-05 14:25:50】
问题补充:

indent表:外键是rob_id 对应user表的主键:id

user表: 外键是:company_id 对应company表的主键:id

要求:查找company表中的name字段。

求SQL语句。

补充:代码简单明了点。。。最好是selectfromwhere这样分行。。。我这个萌新也能看的轻松点。。谢谢

最佳答案

mybatis+mysql运行问题,一直提示Column 'id' not found.

mybatis自增主键配置:mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是OracleSequece和Mysql自增主键。主要说明下在mybatis中对于自增主键的配置。1、不返回自增主键值:如果考虑到插入数据的主键不作为其他表插入数据的外键使用,可以考虑这种方式。OracleSequence配置TEST_USERSEQ_TEST_USER_ID.nextval insert into (ID,NAME,AGE) values ( ,#{name}, #{age} ) 当插入语句如上配置时,那么针对如下语句 User user = new User(); user.setName("test"); user.setAge(24); userMapper.insert(user); System.out.println(user.id); // user.id 为空user.id为空,也就是说如上的配置并不能在完成插入操作后将插入时的主键值存放到保存的对象中。2、Mysql自增主键配置由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。TEST_USER insert into (NAME,AGE) values (#{name}, #{age} )同样,针对Mysql如此配置mybaits,插入完成后user.id为空。插入后获取自增主键值:上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的来单独配置针对自增逐渐的处理。1、OracleSequence配置:TEST_USER SEQ_TEST_USER_ID.nextval select from dual insert into (ID,NAME,AGE) values ( #{id}, #{name}, #{age} ) 当使用了后,在实际的插入操作时,mybatis会执行以下两句SQL:select SEQ_TEST_USER_ID.nextval from dual; // 语句1 insert into (ID,NAME,AGE) values ( ?, ?, ? ); // 语句2在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后User user = new User(); user.setName("test"); user.setAge(24); userMapper.insert(user); System.out.println(user.id); // user.id 不为空user.id是有值的。2、Mysql自增主键配置针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,TEST_USER insert into ( NAME, AGE ) values ( #{name}, #{age} ) 当然,由于Mysql的自增主键可以通过SQL语句select LAST_INSERT_ID();来获取的。因此针对Mysql,Mybatis也可配置如下:TEST_USER SELECT LAST_INSERT_ID() insert into (ID,NAME,AGE) values ( #{id}, #{name}, #{age} ) 只不过该中配置需要额外的一条查询SQL小结当数据插入操作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销.当执行插入操作后需要立即获取插入的自增主键值,比如一次操作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.

mybatis中sql语句里面的$和#的区别

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 

 2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id. 

 3. #方式能够很大程度防止sql注入。 

 4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名. 

 6.一般能用#的就别用$.MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

字符串替

换默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:

ORDER BY ${columnName}这里MyBatis不会修改或转义字符串。重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

求三表联合查询的SQL查询语句

table1中id,name,table2_id;table2中id,name;table3中id,name,table2_id;三表是互相关联的,要查所有字段并且排序请问这个语句怎么写?

比如有三张表,student,teacher , project :

    第一种方法:select * from student,teacher,project wherestudent.id=teacher.sid andstudent.id=project.sid;

    第二种:select * from student inner join teacher onstudent.id=teacher.sid inner join project onstudent.id=project.sid;

select a.id,a.name,b.name,c.name,a.table2_id,a.table3_id,c.table2_idfrom table1 a,table2 b,table3 cwhere a.table2_id=b.id and a.table3_id=c.id and b.id=c.table2_idorder by a.id;以上语句在Oracle11g r2上测试通过,同样可以用于其他数据库,如有疑问请留言

select * from table1 A, table2 B, table3 CWHEREA.table2_id=B.idand A.table3_id=C.idORDER BY id ,name ;如果不通过请留言!

select a.id,a.name,b.id,b.name,c.id,c.name from a,b,cwhere a.b_id=b.id and a.c_id = c.id and b.id=c.b_id

多表联结查询—三表联结SELECTS.SName AS 姓名, CS.CourseName AS 课程, C.Score AS 成绩FROM Students AS SINNER JOIN Score AS C ON (S.SCode = C.StudentID)INNER JOIN Course AS CS ON (CS.CourseID = C.CourseID

mybatis怎么实现根据id 显示两个表的内容连接

希望给个小例子

可以通过关系映射查询出来 请看下面在mybatis中,没有级联的概念,但是可以利用集合来实现类似的功能。mybatis3.0添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作。因此在进行实体类多对多映射表设计时,需要专门建立一个关联对象类对相关实体类的关联关系进行描述。插入关联表:<insert id="insertWife" useGeneratedKeys="true" keyProperty="wid" parameterType="com.cssl.pojo.Wife"> insert into wife (name,h_id) values (#{name},#{husband.hid})</insert>关联映射:嵌入式、继承式 引入式等先在数据库建立好主外键关系在xml里面写一个resultMap作为返回类型,如果是多对一 用association 一对多用collection 例子<!-- 多对一 --><resultMap id="wifeandhusband" type="wife"> <id property="wid" column="wid"></id> <result property="wname" column="wname"></result> <association property="husband" column="w_hid" javaType="com.cssl.pojo.Husband"> <id property="hid" column="hid"></id> <result property="name" column="name"></result> </association></resultMap><!-- 一对多 --><resultMap id="husbandandwife" type="com.cssl.pojo.Husband"> <id property="hid" column="hid"></id> <result property="name" column="name"></result> <collection property="wifes" ofType="wife"> --ofType集合中的类型 <id property="wid" column="wid"></id> <result property="wname" column="wname"></result> </collection></resultMap><select id="selectWife" resultMap="wifeandhusband"> select w.*,h.* from wife w left join husband h on w.h_id=h.hid</select>

注意:

1、关联查询一定要带有关联对象的id(主外键),否则集合只会有一条记录存在(认为你查询的是一个对象)如:select h.name,h.age,w.wname from wife w left join husband h on h.hid=w.h_id

2、表连接中不同表有同名字段的时候:a和b都有name字段<resultMap type="b" id="b"> <id property="bid" column="id"/> <result property="name" column="name"/> <association property="a" javaType="a"> <id property="aid" column="aid"/> <result property="name" column="aname"/> </association> </resultMap> <select id="select" resultMap="b"> select a.id aid,a.name aname,b.id,b.name from a,b where a.id=b.id </select>

最佳答案由网友  渝圣  提供
公告: 为响应国家净网行动,部分内容已经删除,感谢网友理解。
3

分享到:

其他回答

暂无其它回答!

    推荐