浅谈MyBatis(二)
我们已经知道MyBatis时一个持久层的框架,接下来我们就通过代码测试MyBatise关于CRUD的操作
MyBatis-CRUD操作
C:create添加数据
R:read读取数据
U:update修改数据
D:delete删除数据
其中查询数据的操作时比较复杂的,我们最后在进行说明
插入数据-insert
编辑pojo类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class User {
private String name;
private Integer id;
private String gender;
private Integer age;
}
使用的注解在上篇博客中已经说明,我们直接用即可.
编辑mapper类
@Mapper
public interface UserMapper {
void insertUser(User user);
}
编辑测试类
@SpringBootTest
public class TestMyBatis {
@Autowired
private UserMapper userMapper;
@Test
public void testInsert(){
User user = new User();
user.setId(13).setName("老乔").setAge(18).setGender("男");
userMapper.insertUser(user);
System.out.println("插入成功!!!");
}
}
编辑映射文件
<mapper namespace="com.qty.mapper.UserMapper">
<insert id="insertUser">
insert into demo_user(id,name,age,gender) value(null,#{name},#{age},#{gender})
</insert>
</mapper>
id字段设置的是主键自增所以使用null.
关于取值操作
取值方式有两种:
1.#{属性}
2.${属性}
两者的区别:
1.前者使用占位符"?",这样更加安全,防止了sql注入攻击
2.使用场景:后者在以字段为参数时使用
3.前者会自动添加一对 " "
4.能使用前者就使用前者
查看结果
在看一下数据库中是否有这条数据
数据入库成功!!!
更新数据-update
编辑mapper类
@Mapper
public interface UserMapper {
void insertUser(User user);
void updateUser(User user);
}
编辑测试类
@Test
public void testUpdate(){
User user = new User();
user.setId(13).setName("老老乔").setAge(30);
userMapper.updateUser(user);
System.out.println("更新成功!!!");
}
编辑映射文件
<update id="updateUser">
update demo_user set name=#{name},age=#{age} where id=#{id}
</update>
查看结果
查看数据库
更新成功!!!
删除数据-delete
编辑mapper类
@Mapper
public interface UserMapper {
void insertUser(User user);
void updateUser(User user);
void deleteUser(String name);
}
编辑测试类
// 删除name=老老乔的数据
@Test
public void testDelete(){
String name = "老老乔";
userMapper.deleteUser(name);
System.out.println("删除成功!!!");
}
编辑映射文件
<delete id="deleteUser">
delete from demo_user where name=#{name}
</delete>
查看结果
查看数据库
删除成功!!!
查询数据-select
1.根据id查询
编辑mapper类
@Mapper
public interface UserMapper {
void insertUser(User user);
void updateUser(User user);
void deleteUser(String name);
User selectUser(int id);
}
编辑测试类
// 查询id=7的数据
@Test
public void testFindById(){
int id = 7;
User user = userMapper.selectUser(id);
System.out.println(user);
}
编辑映射文件
<select id="selectUser" resultType="User">
select * from demo_user where id=#{id}
</select>
查看结果
查询成功!!!
2.根据多条件查询
编辑mapper类
@Mapper
public interface UserMapper {
void insertUser(User user);
void updateUser(User user);
void deleteUser(String name);
User selectUser(int id);
List<User> selectUserByAge(Map map);
}
编辑测试类
// 查询 age>17 并且 age<20的数据
@Test
public void testFindByAge(){
Map map = new HashMap<>();
map.put("minAge",17);
map.put("maxAge",20);
List<User> list = userMapper.selectUserByAge(map);
System.out.println(list);
}
编辑映射文件
错误写法
<select id="selectUserByAge" resultType="User">
select * from demo_user where age>#{minAge} and age<#{maxAge}
</select>
这样写的问题是:"age<#{maxAge}“中的”<"号会被认为是标签的左闭符号,这里我们需要通过转义字符解决问题
xml中的转义字符
正确写法
<select id="selectUserByAge" resultType="User">
select * from demo_user where age>#{minAge} and age < #{maxAge}
</select>
万能写法
万能转义标签:<![CDATA[语句]]
<select id="selectUserByAge" resultType="User">
<![CDATA[
select * from demo_user where age>#{minAge} and age<#{maxAge}
]]>
以上两种写法都正确.
查看结果
查询成功!!!
3.@Param注解的使用
编辑mapper类
@Mapper
public interface UserMapper {
List<User> selectUserByMId(@Param("minId") int minId, @Param("maxId") int maxId);
}
@Param:将参数作为map,@Param(“minId”)是map的key
编辑测试类
// 查询 id>5 并且id<10的数据
@Test
public void testFindByMId(){
int minId = 5;
int maxId = 10;
List<User> list = userMapper.selectUserByMId(minId,maxId);
System.out.println(list);
}
编辑映射文件
<select id="selectUserByMId" resultType="User">
select * from demo_user where id>#{minId} and id < #{maxId}
</select>
查看结果
查询成功!!!
4.模糊查询
编辑mapper类
@Mapper
public interface UserMapper {
List<User> selectUserByMId(@Param("minId") int minId, @Param("maxId") int maxId);
List<User> selectUserByLike(String name);
}
编辑测试类
// 查询name中包含"备"的数据
@Test
public void testFindByLike(){
String name = "备";
List<User> list = userMapper.selectUserByLike(name);
System.out.println(list);
}
编辑映射文件
<select id="selectUserByLike" resultType="User">
select * from demo_user where name like "%"#{name}"%"
</select>
查看结果
查询成功!!!
关于MyBatis操作array/list/map
批量操作在应用场景中很常见,我们通过操作"集合"来进行批量操作
1.array数组
编辑mapper类
@Mapper
public interface UserMapper {
List<User> selectUserByMId(@Param("minId") int minId, @Param("maxId") int maxId);
List<User> selectUserByLike(String name);
List<User> selectUserByArray(Integer[] ids);
}
编辑测试类
// 查询id为:1,2,5,7的数据
// sql:select * from demo_user where id in(1,2,5,7)
@Test
public void testFindByArray(){
Integer[] ids = {1,2,5,7};
List<User> list = userMapper.selectUserByArray(ids);
System.out.println(list);
}
因为一次性查询多个id,所以将id存入数组当中
编辑映射文件
<select id="selectUserByArray" resultType="User">
select * from demo_user where id in
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
原sql语句:select * from demo_user where id in(1,2,5,7)
因为是多条数据,我们需要通过foreach标签遍历数组
foreach属性的含义:
collection: 需要遍历的数据类型,数组–array/List–list/Map–map中的key
item:相当于是变量
open/close:开始/结束标签
separator:数据之间用逗号分隔
查看结果
查询成功!!!
2.List操作
编辑mapper类
@Mapper
public interface UserMapper {
List<User> selectUserByMId(@Param("minId") int minId, @Param("maxId") int maxId);
List<User> selectUserByLike(String name);
List<User> selectUserByArray(Integer[] ids);
List<User> selectUserByList(List<Integer> asList);
}
编辑测试类
@Test
public void testFindList(){
Integer[] ids = {1,2,5,7};
List<Integer> asList = Arrays.asList(ids);
List<User> list = userMapper.selectUserByList(asList);
System.out.println(list);
}
编辑映射文件
<select id="selectUserByList" resultType="User">
select * from demo_user where id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
道理和数组一样,查询结果
3.Map操作
编辑mapper类
@Mapper
public interface UserMapper {
List<User> selectUserByMId(@Param("minId") int minId, @Param("maxId") int maxId);
List<User> selectUserByLike(String name);
List<User> selectUserByArray(Integer[] ids);
List<User> selectUserByList(List<Integer> asList);
}
编辑测试类
@Test
public void testFindMap(){
Integer[] ids = {1,2,5,7};
Map map = new HashMap();
map.put("ids",ids);
List<User> list = userMapper.selectUserByMap(map);
System.out.println(list);
}
编辑映射文件
<select id="selectUserByMap" resultType="User">
select * from demo_user where id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
;
}
编辑测试类
~~~java
@Test
public void testFindMap(){
Integer[] ids = {1,2,5,7};
Map map = new HashMap();
map.put("ids",ids);
List<User> list = userMapper.selectUserByMap(map);
System.out.println(list);
}
编辑映射文件
<select id="selectUserByMap" resultType="User">
select * from demo_user where id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>