本节对student表进行数据添加 由于学生的数据比较多
所以我们通过student表来学习如何用有参方法往数据库添加数据
老样子,按照之前的步骤创建student的实体类
MyBatisStudent
package com.teikin.mybatis.dao.entity;
public class MyBatisStudent {
private Long studentId;
private String studentName;
private Integer studentSex;
private String birthday;
private Double height;
private Double weight;
private Long classId;
public Long getStudentId() {
return studentId;
}
public void setStudentId(Long studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public Integer getStudentSex() {
return studentSex;
}
public void setStudentSex(Integer studentSex) {
this.studentSex = studentSex;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public Double getHeight() {
return height;
}
public void setHeight(Double height) {
this.height = height;
}
public Double getWeight() {
return weight;
}
public void setWeight(Double weight) {
this.weight = weight;
}
public Long getClassId() {
return classId;
}
public void setClassId(Long classId) {
this.classId = classId;
}
@Override
public String toString() {
return "MyBatisStudent{" +
"studentId=" + studentId +
", studentName='" + studentName + '\'' +
", studentSex=" + studentSex +
", birthday='" + birthday + '\'' +
", height=" + height +
", weight=" + weight +
", classId=" + classId +
'}';
}
}
MyBatisStudentDao
在调用addStudentByEntity方法时,要求传一个MyBatisStudent对象(学生对象)。
注意了,之前我们使用sqlSession.insert只是传递一个字符串,其实可以再传一个参数。
这个参数可以是对象,也可以是集合、数组等。
这里我们传一个对象进去,这个对象就是学生对象,将包含学生的所有信息。
package com.teikin.mybatis.dao;
import com.teikin.mybatis.dao.entity.MyBatisStudent;
import com.teikin.mybatis.util.MyBatisSqlSessionFactory;
import org.apache.ibatis.session.SqlSession;
public class MyBatisStudentDao {
private SqlSession sqlSession=null;
public int addStudentByEntity(MyBatisStudent myBatisStudentParam){
sqlSession= MyBatisSqlSessionFactory.getSqlSession();
int rowCount=sqlSession.insert("com.teikin.mybatis.dao.mapper.MyBatisStudentDao.addStudentByEntity",myBatisStudentParam);
sqlSession.commit();
sqlSession.close();
return rowCount;
}
}
MyBatisStudentDao.xml
parameterType:参数类型
这里我们需要传进去一个MyBatisStudent对象(学生对象)
<mapper namespace="com.teikin.mybatis.dao.mapper.MyBatisStudentDao">
<insert id="addStudentByEntity" parameterType="com.teikin.mybatis.dao.entity.MyBatisStudent">
insert into student
set student_name=#{studentName},
student_sex=#{studentSex},
birthday='${birthday}',
height=#{height},
weight=#{weight},
class_id=#{classId}
</insert>
</mapper>
这里先这样写,后面会介绍#和$的作用。
Test类
package com.teikin.mybatis.dao;
import com.teikin.mybatis.dao.entity.MyBatisStudent;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class MyBatisStudentDaoTest {
private MyBatisStudentDao myBatisStudentDao = null;
@Test
public void testAddStudentByEntity() {
MyBatisStudent myBatisStudent = new MyBatisStudent();
myBatisStudent.setStudentName("陈同学");
myBatisStudent.setStudentSex(2);
myBatisStudent.setBirthday("1990-06-25");
myBatisStudent.setHeight(162D);
myBatisStudent.setWeight(115D);
myBatisStudent.setClassId(1L);
myBatisStudentDao = new MyBatisStudentDao();
//通过有参方法添加数据
int rowCount = myBatisStudentDao.addStudentByEntity(myBatisStudent);
System.out.println("addStudentByEntity影响的行数:" + rowCount);
}
成功运行结果:
此时返回数据库查看student表将得到一条新的关于陈同学的数据。
我们来看一下结果中的这条sql语句
如图所示,要插入的数据除了birthday外都显示为一个问号,在sql语句中“?”表示一个占位符。
回到MyBatisStudentDao.xml的insert中查看,只有birthday使用了$符号。
由此可以看出,使用了#{ }方式在sql语句中会以"?"表示,使用了${ }方式在sql语句中则会直接将要插入的数据显示出来。
查询条件有两种方式表达
使用“${}”来传递参数
使用“#{}”来传递参数
“#{}”是预编译处理
当MyBatis在处理“#{}”时,会将sql中的“#{}”替换为“?”,然后调用PreparedStatement的set方法来赋值,传入字符串后则会在字符串的值两边加上“‘”单引号。
“${}”字符串替换
当MyBatis在处理“${}”时,会将sql中的“${}”替换为变量的值,所传入的数据不会在两边加上单引号。
注:使用“${}”会导致sql注入,不利于系统的安全性。
SQL注入是什么?
通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
常见的有匿名登陆(在登陆框输入恶意的字符串)、借助异常获取数据库信息等。
这就是MyBatis中用过有参方法的方式往数据库里添加数据啦