• u  基于Mybatis的CRUD
  • u  掌握MyBatis的结果类型-resultMap和resultType
  • u  掌握MyBatis的参数类型
  • u  掌握#和$两种语法

1      基于mybatis的CRUD

1.1   StudentDAO

 public interface StudentDao {
public void insertStudent(Student s);
public void updateStudent(Student s);
public void deleteStudent(String stuid);
public Student selectStudentById(String stuid);
public List<Student> selectStudent();
}

1.1   StudentDaoImpl

 package cn.mybatis.dao.impl;

 import java.util.ArrayList;
import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory; import cn.mybatis.dao.StudentDao;
import cn.mybatis.domain.Student; public class StudentDaoImpl implements StudentDao{
private SqlSessionFactory fac;
public StudentDaoImpl(SqlSessionFactory fac){
this.fac = fac;
}
@Override
public void insertStudent(Student s) {
SqlSession sess = null;
try{
sess = this.fac.openSession();
sess.insert("student.insertStudent", s);
sess.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
sess.close();
}
}
@Override
public void updateStudent(Student s) {
SqlSession sess = null;
try{
sess = this.fac.openSession();
sess.update("student.updateStudent", s);
sess.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
sess.close();
}
} @Override
public void deleteStudent(String stuid) {
SqlSession sess = null;
try{
sess = this.fac.openSession();
sess.delete("student.deleteStudent", stuid);
sess.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
sess.close();
}
} @Override
public Student selectStudentById(String stuid) {
SqlSession sess = null;
Student s = new Student();
try{
sess = this.fac.openSession();
s = sess.selectOne("student.selectStudentById", stuid);
sess.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
sess.close();
}
return s;
}
@Override
public List<Student> selectStudent() {
SqlSession sess = null;
List<Student> sList = new ArrayList<Student>();
try{
sess = this.fac.openSession();
sList = sess.selectList("student.selectStudent");
sess.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
sess.close();
}
return sList;
} }

1.1   StudentMapper.xml

 <?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="student">
