MyBatis是一种ORM(Object-Relational Mapping)框架,它通过XML或注解的方式将Java对象和SQL语句进行映射,从而实现对数据库的增删改查操作。下面是MyBatis的增删改查说明:
增加(insert)
在MyBatis中,插入数据可以使用insert语句,语句可以直接写在XML文件中,也可以使用注解的方式。例如:
XML方式:
Copy
<insertid="addUser"parameterType="User">
INSERT INTO user (name, age, gender) VALUES (#{name}, #{age}, #{gender})
</insert>
注解方式:
Copy
@Insert("INSERT INTO user (name, age, gender) VALUES (#{name}, #{age}, #{gender})")intaddUser(User user);
删除(delete)
在MyBatis中,删除数据可以使用delete语句,语句可以直接写在XML文件中,也可以使用注解的方式。例如:
XML方式:
Copy
<deleteid="deleteUserById"parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
注解方式:
Copy
@Delete("DELETE FROM user WHERE id = #{id}")intdeleteUserById(int id);
修改(update)
在MyBatis中,修改数据可以使用update语句,语句可以直接写在XML文件中,也可以使用注解的方式。例如:
XML方式:
Copy
<updateid="updateUser"parameterType="User">
UPDATE user SET name = #{name}, age = #{age}, gender = #{gender} WHERE id = #{id}
</update>
注解方式:
Copy
@Update("UPDATE user SET name = #{name}, age = #{age}, gender = #{gender} WHERE id = #{id}")intupdateUser(User user);
查询(select)
在MyBatis中,查询数据可以使用select语句,语句可以直接写在XML文件中,也可以使用注解的方式。例如:
XML方式:
Copy
<selectid="getUserById"parameterType="int"resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
注解方式:
Copy
@Select("SELECT * FROM user WHERE id = #{id}")
User getUserById(int id);
MyBatis练习示例:
假设有一个学生表(student),包含以下字段:
字段名 类型 描述
id int 学生ID
name varchar 学生姓名
age int 学生年龄
gender varchar 学生性别
score double 学生成绩
请使用MyBatis实现以下功能:
根据学生ID查询学生信息。
查询所有学生的信息,并按照成绩从高到低排序。
查询所有女学生的信息,并按照年龄从小到大排序。
插入一个学生的信息。
更新一个学生的信息。
删除一个学生的信息。
批量删除学生的信息
以下是一个简单的MyBatis练习作业示例代码
创建数据库插入数据
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
gender VARCHAR(10),
score DOUBLE
);
INSERT INTO student (id, name, age, gender, score) VALUES (1, '张三', 18, '男', 90.5);
INSERT INTO student (id, name, age, gender, score) VALUES (2, '李四', 19, '女', 85.2);
INSERT INTO student (id, name, age, gender, score) VALUES (3, '王五', 20, '男', 92.3);
INSERT INTO student (id, name, age, gender, score) VALUES (4, '赵六', 21, '女', 88.9);
INSERT INTO student (id, name, age, gender, score) VALUES (5, '钱七', 22, '男', 95.1);
INSERT INTO student (id, name, age, gender, score) VALUES(7, '周九', 19, '女', 88.5);
INSERT INTO student (id, name, age, gender, score) VALUES(8, '吴十', 20, '男', 86.0);
INSERT INTO student (id, name, age, gender, score) VALUES(9, '郑十一', 18, '女', 93.0);
INSERT INTO student (id, name, age, gender, score) VALUES(10, '王十二', 19, '男', 91.5);
java实体类
public class Student {
public Integer id; // 学生ID
public String name; // 学生姓名
public Integer age; // 学生年龄
public String gender; // 学生性别
public double score; // 学生成绩
public Integer getId() { // 获取学生ID
return id;
}
public void setId(Integer id) { // 设置学生ID
this.id = id;
}
public String getName() { // 获取学生姓名
return name;
}
public void setName(String name) { // 设置学生姓名
this.name = name;
}
public Integer getAge() { // 获取学生年龄
return age;
}
public void setAge(Integer age) { // 设置学生年龄
this.age = age;
}
public String getGender() { // 获取学生性别
return gender;
}
public void setGender(String gender) { // 设置学生性别
this.gender = gender;
}
public double getScore() { // 获取学生成绩
return score;
}
public void setScore(double score) { // 设置学生成绩
this.score = score;
}
@Override
public String toString() { // 重写toString()方法,方便输出学生信息
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", score=" + score +
'}';
}
}
接口
public interface StudentDao {
/**
* 根据学生ID查询学生信息
* @param id 学生ID
* @return 查询到的学生信息
*/
Student selectById(int id);
/**
* 查询所有学生的信息,并按照成绩从高到低排序
* @return 查询到的学生信息列表
*/
List<Student> selectAllOrderByScore();
/**
* 查询所有女学生的信息,并按照年龄从小到大排序
* @return 查询到的女学生信息列表
*/
List<Student> selectAllFemaleOrderByAge();
/**
* 插入一个学生的信息
* @param student 要插入的学生信息
*/
void insert(Student student);
/**
* 更新一个学生的信息
* @param student 要更新的学生信息
*/
void update(Student student);
/**
* 删除一个学生的信息
* @param id 要删除的学生ID
*/
void deleteById(int id);
/**
* 批量删除学生的信息
* @param ids 要删除的学生ID列表
*/
void deleteBatch(List<Integer> ids);
}
映射类
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--该mapper文件对应的dao接口为com.ding.dao.StudentDao-->
<mapper namespace="com.ding.dao.StudentDao"> <!--根据id查询学生信息,参数为int类型,返回值为Student类型-->
<select id="selectById" parameterType="int" resultType="student">
select id, name, age, gender, score
from student
where id = #{id}
</select> <!--查询所有学生信息,按照成绩降序排列,返回值为List<Student>类型-->
<select id="selectAllOrderByScore" resultType="student">
select id, name, age, gender, score
from student
order by score desc
</select> <!--查询所有女生信息,按照年龄升序排列,返回值为List<Student>类型-->
<select id="selectAllFemaleOrderByAge" resultType="student">
select id, name, age, gender, score
from student
where gender = 'female'
order by age asc
</select> <!--插入学生信息,参数为Student类型-->
<insert id="insert" parameterType="com.ding.baen.Student">
insert into student(name, age, gender, score)
values (#{name}, #{age}, #{gender},
#{score})
</insert> <!--更新学生信息,参数为Student类型-->
<update id="update" parameterType="com.ding.baen.Student">update student
<set>
<!--以下为动态SQL语句,根据参数值是否为空来判断是否需要更新-->
<if test="name!=null and name!=''">
name = #{name},
</if>
<if test="age!=null and age!=''">
age = #{age},
</if>
<if test="gender!=null and gender!=''">
gender = #{gender},
</if>
<if test="score!=null and score!=''">
score = #{score},
</if>
</set>
where id = #{id}
</update>
<!--根据id删除学生信息,参数为int类型-->
<delete id="deleteById" parameterType="int">
delete
from student
where id = #{id}
</delete>
<!--批量删除学生信息,参数为List<Integer>类型-->
<delete id="deleteBatch" parameterType="list">
delete from student where id in
<!--使用foreach标签遍历List<Integer>,生成IN语句-->
<foreach collection="list" item="id" open="(" separator="," close=")">#{id}
</foreach>
</delete>
</mapper>
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--MyBatis配置文件-->
<configuration> <!--引入jdbc.properties文件-->
<properties resource="jdbc.properties"/> <!--MyBatis全局配置-->
<settings> <!--设置日志实现为log4j-->
<setting name="logImpl" value="log4j"/>
</settings> <!--类型别名配置,将com.ding.baen包下的类注册为别名-->
<typeAliases>
<package name="com.ding.baen"/>
</typeAliases> <!--数据源配置-->
<environments default="mysql">
<environment id="mysql"> <!--事务管理器类型为JDBC-->
<transactionManager type="JDBC"></transactionManager> <!--数据源类型为POOLED-->
<dataSource type="POOLED"> <!--从jdbc.properties中获取驱动、URL、用户名、密码-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--Mapper映射文件配置,将com.ding.dao包下的Mapper接口注册-->
<mappers>
<package name="com.ding.dao"/>
</mappers>
</configuration>
测试类
public class StudentTest {
InputStream stream = null;
SqlSessionFactoryBuilder builder = null;
SqlSessionFactory factory = null;
SqlSession sqlSession = null;
StudentDao studentDao = null;
@Before
public void setUp() throws Exception {
// 读取MyBatis的配置文件
stream = Resources.getResourceAsStream("mybatis.xml");
builder = new SqlSessionFactoryBuilder();
factory = builder.build(stream);
sqlSession = factory.openSession();
studentDao = sqlSession.getMapper(StudentDao.class);
}
// 根据学生ID查询学生信息
@Test
public void testSelectById() {
Student student = studentDao.selectById(1);
System.out.println(student);
}
// 查询所有学生的信息,并按照成绩从高到低排序
@Test
public void testSelectAllOrderByScore() {
List<Student> students = studentDao.selectAllOrderByScore();
students.forEach(System.out::println);
}
// 查询所有女学生的信息,并按照年龄从小到大排序
@Test
public void testSelectAllFemaleOrderByAge() {
List<Student> students = studentDao.selectAllFemaleOrderByAge();
students.forEach(System.out::println);
}
// 插入一个学生的信息
@Test
public void testInsert() {
Student student = new Student();
student.setName("Tom");
student.setAge(20);
student.setGender("male");
student.setScore(90.0);
studentDao.insert(student);
System.out.println(student);
}
// 更新一个学生的信息
@Test
public void testUpdate() {
Student student = studentDao.selectById(1);
System.out.println("修改前:" + student);
student.setScore(95.0);
studentDao.update(student);
Student acb = studentDao.selectById(1);
System.out.println("修改后:" + acb);
System.out.println(student);
}
// 删除一个学生的信息
@Test
public void testDeleteById() {
studentDao.deleteById(1);
}
// 批量删除学生的信息
@Test
public void testDeleteBatch() {
List<Integer> ids = Arrays.asList(2, 3, 4);
studentDao.deleteBatch(ids);
}
@After
public void distroy() throws IOException{
sqlSession.commit();
sqlSession.close();
stream.close();
}
}
以上是MyBatis的增删改查说明,开发人员可以根据实际需求选择适合自己的方式进行操作。