数据准备:
在MySQL数据库中,创建一个名为mybatis的数据库,在此数据库中创建一个teacher表,同时预先插入几条数据。如图所示:
一、利用@Param注解参数实现对teacher表中的数据的查询、删除、修改。
1、创建MyBaitsDemo1项目,使用mapper.xml绑定接口,实现对数据库记录的查询、删除、修改操作。编写程序,完成如下操作:
(1)查询周姓副教授的教师记录;
(2)删除手机号为135开头的讲师的教师记录;
(3)修改TNO:121004教师的手机号为18811597853
1.创建映射文件
在Mapper下创建一个映射文件ParamMapper.xml,在已配置好的mybatis-config.xml文件中添加路径。
注意:namespace的路径要修改成自己的接口
<!DOCTYPE mapper
PUBLIC "-//mybatis.org.//DTD mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="DAO.ParamDao">
<select id="findDao" resultType="pojo.Teacher">
select * from teacher where titles=#{titles} and TNAME like concat(#{tname},"%")
</select>
<delete id="deleteDao">
delete from teacher where phone like concat(#{phone},"%") and titles=#{titles}
</delete>
<update id="updateDao">
update teacher set phone=#{phone} where tno=#{tno}
</update>
</mapper>
在mybatis-config.xml文件下添加映射文件路径
2.创建接口实现动态代理
1.在包DAO创建一个TeacherDAO.java的接口文件,创建以下方法
import org.apache.ibatis.annotations.Param;
import pojo.Teacher;
import java.util.List;
public interface ParamDao {
List<Teacher> findDao(@Param("tname")String tname, @Param("titles")String titles);
void deleteDao(@Param("phone")String phone,@Param("titles")String titles);
void updateDao(@Param("tno")String tno,@Param("phone")String phone);
}
注意:这里传入的参数@Param就是映射文件使用的参数,如果不同会报错
3.测试
使用SqlSession.getMapper()方法完成自动代理,在使用接口动态代理的对数据库的增删改查的时候,mysql是没有立刻做出响应的,所有需要在java代码中调用comit() 方法来提交事物。
import DAO.ParamDao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.Teacher;
import utils.MybatisUtil;
import java.util.List;
public class ParamTest {
@Test
public void selectTest(){
SqlSession session = MybatisUtil.openSession();
ParamDao mapper = session.getMapper(ParamDao.class);
List<Teacher> list = mapper.findDao("周","副教授");
for (Teacher teacher : list) {
System.out.println(teacher);
}
session.close();
}
@Test
public void deleteTest(){
SqlSession session = MybatisUtil.openSession();
ParamDao mapper = session.getMapper(ParamDao.class);
mapper.deleteDao("135","讲师");
session.commit();
session.close();
}
@Test
public void updateTest(){
SqlSession session = MybatisUtil.openSession();
ParamDao mapper = session.getMapper(ParamDao.class);
mapper.updateDao("121004","18811597853");
session.commit();
session.close();
}
}
二、动态SQL实现组合条件查询
(1)使用动态SQL中if+trim元素实现对teacher表中的数据的查询。
创建MyBaitsDemo2项目,使用动态SQL中if+trim元素实现对数据库记录的各种条件组合查询操作。其中:教师姓名采用模糊查询。
- 使用动态SQL中where元素实现对teacher表中的数据的查询
1.创建映射文件
在mybatis-config.xml文件下加入改映射文件的路径
<!DOCTYPE mapper
PUBLIC "-//mybatis.org.//DTD mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="DAO.SQLMapper">
<!-- 查询数据 -->
<select id="selectTrim" parameterType="pojo.Teacher" resultType="pojo.Teacher">
select * from teacher
<trim prefix="where" prefixOverrides="and | or">
<if test="titles != null">
and titles = #{titles}
</if>
<if test="tname != null and tname != ''">
and tname like concat(#{tname},"%")
</if>
</trim>
</select>
<select id="selectWhere" parameterType="pojo.Teacher" resultType="pojo.Teacher">
select * from teacher
<where>
<if test="titles != null">
and titles = #{titles}
</if>
<if test="tname != null and tname != ''">
and tname like concat(#{tname},"%")
</if>
</where>
</select>
</mapper>
2.创建接口
import pojo.Teacher;
import java.util.List;
public interface SQLMapper {
List<Teacher> selectTrim(Teacher t);
List<Teacher> selectWhere(Teacher t);
}
3.测试
import DAO.SQLMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.Teacher;
import utils.MybatisUtil;
import java.util.List;
public class SQLTest {
@Test
public void selectTest(){
SqlSession session = MybatisUtil.openSession();
SQLMapper mapper = session.getMapper(SQLMapper.class);
List<Teacher> listTrim = mapper.selectTrim(new Teacher("", "", "讲师", ""));
for (Teacher teacher : listTrim) {
System.out.println(teacher);
}
System.out.println("-------------------------------------------------");
List<Teacher> listWhere = mapper.selectWhere(new Teacher("", "李", "教授", ""));
for (Teacher teacher : listWhere) {
System.out.println(teacher);
}
session.close();
}
}
数据准备:
在MySQL数据库中,创建一个名为mybatis的数据库,在此数据库中创建一个student表,同时预先插入几条数据。如图所示:
创建数据库表,插入数据
INSERT INTO `student` VALUES (0x323031323135313231, '陈校', '男', 29, 'CS');
INSERT INTO `student` VALUES (0x323031323135313232, '刘晨', '女', 19, 'CS');
INSERT INTO `student` VALUES (0x323031323135313233, '王敏', '女', 18, 'MA');
INSERT INTO `student` VALUES (0x323031323135313234, '张立', '男', 35, 'IS');
INSERT INTO `student` VALUES (0x323031323135313830, '李明', '女', 34, 'CS');
INSERT INTO `student` VALUES (0x323031323135313839, '李青', '女', 20, 'IS');
创建Student实体类,
构造器和属性的get,set方法添加
public class Student {
private String sno;
private String sname;
private String ssex;
private int sage;
private String sdept;
public Student(){}
}
三、动态SQL实现组合条件查询
1)使用动态SQL中choose+when+otherwise元素实现对student表中的数据的查询。
使用动态SQL中choose+when+otherwise元素实现对数据库记录的各种条件查询操作。优先按照姓名(sname)查询;如果姓名不确定,再按照年龄查询(sage);如果年龄再不确定,再按照系别(sdept)查询,都不确定,就查询所有学生。其中:学生姓名采用模糊查询。
(2)使用动态SQL中set元素实现对student表中的数据的修改。
使用动态SQL中set元素实现对数据库记录的字段的各种组合修改操作。将学号为201215180的学生的年龄加1,系别改为数学系(MA),其他字段信息不变。
3)使用动态SQL中foreach元素实现对student表中的数据的批量查询、修改与删除。
查询学号在:201215121-201215123这个范围内的学生的记录。
将学号在:201215122-201215123这个范围内的学生的性别修改为男。
删除学号在:201215121-201215123这个范围内的学生的记录。
1.创建映射文件
在mybatis-config.xml下添加映射文件的路径
还是采用接口动态代理的方式来实现,注意namespace=" "是自己接口的路径,
<!DOCTYPE mapper
PUBLIC "-//mybatis.org.//DTD mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="DAO.StudentDao">
<select id="selectWhen" resultType="pojo.Student">
select * from student where 1=1
<choose>
<when test="sname !=null and sname !=''">
and sname like concat('%',#{sname},'%')
</when>
<when test="sage !=null">
and sage=#{sage}
</when>
<when test="sdept !=null and sdept !=''">
and sdept=#{sdept}
</when>
<otherwise></otherwise>
</choose>
</select>
<update id="updateSet">
update student
<set>
<if test="sno!=null and sno!=''">
sage=sage+1 , sdept=#{sdept}
</if>
</set>
where sno=#{sno}
</update>
<select id="selectSno" resultType="pojo.Student">
select * from student where sno in
<foreach collection="array" item="numbers"
open="(" separator="," close=")">
#{numbers}
</foreach>
</select>
<update id="updateSex">
update student set ssex='男'
where sno in
<foreach collection="array" item="sexs"
open="(" separator="," close=")">
#{sexs}
</foreach>
</update>
<delete id="deleteSno">
delete from student where sno in
<foreach collection="array" item="numbers" open="("
separator="," close=")">
#{numbers}
</foreach>
</delete>
</mapper>
2.创建接口
import org.apache.ibatis.annotations.Param;
import pojo.Student;
import java.util.List;
public interface StudentDao {
List<Student> selectWhen(@Param("sname") String sname,
@Param("sage") Integer sage, @Param("sdept") String sdept);
void updateSet(@Param("sno") String sno, @Param("sdept") String sdept);
List<Student> selectSno(String[] numbers);
void updateSex(String[] sno);
void deleteSno(String[] numbers);
}
3.测试代码
import DAO.StudentDao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.Student;
import utils.MybatisUtil;
import java.util.List;
public class StudentTest {
@Test
public void selectWhen() {
SqlSession session = MybatisUtil.openSession();
StudentDao mapper = session.getMapper(StudentDao.class);
System.out.println("-----------------查询姓名--------------------");
List<Student> list;
list = mapper.selectWhen("李", null, "");
for (Student s : list) {
System.out.println(s);
}
System.out.println("-----------------查询年龄--------------------");
list = mapper.selectWhen("", 18, "");
for (Student s : list) {
System.out.println(s);
}
System.out.println("-----------------查询年龄--------------------");
list = mapper.selectWhen("", null, "IS");
for (Student s : list) {
System.out.println(s);
}
System.out.println("-----------------查询所有--------------------");
list = mapper.selectWhen("", null, "");
for (Student s : list) {
System.out.println(s);
}
session.close();
}
@Test
public void updateSet() {
SqlSession session = MybatisUtil.openSession();
StudentDao mapper = session.getMapper(StudentDao.class);
mapper.updateSet("201215180", "MA");
session.commit();
session.close();
}
@Test
public void selectSno() {
SqlSession session = MybatisUtil.openSession();
StudentDao mapper = session.getMapper(StudentDao.class);
List<Student> list;
String[] numbers=new String[100];
for(int i=201215121;i<=201215123;i++){
numbers[i-201215121]=""+i;
}
list = mapper.selectSno(numbers);
for (Student s : list) {
System.out.println(s);
}
session.close();
}
@Test
public void updateSex(){
SqlSession session = MybatisUtil.openSession();
StudentDao mapper = session.getMapper(StudentDao.class);
String[] numbers=new String[100];
for(int i=201215121;i<=201215123;i++){
numbers[i-201215121]=""+i;
}
mapper.updateSex(numbers);
session.commit();
session.close();
}
@Test
public void deleteSno(){
SqlSession session = MybatisUtil.openSession();
StudentDao mapper = session.getMapper(StudentDao.class);
String[] numbers=new String[100];
for(int i=201215121;i<=201215123;i++){
numbers[i-201215121]=""+i;
}
mapper.deleteSno(numbers);
session.commit();
session.close();
}
}
动态SQL的学习链接请参考
(5条消息) MyBatis学习笔记-08.MyBatis动态Sql语句foreach的collection的用法以及用foreach实现批量删除与批量新增_YuanMxy的博客-CSDN博客
(5条消息) 【Mybatis】功能强大的动态SQL之foreach批量查询、批量插入_mybatis foreach查询_你的知识书架的博客-CSDN博客 (5条消息) MyBatis动态SQL中if、where、trim、choose、when、otherwise、foreach标签及sql标签范例_sql中的trim标签_夏志121的博客-CSDN博客
(4条消息) 【MyBatis】多条件查询、动态SQL、多表操作、注解开发_实体类添加注解默认查询条件_懒羊羊.java的博客-CSDN博客