基于MAVEN创建MyBatis项目的方法参考:MyBatis初识+创建项目
CRUD操作
crud是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。crud主要被用在描述软件系统中数据库或者持久层的基本操作功能。
CRUD
注意几点:🔻
- SQL语句返回值类型。【完整的类名或者别名】
- 传入SQL语句的参数类型 。【万能的Map,可以多尝试使用】
- 命名空间中唯一的标识符
- 接口中的方法名与映射文件中的SQL语句ID 一一对应
- id 就是对应namespace中的方法名
- parameterType 参数类型
- resultType sql语句执行的返回值类型
- 增删改都需要提交事务
Select
信息全查
在映射器接口中添加对应的方法:
public List<Student> GetAll();
在xml映射器中绑定该方法,添加sql语句:
<select id="GetAll" resultType="Student">
select * from student
</select>
测试:
@Test
public void GetAll(){
SqlSession sqlSession = MyBatisUtils.GetSqlSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> list = studentMapper.GetAll();
for (Student student : list){
System.out.println(student);
}
sqlSession.close();
}
根据ID查学生
在映射器接口中添加对应的方法:
public Student GetId(int id);
在xml映射器中绑定该方法,添加sql语句:
<select id="GetId" resultType="Student" parameterType="int">
select * from student where stu_id= #{stu_id}
</select>
测试:
@Test
public void GetId(){
SqlSession sqlSession = MyBatisUtils.GetSqlSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
Student student = studentMapper.GetId(9);
System.out.println(student);
sqlSession.close();
}
根据Name模糊查询
在映射器接口中添加对应的方法:
public List<Student> GetName(String stu_username);
在xml映射器中绑定该方法,添加sql语句:
<select id="GetName" resultType="Student">
select * from student where stu_username like #{stu_username}
</select>
测试:
@Test
public void GetName(){
SqlSession sqlSession = MyBatisUtils.GetSqlSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> list = studentMapper.GetName("%阿亚%");
for (Student student : list){
System.out.println(student);
}
sqlSession.close();
}
⚠️:如果在sql语句中拼接通配符,会引起sql注入!
根据Name和Password查询(@Param方法)
在接口中定义方法时就传递参数:
- 在接口方法的参数前添加@Param属性
- SQL语句编写时,直接去@Param中设置的值,且不需要在设置参数类型
public Student getIdName(@Param("id") int id,@Param("name") String name);
<select id="getIdName" resultType="com.eneity.Student">
select * from Student where id=#{id} and name=#{name}
</select>
根据Name和Password查询(Map方法)
在映射器接口中添加对应的方法,参数直接传递Map:
public List<Student> GetNamePass(Map<String,Object> map);
在xml映射器中绑定该方法,添加sql语句,参数类型为map:
<select id="GetNamePass" resultType="Student" parameterType="map">
select * from student where stu_username= #{stu_username} and stu_password = #{stu_password}
</select>
测试,在使用方法的时候,Map的 key 为 sql中取的值即可,没有顺序要求!:
@Test
public void GetNamePass(){
SqlSession sqlSession = MyBatisUtils.GetSqlSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("stu_username","张三");
map.put("stu_password","123");
List<Student> list = studentMapper.GetNamePass(map);
for (Student student : list){
System.out.println(student);
}
sqlSession.close();
}
Map传递参数,直接在sql中取出key即可![ parameterType=“map”]
对象传递参数,直接在sql中取出对象即可![ parameterType=“Object”]
⚠️: 只有一个基本类型参数的情况下,可以直接在sql中取到!
🌈: 如果参数过多,我们可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可
Insert
插入学生
在映射器接口中添加对应的方法:
public int Insert(Student student);
在xml映射器中绑定该方法,添加sql语句:
<insert id="Insert" parameterType="Student">
insert into student(stu_username, stu_password) values (#{stu_username},#{stu_password})
</insert>
测试:
@Test
public void Insert(){
SqlSession sqlSession = MyBatisUtils.GetSqlSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
Student student = new Student("张三","123");
int i = studentMapper.Insert(student);
System.out.println(i);
sqlSession.commit();
sqlSession.close();
}
Update
修改学生信息
在映射器接口中添加对应的方法:
public int Update(Student student);
在xml映射器中绑定该方法,添加sql语句:
<update id="Update" parameterType="Student">
update student set stu_username = #{stu_username} , stu_password = #{stu_password} where stu_id = #{stu_id}
</update>
测试:
@Test
public void Update(){
SqlSession sqlSession = MyBatisUtils.GetSqlSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
Student student = new Student("39","李四","321");
int i = studentMapper.Update(student);
System.out.println(i);
sqlSession.commit();
sqlSession.close();
}
Delete
根据ID删除学生
在映射器接口中添加对应的方法:
public int Delete(int id);
在xml映射器中绑定该方法,添加sql语句:
<delete id="Delete" parameterType="int">
delete from student where stu_id = #{stu_id}
</delete>
测试:
@Test
public void Delete(){
SqlSession sqlSession = MyBatisUtils.GetSqlSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
int i = studentMapper.Delete(9);
System.out.println(1);
sqlSession.commit();
sqlSession.close();
}
写在最后
需要注意几点:
- 所有的增删改操作都需要提交事务!
- 接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!
- 有时候根据业务的需求,可以考虑使用map传递参数!
- 为了规范操作,在SQL的配置文件中,我们尽量将Parameter参数和resultType都写上!
常见错误:
- 标签不能匹配错
- resource绑定mapper,需要使用路径
- 程序配置文件必须符合规范
- NullPointerException,没有注册到资源
- 输出的xml文件中存在中文乱码问题
- maven资源没有导出问题