当前位置:首页 » 编程语言 » mybatisxmlsql语句
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

mybatisxmlsql语句

发布时间: 2023-03-26 15:27:19

① 使用mybatis需要写sql语句吗

需要写sql语句的御昌,简单的单表操作可以镇数扒使用mybatis提供的现成方法,复杂的方法必须在xml文件中毕穗写sql语句来完成。

② mybatis中xml映射和方法注解两种配置sql语句的方式是否可以同时存在

不能进行同时设置。执行会找不到接口的mapper代理工厂。mybatis会先解析xml文件,将解析后的sql封装在mapperstament中并放进Configuration的mappedStatements中,将命名空间和方法名(也就是id)作为key,mappedStatements是个自定义map。然后生成接口的代理工程,生产代理工厂后会解析注解,解析完注解,也会生成mapperstament,也会往统一的Configuration大对象里面放,但是放的时候自定义map会先判断是否存在,此时已经存在了,存在就会抛出IllegalArgumentException(name + " already contains value for " + key)。但是创建代理工厂的时候把异常吃掉了,所以加载的时候不会报错,但是不会给接口生成代理工厂。没有代理工厂,接口就没有实现类去操作。

③ 如何解析Mybatis xml文件中配置的sql

首先抽象一个SQL语句类:

[java] view plain
public abstract class AbstractSQLStatementNode implements ISQLStatement {

protected List<ISQLStatement> sqlStatements = new ArrayList<>();

@Override
public void appendSQL(ISQLStatement sql) {
sqlStatements.add(sql);
}

@Override
public String getSQL(Object object) {
StringBuilder sb = new StringBuilder();
for (ISQLStatement stmt : sqlStatements) {
sb.append(stmt.getSQL(object));
}
return sb.toString().trim();
}

}

然后是文本SQL:

[java] view plain
public class PlainSQLNode extends AbstractSQLStatementNode {

private final String sql;

public PlainSQLNode(String sql) {
this.sql = sql;
}

@Override
public String getSQL(Object object) {
return sql;
}

@Override
public String toString() {
return sql;
}

}

以Mybatis xml中<if test="...">...</if>为例

[java] view plain
public class IfSQLNode extends AbstractSQLStatementNode {

private final String test;

public IfSQLNode(String test) {
this.test = test;
}

public String getTest() {
return test;
}

@Override
public String getSQL(Object object) {
try {
Boolean b = (Boolean) Ognl.getValue(test, object, Boolean.TYPE);
return b ? super.getSQL(object) : "";
}
catch (OgnlException e) {
throw new SQLSyntaxException(e);
}
}

}

再增加一个Include标签例

[java] view plain
public class IncludeSQLNode extends AbstractSQLStatementNode {

private final TableNode node;
private final String refid;

public IncludeSQLNode(TableNode node, String refid) {
this.node = node;
this.refid = refid;
}

@Override
public String getSQL(Object object) {
SQLNode sqlnode = node.getSQLNode(refid);
return sqlnode.getSQL(object);
}

}

其它的xml标签类似,完成最终的sql

调用AbstractSQLStatementNode.getSQL方法,参数为客户端传入参数

XML例子如下:

[html] view plain
<select id="findPage" parameterType="java.util.Map" resultMap="ORG">
SELECT * FROM XT_ORG WHERE BDELETE<>1 <if test="name != null"> AND NAME=#{name}</if> LIMIT #{OFFSET}, #{ROWS}
</select>

根据是否传入了name,即可成功执行出最终的sql

SELECT * FROM XT_ORG WHERE BDELETE<>1 AND NAME=#{name} LIMIT #{OFFSET}, #{ROWS}

再解析SQL得到,并提出参数

SELECT * FROM XT_ORG WHERE BDELETE<>1 AND NAME=? LIMIT ?,?
即可生成最终的PrepareStatement

④ MyBatis的Mapper.xml怎么同时执行多个sql语句