<resultMap type="student" id="BaseResultMap">
<id column="stu_id" property="stuId" jdbcType="VARCHAR" javaType="java.lang.String" />
<result column="stu_name" property="stuName" jdbcType="VARCHAR" javaType="java.lang.String" />
<result column="stu_birthdate" property="stuBirthdate" jdbcType="DATE" javaType="java.util.Date" />
<result column="stu_phone" property="stuPhone" jdbcType="VARCHAR" javaType="java.lang.String" />
</resultMap> <!-- 插入数据 -->
<insert id="insertStudent" parameterType="student">
insert into student (stu_id,stu_name,stu_birthdate,stu_phone)
values(#{stuId},#{stuName},#{stuBirthdate},#{stuPhone})
</insert> <!-- 更新数据 -->
<update id="updateStudent" parameterType="student">
update student set stu_name=#{stuName}, stu_birthdate=#{stuBirthdate},
stu_phone=#{stuPhone} where stu_id=#{stuId}
</update>
<!-- 删除数据 -->
<delete id="deleteStudent" parameterType="string">
delete from student where stu_id=#{stuId}
</delete> <!-- 查询数据,返回的数据会根据resultMap设置封装到实体类对象中 -->
<select id="selectStudentById" resultMap="BaseResultMap" parameterType="string" >
select * from student where stu_id=#{stuId}
</select> <select id="selectStudent" resultMap="BaseResultMap">
select * from student
</select>
</mapper>

1.1   测试demo

 package cn.mybatis.demo;
……
public class Demo_01 {
private static SqlSessionFactory fac;
static{
InputStream is = null;
try{
//处理并根据config配置文件实例化SqlSessionFactory
is = Resources.getResourceAsStream("SqlMapperConfig.xml");
//获取session工厂类
fac = new SqlSessionFactoryBuilder().build(is);
}catch(Exception e){
e.printStackTrace();
Logger.getLogger(Demo_01.class).debug(e.getMessage());
}
} public static void main(String[] args) throws Exception {
//创建要保存的学生信息
Student s = new Student();
s.setStuId("1");
s.setStuName("zhouyeqin");
s.setStuBirthdate(new SimpleDateFormat("yyyy-MM-dd").parse("1990-1-12"));
s.setStuPhone("341324123"); StudentDao sdao = new StudentDaoImpl(fac);
//插入数据
// sdao.insertStudent(s);
//更新数据
// sdao.updateStudent(s);
//删除数据
// sdao.deleteStudent("1");
//根据id查询数据
// Student s1 = sdao.selectStudentById("1");
// System.out.println(s1);
//查询所有数据
// List<Student> s2 = sdao.selectStudent();
// System.out.println(s2);
}
}

2      MyBatis的结果类型-resultMap和resultType

<select>元素的返回值设置有两个常用属性:

  • resultMap

属性值是已经定义好的<resultMap>元素的id

示例:

<resultMap id="BaseResultMap" type="com.icss.MyBatis.pojo.Student">

<select id="query" resultMap="BaseResultMap">

  • resultType

属性值有以下情况:

  • 单一类型,例如<select id="getCount" resultType="java.lang.Integer">
  • 组合类型,一般都是pojo类,需要注意查询语句的列名或别名必须要和pojo类的属性名称一致,否则无法映射,例如<select id="query2" resultType="com.icss.MyBatis.pojo.Student">
  • Map类型,列值会自动封装为键值对Map集合,键为列名,值为列值,例如<select id="query3" resultType="java.util.HashMap">

resultMap使用情况:

 <!-- 查询单条 -->
<select id="queryById" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select * from student where stu_id=#{stuId}
</select>
<!-- 查询多条 -->
<select id="query" resultMap="BaseResultMap">
select * from student
</select>

resultType使用情况:

studentMapper.xml

 <!-- 返回总记录数 -->
<select id="getCount" resultType="java.lang.Integer">
select count(*) from student
</select> <!-- 查询多条,返回类型为pojo类型,前提是列名(别名)必须和pojo类属性名称一致 -->
<select id="query2" resultType="cn.mybatis.domain.Student">
SELECT s.stu_id AS stuId,s.stu_name AS stuName,
s.stu_birthdate AS stuBirthdate,s.stu_phone AS stuPhone
FROM student s
</select> <!-- 查询多条,返回类型为List<Map>类型 -->
<select id="query3" resultType="java.util.HashMap">
select * from student
</select>

StudentDao.java

 public void testGetCount();
public void testQuery2();
public void testQuery3();

StudentDaoImpl.java

 @Override
public void testGetCount() {
SqlSession session = fac.openSession();
Integer count = (Integer) session.selectOne("student.getCount");
System.out.println("count=" + count);
session.close();
} @Override
public void testQuery2() {
SqlSession session = fac.openSession();
List<Student> list = session.selectList("student.query2");
for (Student stu : list) {
System.out.println(stu.getStuName());
}
session.close();
} @Override
public void testQuery3() {
SqlSession session = fac.openSession();
List<Map<String, Object>> list = session.selectList("student.query3");
for (Map<String, Object> map : list) {
System.out.println("---------------------");
System.out.println("stu_id=" + map.get("STU_ID"));
System.out.println("stu_name=" + map.get("STU_NAME"));
System.out.println("stu_birthdate=" + map.get("STU_BIRTHDATE"));
System.out.println("stu_phone=" + map.get("STU_PHONE"));
System.out.println("---------------------");
}
session.close();
}

测试

 public static void main(String[] args) throws Exception {
StudentDao sdao = new StudentDaoImpl(fac);
// sdao.testGetCount();
sdao.testQuery2();
sdao.testQuery3();
}

3      MyBatis的参数类型

CRUD操作都有可能传入参数,参数类型的设置需要用到parameterType属性,属性值有以下几种情况:

  • 单一类型,例如

<delete id="delete" parameterType="java.lang.Integer">

  • 复合类型,例如

<update id="update" parameterType="com.icss.MyBatis.pojo.Student">

  • Map集合类型,例如

<select id="query4" parameterType="java.util.HashMap" resultMap="BaseResultMap">

参数案例:

studentMapper.xml

 <!-- 查询多条,传入类型为Map类型,注意左右尖括号的转义 -->
<select id="query4" parameterType="java.util.HashMap" resultMap="BaseResultMap">
<![CDATA[
select * from student
where stu_birthdate>=#{startDate} and stu_birthdate<=#{endDate}
]]>
</select>

StudentDaoImpl.java

 @Override
public void testQuery4() {
SqlSession session = fac.openSession();
Map<String,Object> map = new HashMap<String, Object>();
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
try {
map.put("startDate", sdf.parse( "1990-07-10 19:20:00" ));
map.put("endDate", sdf.parse( "1992-07-10 19:20:00" ));
} catch (ParseException e) {
e.printStackTrace();
}
List<Student> list = session.selectList("student.query4",map);
for (Student stu : list) {
System.out.println(stu.getStuName());
System.out.println(stu.getStuId());
}
session.close();
}

4      #和$两种语法

  • #可以进行预编译,进行类型匹配,#{变量名}会转化为jdbc的类型
  • $不进行数据类型匹配,${变量名}就直接把${name}替换为name的内容

例如:

select * from tablename where id = #{id},假设id的值为12,其中如果数据库字段id为字符型,那么#{id}表示的就是'12',如果id为整型,那么#{id}就是 12  会转化为jdbc的 select * from tablename where id=?,把?参数设置为id的值。

select * from tablename where id = ${id} ,如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符型,那么Sql语句应该写成 select * from table where id = '${id}' 。

  • 事实上在MyBatis中使用${id}这种标识符会直接抛异常,允许直接使用的标识符只能是${value}
  • 如果不需要动态指定SQL语句,应该尽量使用#而不是$,因为$语法容易被SQL注入

使用${}案例:

 <!-- ${}的用法 -->
<select id="query5" resultType="java.lang.String">
select ${value} from student
</select>
 @Override
public void testQuery5() {
SqlSession session = fac.openSession();
String result = (String) session.selectOne("student.query5","max(stu_id)");
System.out.println("result=" + result);
session.close();
}

仿制SQL注入:

通过输入查询条件,猜出表名。

 <!-- ${}的用法 -->
<select id="query5" resultType="java.lang.String">
select stu_name from student where 1=1 and stu_id=${value}
</select>
 @Override
public void testQuery5() {
SqlSession session = fac.openSession();
String result = (String) session.selectOne("student.query5","1 and (select count(*) from student)<>0");
System.out.println("result=" + result);
session.close();
}

总结:

  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
  2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
  3. #方式能够很大程度防止sql注入。 
  4. $方式无法防止Sql注入。
  5. $方式一般用于传入数据库对象,例如传入表名. 
  6. 一般能用#的就别用$.

举个例子。写一句SQL-例如:

select * from user_role where user_code = "100";

这句话而言,需要写成 :

select * from ${tableName} where user_code = #{userCode}

$符是直接拼成sql的,#符则会以字符串的形式 与sql进行拼接。

基于mybatis的CRUD的更多相关文章

  1. 【MyBatis】MyBatis实现CRUD操作

    1.实现基本CRUD功能 使用MyBatis对数据完整的操作,也就是CRUD功能的实现.根据之前的内容,要想实现CRUD,只需要进行映射文件的配置. 范例:修改EmpMapper.xml文件,实现CR ...

  2. SpringBoot 整合 Mybatis 进行CRUD测试开发

    今天来和大家分享下 Spring Boot 整合 MyBatis 的 CRUD 测试方法开发.因为 MyBaits 有两种开发形式,一种基于注解,一种基于 xml . SpringBoot配置文件也有 ...

  3. mybatis plus CRUD

    首先我们的项目建立之后我们要建立一个实体类来对应我们的数据裤中的信息 employee import com.baomidou.mybatisplus.annotation.IdType; impor ...

  4. 基于Mybatis的Dao层的开发

    基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFa ...

  5. MyBatis:CRUD功能

    在前面已经自动生成了mapper和pojo,接下来我们实现mybatis的CRUD功能,先新建service.controller层的方法. 这里的sid是一个开源的id生成类,写完后,我们还需要在启 ...

  6. 分表需要解决的问题 & 基于MyBatis 的轻量分表落地方案

    分表:垂直拆分.水平拆分 垂直拆分:根据业务将一个表拆分为多个表. 如:将经常和不常访问的字段拆分至不同的表中.由于与业务关系密切,目前的分库分表产品均使用水平拆分方式. 水平拆分:根据分片算法将一个 ...

  7. Mybatis的CRUD案例

    一.Mybatis增删改查案例 上一节<Mybatis入门和简单Demo>讲了如何Mybatis的由来,工作流程和一个简单的插入案例,本节主要继上一讲完整的展示Mybatis的CRUD操作 ...

  8. 基于Mybatis分页插件PageHelper

    基于Mybatis分页插件PageHelper 1.分页插件使用 1.POM依赖 PageHelper的依赖如下.需要新的版本可以去maven上自行选择 <!-- PageHelper 插件分页 ...

  9. 基于Mybatis的Dao层开发

    转自:https://www.cnblogs.com/rodge-run/p/6528398.html 基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建 Sq ...

随机推荐

  1. 使用filezella服务器安装ftp

    使用FileZilla配置FTP站点,可参考以下步骤: 1.打开Filezilla Server服务端: 点击[Edit]->[Users],或者点击如下图标新增用户. 2.添加FTP帐号后,设 ...

  2. 深入了解Token认证的来龙去脉

    Token 是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端.前端可以在每次请求的时候带上 Token 证明自己的合法地位.   不久 ...

  3. 修改Visual Studio2010的主题颜色

    第一步:打开工具->扩展管理器 第二步:搜素visual studio color theme editor 第三步:找到Visual Studio Color Theme Editor 第四步 ...

  4. redis启动加载过程、数据持久化

    背景 公司一年的部分业务数据放在redis服务器上,但数据量比较大,单纯的string类型数据一年就将近32G,而且是经过压缩后的. 所以我在想能否通过获取string数据的时间改为保存list数据类 ...

  5. cropper+pillow处理上传图片剪裁(一)

    在写新博客的时候,遇到需要用户上传自定义图片的处理,查了一番资料,决定用cropper和pillow来处理需要剪裁的图片上传,大致思路是:前端收集用户上传的图片和用户剪裁的尺寸数据,后台接收图片后按数 ...

  6. javascript中对象属性搜索原则

    为什么通过对象就能访问到原型中的属性或者方法? 属性搜索原则: 1 首先会在对象本身查找有没有该属性,如果有直接返回 2 如果没有,此时就会在构造函数中查找通过this给对象添加的成员中有没有,如果有 ...

  7. Python框架、库和软件资源大全(整理篇)

    有少量修改,请访问原始链接.PythonWIn的exe安装包;http://www.lfd.uci.edu/~gohlke/pythonlibs/ 原文链接:codecloud.net/python- ...

  8. uva 1658 Admiral 【 最小费用最大流 】

    拆点,每个点拆成 i,i' 在i 和i‘之间连一条费用为0,容量为1的边,就可以保证每个点只经过一次 特殊的点,1和n之间,,,n和2*n之间连一条费用为0,容量为2的边,可以求出两条路径 #incl ...

  9. jquery 星级评价插件jquery Raty的使用

    需要引入的js <script type="text/javascript" src="<%=basePath%>resources/js/jquery ...

  10. Discuz 3x 配置问题

    1.注意config里面配置的路径 2.注意ucenter里面 的密钥要一直 3.IP 的选择