5. CRUD
2022年8月30日
5. CRUD
xml 文件中相关参数说明:
id: 对应的namespace接口中的方法名
resultType: 方法返回值类型
parameterType:方法参数的数据类型
parameterType 它的值是 java 的数据类型全限定名称或者是 mybatis 定义的别名 例如:
parameterType="java.lang.Integer"
,parameterType="int"
提示
parameterType 不是强制的, mybatis 通过反射机制能够发现接口参数的数类型。 所以可以没有, 一般我们也不写。
#{}
:
使用#{}
之后, mybatis 执行 sql 是使用的 jdbc 中的 PreparedStatement 对象由 mybatis 执行下面的代码:
mybatis 创建 Connection, PreparedStatement 对象
String sql="select id,name, email,age from student where id=?"; PreparedStatement pst = conn.preparedStatement(sql); pst.setInt(1,1001);
执行 sql 封装为 resultType="com.bjpowernode.domain.Student"这个对象
ResultSet rs = ps.executeQuery(); Student student = null; while(rs.next()){ //从数据库取表的一行数据, 存到一个java对象属性中 student = new Student(); student.setId(rs.getInt("id)); student.setName(rs.getString("name")); student.setEmail(rs.getString("email")); student.setAge(rs.getInt("age")); } return student; //给了dao方法调用的返回值
提示
增删改需要提交事务!
session.commit();
实体类 bean:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
// 定义属性, 目前要求是属性名和列名一样。
private int id;
private String name;
private String pwd;
public User(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
}
dao 接口:
public interface UserDao {
/**
* 全部用户
*
* @return user集合
*/
List<User> getUserList();
/**
* 根据id查询用户
*
* @param id 用户id
* @return 单个用户
*/
User getUserById(int id);
/**
* @param user 将对象作为参数
* @return 成功返回插入的数据行数, 失败返回-1
*/
int addUser(User user);
/**
* @param user 将对象作为参数
* @return 成功返回受影响的行, 失败返回-1
*/
int updateUser(User user);
/**
* @param id 根据id删除
* @return 成功返回受影响的行, 失败返回-1
*/
int deleteUser(int id);
}
1. select
<!--select查询语句-->
<select id="getUserList" resultType="com.mybatis.pojo.User">
select *
from mybatis.user;
</select>
<select id="getUserById" parameterType="int" resultType="com.mybatis.pojo.User">
select *
from mybatis.user
where id = #{id};
</select>
测试:
@Test
public void test() {
List<User> userList = mapper.getUserList();
System.out.println(userList);
User userById = mapper.getUserById(1);
System.out.println(userById);
}
2. insert
<!--insert-->
<insert id="addUser" parameterType="com.mybatis.pojo.User">
insert into mybatis.user(name, pwd)
values (#{name}, #{pwd});
</insert>
测试:
@Test
public void insertUser() {
mapper.addUser(new User("小明", "666"));
session.commit();
}
3. update
<!--update-->
<update id="updateUser" parameterType="com.mybatis.pojo.User">
update mybatis.user
set name = #{name},
pwd = #{pwd}
where id = #{id};
</update>
测试:
@Test
public void updateUser() {
mapper.updateUser(new User(8, "小红", "777"));
session.commit();
}
4. delete
<delete id="deleteUser" parameterType="int">
delete
from mybatis.user
where id = #{id};
</delete>
测试:
@Test
public void deleteUser() {
mapper.deleteUser(8);
session.commit();
}
5. map 传参
接口方法:
/**
* map插入
*
* @param map map
* @return int
*/
int addUser2(Map<String, Object> map);
sql:
<insert id="addUser2" parameterType="map">
insert into user(name, pwd)
values (#{username}, #{password});
</insert>
测试:
@Test
public void addUser2() {
// map插入
Map<String, Object> map = new HashMap<>();
map.put("username", "麻子");
map.put("password", "1111");
int imap = mapper.addUser2(map);
System.out.println(imap);
session.commit();
}
map 传参直接在 sql 中取出 key 即可parameterType="map"
对象传参直接在对象中取出对象属性即可parameterType="Object"
只有一个基本类型参数的情况下,可以直接在 sql 中取到
多个参数用 map 或注解
6. 模糊查询
使用 like
和传递通配符 %%
<!--模糊查询-->
<select id="getUserList2" parameterType="map" resultType="com.demo.bean.User">
select *
from user
where name like concat('%', #{nameValue} '%');
</select>
其他方式:
在参数传递时加通配符(麻烦)
map.put("nameValue", "%user%");
不使用 concat()函数拼接字符串
<select id="getUserList" parameterType="int" resultType="com.demo.bean.User"> select * from mybatis.user where name like '%' #{name} '%'; </select>
%
使用双引号会爆红,但是能正常运行把#换成$(存在 SQL 注入问题)
<select id="getUserList" resultType="com.demo.bean.User"> select * from mybatis.user where name like "%" ${name} "%"; </select>