Mybatis之动态SQL实现数据的增删改查
一、所需jar包
二、XML文件配置
<?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">
<configuration>
<environments default="development">
<!-- 配置数据库的信息 -->
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://192.168.3.29:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 指定xml映射文件 -->
<mappers>
<mapper resource="student.xml"></mapper>
</mappers>
</configuration>
三、代码分析
测试类Test
public class Test {
public static void main(String[] args) throws Exception {
//指定XML文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//通过xml文件生成SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//生成sqlSession
SqlSession sqlSession=sessionFactory.openSession();//默认为false,不会自动提交,需要调用commit()方法;和下面注释的这一行效果是一样的
//SqlSession sqlSession=sessionFactory.openSession(false);
IStudentDao studentDao = sqlSession.getMapper(IStudentDao.class);//为接口生成JDK动态代理对象
//删,通过id,批量删除向数据库中数据,注意:传到IStudentDao的数据不能直接就是一个字符串
List<String> list = new ArrayList<>();
list.add("fbc6f519-cac5-4f53-8f37-284fc84d9215");
list.add("e4c6a8e5-7c1f-4ca8-b569-158c1912a0e5");
studentDao.batchDelete(list);
//增,向数据库中添加数据,对于sql语句,insert、delete、update如果返回值类型是boolean,只要执行成功就返回true,否则是false,如果返回值类型是int,返回sql语句作用的行数
System.out.println(studentDao.insert(new Student("cbc6f519-cac5-4f53-8f37-284fc84d9214","Mary","111","青岛")));
//改,修改数据
Student student = new Student();
student.setId("acd6a8e5-7c1f-4ca8-b569-158c1912a229");
student.setAddress("UK");
System.out.println(studentDao.update(student));
//查,查询数据库信息,并实现模糊查询
String name="大";
String mobile="3";
//sql映射文件无法对数据进行加工,计算,因此传到接口的数据要提前加工好
if(name!=null) {
name="%"+name+"%";
}
if(mobile!=null) {
mobile="%"+mobile+"%";
}
for (Student stu : studentDao.select(mobile, name)) {
System.out.println(stu.toString());//打印查询到的数据
}
sqlSession.commit();//提交sql语句
sqlSession.close();//释放资源
}
}
Student类
public class Student {
private String id;
private String name;
private String mobile;
private String address;
public Student() {
}
public Student(String id, String name, String mobile, String address) {
super();
this.id = id;
this.name = name;
this.mobile = mobile;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", mobile=" + mobile + ", address=" + address + "]";
}
}
Dao层代码
IStudentDao
/**
* 学生管理数据访问层
*
* @Snow
*/
public interface IStudentDao {
/**
* 实现添加数据抽象方法
*
* @Snow
*/
boolean insert(Student student);
/**
* 实现修改数据抽象方法
*
* @Snow
*/
boolean update(Student student);
/**
* 实现批量删除数据抽象方法
*
* @Snow
*/
int batchDelete(List<String> list);
/**
* 实现查询及模糊查询抽象方法
*
* @Snow
*/
List <Student> select(@Param("mobile")String mobile,@Param("name")String name);
}
二、XML(SQL)映射文件配置
<?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 namespace="com.jd.student.dao.IStudentDao">
<!-- 数据添加 -->
<insert id="insert">
insert into student(id,user_name,mobile,address) value(#{id},#{mobile},#{name},#{address})
</insert>
<!-- 批量删除 -->
<delete id="batchDelete">
delete from student where id in(
<foreach item="id" collection="list" separator="," >
#{id}
</foreach>
)
</delete>
<!-- 数据修改 -->
<update id="update">
update student
<!-- 实现当只修改了部分的数据,能够保留下没修该的那部分数据 ,否则不需要修改的那部分数据会为空-->
<set>
<if test="name!=null">user_name=#{name}</if>
<if test="mobile!=null">mobile=#{mobile}</if>
<if test="address!=null">address=#{address}</if>
</set>
where id=#{id}
</update>
<!-- 数据查询并实现模糊查询 -->
<select id="select" resultType="com.jd.vo.Student"><!-- 指定返回值类型,可以为List集合里面的元素 -->
select id,user_name name,mobile,address from student <!--使用字段的别名,使查回来的变量名和Student中的一样,它会自动的为相应的赋值 -->
<!--
where标签能够实现自动去除不符合规范的and,例如当name=null时,它会把mobile前面的and给去掉,sql语句就变为
select id,user_name name,mobile,address from student where mobile like #{mobile}
-->
<where>
<if test="name!=null">and user_name like #{name}</if>
<if test="mobile!=null">and mobile like #{mobile}</if>
</where>
</select>
</mapper>