MyBatis框架的基本CRUD命令

发布时间 2023-03-31 13:56:39作者: Linqylin

1、局部 SQL 配置文件重要标签说明:

 作用:把sql语句保存在Mybatis的局部配置文件中,给某个数据访问类使用;
 根节点为<mapper>… </mapper>;
 namespace:命名空间,其值为某一个dao层实现类的具体路径,表示这个类要使用相应的SQL语句。这个具体路径不要自己写,可以选中该类,右键,选择“copy Reference”,然后粘贴即可。
 select标签存放查询语句,insert标签存放insert语句,update标签存放update语句, delete标签存放delete语句;
 id:在整个配置文件中id值必须唯一,一般情况下,其值与dao层类中使用该SQL语句的方法名保持一致;
 resultType:指定当前sql查询语句返回的数据类型。类型不是sql语句的最终类型,而是某一条数据的类型,一般用实体类表示,即用该实体类的“全路径”来表示。简化使用时,也可以用MAP数据类型;
 parameterType:指定SQL语句接收的参数类型
 一对mapper里,可以编写多条sql语句。
 
2、不带参数的简单查询:
(1)select语句返回User实体对象:
resultType="cn.java.entity.User" 表示返回多条User实体类,如:
<select id="getAllUser" resultType="cn.java.entity.User">
SELECT * FROM users
</select>
(2) select 语句不使用实体类,直接用 Map 数据类型,返回
List<Map<String,Object>,更加简单,简化程序,如:
<select id="getAllUserMap" resultType="Map">
SELECT * FROM users
</select>
 
3、带参数的简单查询:
(1)带一个参数简单查询:
parameterType:指定SQL语句接收的参数类型
<select id="getUserById" resultType="map" parameterType="Long">
SELECT * FROM users WHERE id=#{0}
</select>
 实现类中的调用方法的代码如下:
Long id = 1L;
Map<String, Object> userMap =
session.selectOne("cn.java.dao.impl.UserDaoImpl.getUserById", id);
(2)带多个参数简单查询:
 用Map封装,parameterType=Map:
<select id="getUserByMulCondition" resultType="map" parameterType="Map">
SELECT * FROM users WHERE username='${username}' AND PASSWORD='${pwd}'
</select>
 实现类中的调用方法的代码如下:
Map<String, Object> paramMap = new HashMap<String, Object>();
// 封装参数
paramMap.put("username", "admin");
paramMap.put("pwd", "123");
// 传递参数
Map<String, Object> userMap =
session.selectOne("cn.java.dao.impl.UserDaoImpl.getUserByMulCondition", paramMap);
 
(4)简单的更新数据:
注意:
 insert,delete,update操作没有resultType属性,默认返回int类型的值;
 不同的更新操作,使用不同的标签;
 parameterType=”Map”,表示参数类型为Map,用Map封装参数;
 为了防止SQL注入攻击,SQL语句中使用#表示参数化SQL语句;
 更新操作一定要提交事务, 执行命令:
session.commit();
(1)插入一条记录时,代码如下:
<insert id="addUser" parameterType="Map">
INSERT INTO users SET username=#{username},PASSWORD=#{password}
</insert>
实现类中的调用方法的代码如下:
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("username", "Rose");
paramMap.put("password", "1234");
int resultInt = session.insert("cn.java.dao.impl.UserDaoImpl.addUser", paramMap);
session.commit(); // 更新操作一定要提交事务
(2)插入多条记录时,使用foreach标签,代码如下:
<insert id="addUserBatch" parameterType="cn.java.entity.User">
insert into users(username,PASSWORD)
values
<foreach collection="list" item="user" separator=",">
(#{user.username},#{user.password})
</foreach>
</insert>
实现类中的调用方法的代码如下:
List<User> list = new ArrayList<>();
User user;
for (int i = 0; i < 10; i++) {
user = new User();
user.setUsername("test" + i);
user.setPassword("666");
list.add(user);
}
int resultInt = session.insert("cn.java.dao.impl.UserDaoImpl.addUserBatch",list);
 
(5)动态查询数据:
注意:
 实现动态查询;
 where 标签:当有查询条件时,就使用 where 命令,当没有查询条件时,就不用
where 命令
 if test:判断是否对某个字段进行查询,为空值就不查询该字段
代码如下:
<select id="getCourseByDynam" resultType="Map" parameterType="Map">
SELECT * FROM course
<where>
<if test="cname!=null">
cname=#{cname}
</if>
<if test="credit!=null">
and credit=#{credit}
</if>
<if test="department!=null">
and department=#{department}
</if>
</where>
</select>
实现类中的调用方法的代码如下:
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("cname", "数据结构");
//paramMap.put("credit", 4);
//paramMap.put("department", "软件工程");
List<Map<String, Object>> courseList =
session.selectList("cn.java.dao.impl.UserDaoImpl.getCourseByDynam",
paramMap);
for (Map<String, Object> map : courseList) {
System.out.println(map);
 
(6)动态更新数据:
注意:
 实现动态更新;
 set标签:当有更新字段时,就使用set命令,当没有更新字段时, 语句为
 UPDATE course SET id=NULL WHERE id=NULL
代码如下:
<update id="updateCourseByDynam" parameterType="Map">
update course
<set>
<if test="cname!=null">
cname=#{cname},
</if>
<if test="credit!=null">
credit=#{credit},
</if>
<if test="department!=null">
department=#{department},
</if>
id=#{id}
</set>
where id=#{id}
</update>
实现类中的调用方法的代码如下:
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("cname", "数据库原理");
paramMap.put("credit", 4);
// paramMap.put("department", "软工 1");
paramMap.put("id", 1);
int resultInt = session.update("cn.java.dao.impl.UserDaoImpl.updateCourseByDynam",
paramMap);