MyBatis对每个sql在Mapper
Interface里都有一个对应的方法。写一个Service,在Service的方法里调用这两个删除方法就可以了,如果有需要,还可以用事务如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】希望我的回答对您有所帮助,望采纳!

⑤ mybatis中的mapper.xml中 sql语句

是的
如果你的对象字段和数据库字段不对应
你的xml文件上面应该有对象和数据库字段映射的配置resultMap

⑥ Mybatis在xml中标签内写的sql语句是原生的吗,即如果用的是mysql就写mysql语句;

是这样的,取决于你连的是什么数据库比如你连oracle用limit 肯定报错

⑦ mybatis怎么执行sql语句值

例如在一个 XXMapper.xml 中:
?

1
2
3

<select id="executeSql" resultType="map">
${_parameter}
</select>

你可以如下调用:
?

1

sqlSession.selectList("executeSql", "select * from sysuser where enabled = 1");

或者你可以在 XXMapper.java 接口中定义如下方法:
?

1

List<Map> executeSql(String sql);

然后使用接口调用方法:
?

1

xxMapper.executeSql("select * from sysuser where enabled = 1");

上面这些内容可能都会,下面在此基础上再复杂一点。
假如像上面SQL中的enabled = 1我想使用参数方式传值,也就是写成 enabled = #{enabled},如果你没有遇到过类似这种需求,可能不明白为什么要这么写,举个例子,要实现一种动态查询,可以在前台通过配置 SQL,提供一些查询条件就能实现一个查询的功能(为了安全,这些配置肯定是开发或者实施做的,不可能让用户直接操作数据库)。
针对这个功能,使用 MyBatis 实现起来相当容易。配置 SQL 肯定要执行,用上面讲的这种方式肯定可以执行 SQL,如何提供参数呢?参数就是enabled = #{enabled}中的#{enabled}部分。如果再多一些条件,一个配置好的 SQL 如下:
?

1
2
3

