2018.4.7
仅为个人理解 不足之处欢迎指正~
在上一篇的基础上完成使用Mybatis进行CRUD的操作
数据库说明:
在上文中,Student.xml中仅包含一条sql语句
我们首先一次性添加insert delete select(单个) update语句
完整Student.xml如下:
insert into student values (#{id},#{name})
delete from student where id= #{id}
update student set name=#{name} where id=#{id}
下面解释一下代码中的部分问题:
1.sql语句中的 #{} 起到什么作用?
要明白这一点 首先要了解一下动态sql的概念:
动态sql是mybatis的主要特性之一,在mapper中定义的参数传入xml中之后,在查询之前mybatis会对其进行动态解析
mybatis提供了两种支持动态sql的语法:
#{} 与 ${}
下面大概说明一下这两种方式的区别:
在下面这条语句中:
select * from student where id= #{id}
如果改为:
select * from student where id= ${id}
如果id的值为2018040701
这两条语句解析之后结果是相同的 均为:
select * from student where id= 2018040701
#{}在预处理中,会把参数部分用一个占位符 ? 代替
sql语句变为:
select * from student where id= ?
而如果使用${} 在解析阶段 只是简单的字符串替换
sql语句变为:
select * from student where id= 2018040701
#{}的参数替换发生在DBMS中 而${}则发生在动态解析过程中
通常情况下:
使用#{}更安全 更迅速 可以防止sql注入
那么什么情况下使用${}
如果你想要实现下面的语句
select * from #{tablename}
上面已经提到 如果使用#{}的话
sql语句发送过去是这样的:
select * from ?
这样一条带问号的sql语句是需要传递参数的 那么加入我们传入了参数student
那么查询语句就变为:
select * from 'student'
这样的sql语句会导致错误
那么这种时候就需要用到${}
因为${}是直接进行字符串拼接 将语句改为:
select * from ${tablename}
另一种情况是 想要插入一个不改变的字符串 如order by:
order by ${columnname}
这种情况也需要使用${}
最后总结一下:
通常情况下使用#{}
#{}一般用在用户输入值的地方
${}一般用在需要程序员赋值的地方
2、parameterType和resultType
parameterType在映射文件中指定输入参数的类型 基本数据类型只能传入一个 通过#{}获取传入的值 复杂数据类型(类、HashMap)通过#{属性名} map中则为#{key}传入参数
resultType指定输出结果的类型
下面更改测试类:
原测试类仅包含selectList一个方法:
package com.tzy.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.tzy.pojo.Student;
public class TestMybatis {
public static void main(String[] args) throws IOException {
//mybatis配置文件
String resource = "mybatis-configuration.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂 传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();
List cs=session.selectList("listStudent");
// 冒号是遍历的作用
for (Student stu : cs) {
System.out.println(stu.getName()+" "+stu.getId());
}
}
}
增
Student stu=new Student();
stu.setId(2018040701);
stu.setName("李宗盛");
session.insert("addStudent", stu);
先增加再遍历 可以看到结果 增加成功
package com.tzy.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.tzy.pojo.Student;
public class TestMybatis {
public static void main(String[] args) throws IOException {
//mybatis配置文件
String resource = "mybatis-configuration.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂 传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();
Student stu=new Student();
stu.setId(2018040701);
stu.setName("李宗盛");
session.insert("addStudent", stu);
List cs=session.selectList("listStudent");
// 冒号是遍历的作用
for (Student a : cs) {
System.out.println(a.getName()+" "+a.getId());
}
}
}
删
通过id将刚插入的李宗盛删除:
Student stu=new Student();
stu.setId(2018040701);
session.delete("deleteStudent", stu);
先执行删除 再遍历:
删除成功
改
通过id将“周杰伦”改为“林俊杰”
Student stu=new Student();
stu.setId(2018040501);
stu.setName("林俊杰");
session.delete("updateStudent", stu);
遍历
修改成功
查(单个 查询多个的方法在上一篇中)
通过selectOne获取id=2018040501的记录:
由于在xml中 单个获取的getStudent的parameterType为int
所以代码如下:
Student stu=session.selectOne("getStudent",2018040501);
System.out.println(stu.getId()+" "+stu.getName());
结果为:
谢谢~