mysql三表联查sql语句_mybatis中SQL语句的三表联查

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 where student.id=teacher.sid and student.id=project.sid;

第二种:select * from student inner join teacher on student.id=teacher.sid inner join project on student.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

02d601faba3774dfc015c4c103391cd9.png

mybatis怎么实现根据id 显示两个表的内容连接希望给个小例子

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

注意:

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字段                                                                   select a.id aid,a.name aname,b.id,b.name from a,b where a.id=b.id

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus提供了非常方便的分页查询功能,可以直接使用Page类来进行分页查询。 使用MyBatis-Plus的分页查询,需要进行以下步骤: 1. 引入MyBatis-Plus的依赖:在pom.xml添加以下依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> ``` 2. 定义实体类:定义需要进行分页查询的实体类,并使用注解@TableField进行字段映射。 3. 定义Mapper接口:定义Mapper接口,并继承BaseMapper类,继承BaseMapper类后,MyBatis-Plus会自动提供一些基本的CRUD操作。 ``` public interface UserMapper extends BaseMapper<User> {} ``` 4. 分页查询:在Service层调用分页查询方法,使用Page对象设置分页参数,然后调用selectPage方法进行分页查询。 ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public Page<User> getUserList(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); return userMapper.selectPage(page, null); } } ``` 如果需要自定义sql分页,可以在xml使用MyBatis的分页插件进行分页查询。 1. 引入分页插件:在pom.xml添加以下依赖: ``` <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.10</version> </dependency> ``` 2. 配置分页插件:在MyBatis的配置文件配置分页插件。 ``` <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="dialect" value="mysql"/> </plugin> </plugins> ``` 3. 自定义sql分页查询:在xml使用分页插件的PageHelper.startPage方法进行分页查询。 ``` <select id="getUserList" resultMap="userMap"> select * from user <where> <if test="name != null"> and name like concat('%',#{name},'%') </if> </where> order by id desc </select> ``` ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public PageInfo<User> getUserList(int pageNum, int pageSize, String name) { PageHelper.startPage(pageNum, pageSize); List<User> userList = userMapper.getUserList(name); return new PageInfo<>(userList); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值