select * from sysuser
where enabled = #{enabled}
and userName like concat('%',#{userName},'%')

这种情况下,该怎么用 MyBatis 实现呢?
首先 XML 中修改如下:
?

1
2
3

<select id="executeSql" resultType="map">
${sql}
</select>

接口中的方法修改为:
?

1

List<Map> executeSql(Map map);

然后调用方法:
?

1
2
3
4
5
6
7
8
9
10
11
12
13

Map map = new HashMap();
//这里的 sql 对应 XML 中的 ${sql}
map.put("sql", "select * from sysuser "
+ " where enabled = #{enabled} "
+ " and userName like concat('%',#{userName},'%')");
//#{enabled}
map.put("enabled", 1);
//#{userName}
map.put("userName", "admin");
//接口方式调用
List<Map> list = xxMapper.executeSql(map);
//sqlSession方式调用

⑧ mybatis里的xml中的写添加的sql语句,怎么使用oracle数据库的序列

--OracleSEQUENCE序列语法:
CREATESEQUENCE序列名
[INCREMENTBYn]
[STARTWITHn]
[{MAXVALUE/MINVALUEn|NOMAXVALUE}]
[{CYCLE|NOCYCLE}]
[{CACHEn|NOCACHE}];
示例:
CREATESEQUENCEsq_test--序列名
INCREMENTBY1--每次加几个
STARTWITH1--从1开始计数
MAXVALUE9999999--最大值9999999丛扰老
NOCYCLE--一直累加,不循环
NOCACHE;

SELECT李信sq_test.NEXTVALFROMDUAL;

可以使用sequence的地方:

--不渗升包含子查询、snapshot、VIEW的SELECT语句
--INSERT语句的子查询中
--NSERT语句的VALUES中
--UPDATE的SET中

可以看如下例子:

INSERTINTOtable_nameVALUES(sq_test.nextval,'CLERK',1200,SYSDATE);

⑨ MyBatis的Mapper.xml怎么同时执行多个sql语句

MyBatis对每个sql在Mapper Interface里都有一个对应首喊链的方法。
写一个Service,在Service的方法里调用这两个删除方法就可以了,如果有需要者孙渗山,还可以用事务

⑩ mybatis中字段名与实体属性名不一样的情况下插入数据的方法,在xml配置文件里sql语句应该怎么写

查询语句是 MyBatis 中最常用的元素之一,本文涉及mybatis的单表查询操作,关联表有关的查询会后续补充。

巧妇难为无米之炊,要想从数据库中表中取出数据并转化为javaBean,所以,我们要先准备javabean以及与其对应的数据表。

javaBean:

public class President {

private int id;
private String name;

@Override
public String toString() {
return "President [id=" + id + ", name=" + name + "]";
}
//get set 方法.....
}
创建两个对应的数据库表,并插入两条数据:

create table president1(
p_id int not null auto_increment primary key,
p_name varchar(50) not null
);

insert into president1(p_name) values('lily'),('Tom');

create table president2(
id int not null auto_increment primary key,
name varchar(50) not null
);
insert into president2(name) values('lily'),('Tom');
创建两个数据库是为了测试两个不同的查询状况,
数据库字段名与实体类属性名相同

从sql表可以看出president2的字段名与javabean:President的属性名完全相同,这种情况下mybatis的select操作非常简单:

<!-- 从表 president2中查询-->
<select id="getPreByIdPresident2" parameterType="int" resultType="President">
select * from president2 where id=#{id}
</select>

此时mybatis运用反射机制会将查询返回的结果(id,name)封装成President对象。

如果从表president1中查询,同样采用上面的sql语句

<!-- 从表 president1中查询-->
<select id="getPreByIdPresident1" parameterType="int" resultType="President">
<span style="white-space:pre"> </span>President p1 = session.selectOne(statement+"getPreByIdPresident1", 1);
<span style="white-space:pre"> </span>System.out.println("表president1中查询"+p1);
</select>

此时如果用getPreByIdPresident1进行查询,返回的结果会是null,我们将上面的sql语句在mysql中执行下:

有结果返回,但是返回的字段名为(p_id,p_name)这种结果mybatis在解析时无法与President类对应。多数情况下实体类属性名与数据库表的字段名都会有差异,这种情况如果mybatis不能处理也就太low了。

数据库字段名与实体类属性名不相同
mybatis针对该种情况有两种解决方法,但是归根到底都是同一种实现。

Method1:定义一个ResultMap将数据库字段名与实体类属性名做个映射

我们欲从表president1中查询数据,此时的mapper配置如下:

<resultMap type="President" id="getFromPresident2">
<!-- 主键必须用id标签映射,其他的用非集合用result映射 集合类用collection映射 -->
<!-- column为数据库字段名,property为实体类属性名 -->
<id column="p_id" property="id" />
<result column="p_name" property="name" />
</resultMap>
<select id="getPreByIdPresident1Method1" resultMap="getFromPresident2">
select * from president1 where p_id=#{id}
</select>

首先定义了一个resultMap,将数据库表的字段名与实体类属性名做了一一对应,其中type为实体类(此处运用的类别名),id为了在select标签中引用映射结果。

在select标签中并没有用resultType属性,而使用了resultMap,即为上面定义的resultMap,mybatis会根据resultMap中的映射关系去构造President

Method1:直接在sql语句中使用别名

<!-- 从表 president1中查询 -->
<select id="getPreByIdPresident1Method2" resultType="President">
select p_id id,p_name name from president1 where p_id=#{id}
</select>

这种方法会查到实际的数据,这种方法与字段名和属性名相同都是基于相同的原理:MyBatis 会在幕后自动创建一个 ResultMap,基于属性名来映射列到JavaBean 的属性上。即mybatis底层都是通过创建ResultMap来进行关系的映射,与method1原理相同。。