Mybatis学习记录(三)——Mybatis实现CRUD

2018.4.7

仅为个人理解 不足之处欢迎指正~

在上一篇的基础上完成使用Mybatis进行CRUD的操作

数据库说明:


在上文中,Student.xml中仅包含一条sql语句


我们首先一次性添加insert delete select(单个) update语句


完整Student.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 通常设置成pojo包名
 		 在后续调用sql语句的时候 会使用到 -->
    <mapper namespace="com.tzy.pojo">
    <!-- 这条语句中 用id:listStudent进行标示 供后续代码调用
    		resultType表示的返回一个关联Student类的数据
    		在这里本来应该使用的是com.tzy.pojo.Student
    		但是在之前的mybatis-configuration.xml中定义了
    		typeAliases别名 所以可以直接使用Student-->
        <select id="listStudent" resultType="Student">
            select * from   student  
        </select>
         
         <insert id="addStudent" parameterType="Student" >
	        insert into student values (#{id},#{name})    
	    </insert>
	    
	    <delete id="deleteStudent" parameterType="Student" >
	        delete from student where id= #{id}   
	    </delete>
	    
	    <select id="getStudent" parameterType="_int" resultType="Student">
	        select * from   student  where id= #{id}    
	    </select>

	    <update id="updateStudent" parameterType="Student" >
	        update student set name=#{name} where id=#{id}    
	    </update>
    </mapper>

下面解释一下代码中的部分问题:

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、parameterTyperesultType

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<Student> 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<Student> 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());

结果为:



谢谢~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值