原生的增删改查带?号#{name}

2020-11-07  本文已影响0人  _FireFly_

如何在操作SQL语句执行时 携带动态的信息

    sqlSession调用方法时     增删改查方法都提供了两个重载
        insert("sqlid");    insert("sqlid",object)
    执行sql语句的时候  sql语句中使用 #{key} 
    
    如果sql语句中只有一个#{key}  key是可以随便写
    如果sql语句中两个以上的#{key} 需要key与传递参数的值对应  
        domain对象
        map

    insert into student values(?,?,?,?,?);
    pstat.setString(2,"zzt");   通过判断调用的方法   管理底层SQL是否拼接单引号

    insert into student values(#{id},#{name},#{sex},,,);
    我们传递给SqlSession一个对象
    反射分析对象中每一个属性的类型
    根据类型来判断该调用pstat.setString   帮我们管理是否拼接单引号
    #{}  -----> 表示类型和值  通常用来做条件  列的值
    ${}  -----> 表示的就是一个普通字串   "asc"   通常是表名  列名  关键字

Student

package domain;

import java.sql.Date;

public class Student {

    private Integer id;
    private String name;
    private Integer sex;
    private Integer birth;
    private Date ctime;

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex=" + sex +
                ", birth=" + birth +
                ", ctime=" + ctime +
                '}';
    }

    public Student() {
    }

    public Student(Integer id, String name, Integer sex, Integer birth, Date ctime) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.birth = birth;
        this.ctime = ctime;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public Integer getBirth() {
        return birth;
    }

    public void setBirth(Integer birth) {
        this.birth = birth;
    }

    public Date getCtime() {
        return ctime;
    }

    public void setCtime(Date ctime) {
        this.ctime = ctime;
    }
}

StudentDao

package dao;

import domain.Student;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

@SuppressWarnings("all")
public class StudentDao {


    //设计一个方法 查询所有学生 根据id进行排序 (升序、降序不一定)
    //  设计一个参数 排序的方式 String flag
    public List<Student> selectAllByOrder(String flag){//asc升序 desc降序
        //1.找寻sqlSession
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml"));
        SqlSession sqlSession = factory.openSession(true);
        //2让sqlSession干活
        return sqlSession.selectList("selectAllByOrder",flag);
    }


    //设计一个方法 根据给定的学生id 修改学生的性别  update student set sex = ? where id = ?
    //  是否需要参数? 学生学号 修改后的性别
    public void update(Map<String,Object> student){
        //1.找寻sqlSession对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml"));
        SqlSession sqlSession = factory.openSession(true);
        //2.让他干活
        sqlSession.update("update",student);//  1.SQL语句id号  2.SQL语句上的动态信息
        //  底层如何做事
        //  1.加载驱动  参考核心配置文件driver
        //  2.获取连接  参考核心配置文件url username password
        //  3.创建状态参数    pstat(sql)  参考mapper文件 通过我们给的sqlid 找到真正的SQL语句
        //  4.将SQL和问号动态信息拼接完整
        //      对象(sex id name)  反射类对象中的每一个属性名    分析SQL的每一个#{key}   匹配
        //  5.执行SQL操作
        //  6.如果是查询     分析resultType属性   底层通过反射创建一个对象   结果集中的信息存入对象内
    }









    //设计一个方法 根据sex分组 每一个组中的人数
    public List<Map<String,Object>> selectCountBySex(){
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml"));
        SqlSession sqlSession = factory.openSession(true);
        List<Map<String,Object>> result = sqlSession.selectList("selectCountBySex");
        return result;
    }

    //设计一个方法 根据编号查询对应的人名
    public String selectNameById(){//缺少一个参数id
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml"));
        SqlSession sqlSession = factory.openSession(true);
        String name = sqlSession.selectOne("selectNameById");
        return name;
    }

    //设计一个方法 查询表格中记录的个数
    public int selectCount(){
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml"));
        SqlSession sqlSession = factory.openSession(true);
        int ct = sqlSession.selectOne("selectCount");
        return ct;
    }


    //设计一个方法 查询表格中的全部内容
    public List<Student> selectAll(){
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml"));
        SqlSession sqlSession = factory.openSession(true);
        List<Student> studentList = sqlSession.selectList("selectAll");//SQL语句的id  SQL上面的问号信息  告知每一行记录存储的类型
        return studentList;
    }







    //设计一个方法 查询单条记录     读操作 携带返回值
    public Student selectOne(int id) {//应该需要参数  先固定
        //JDBC+SQL      告知SQL  告知SQL上面的问号信息(可以有 可以没有)  告知容器(一行记录)类型
        //加载驱动
        //获取连接
        //状态参数   conn.prepareStatement(sql);
        //将SQL和问号信息拼接完整
        //执行操作   ResultSet = executeQuery();
        //结果集中查询出来的信息 取出来存在一个新的容器内(数组 List Set Map domain)  结果集关掉啦
        //关闭操作   rs.close()   pstat.close()   conn.close();
        //返回那个新的容器

        //找寻sqlSession对象就可以啦
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");
        //InputStream inputStream = Resources.getResourceAsStream("configuration.xml");
        //下面第二种方式获取输入流  几个点需要大家注意
        //  1.Resources这个类是MyBatis框架提供   依赖度比较高
        //  2.方法与之前我们利用ClassLoader加载的方法名一致      框架提供的方法有异常必须处理
        SqlSessionFactory factory = builder.build(inputStream);
        SqlSession sqlSession = factory.openSession(true);
        //让sqlSession帮我们做事
        Student student = sqlSession.selectOne("selectOne",id);//1.SQL语句的id  SQL语句上面的问号信息(暂时没有)  查询完毕的结果装到什么容器里
        return student;
    }









    //设计一个方法 新增一条学生记录
    public void insert(){
        //JDBC流程----不需要我们写啦
        //MyBatis帮我们做操作

        //创建工人对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");
        //获取工厂对象
        SqlSessionFactory factory = builder.build(inputStream);//图纸 核心配置文件
        //获取提供的那个对象SqlSession
        SqlSession sqlSession = factory.openSession(true);//自动开启事务 自动提交  默认false 自动开启事务  不提交
        //帮我们执行数据库操作    增删改
        sqlSession.insert("insert");//加载驱动 获取连接(连接池) 创建状态参数

        //sqlSession.commit();
    }

}

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="dao.StudentDao">
    <insert id="insert">
        insert into student values(10,'zzt',1,1993,'2019-10-24')
    </insert>

    <select id="selectOne" resultType="domain.Student">
        select * from student where id = #{id}
    </select>

    <select id="selectAll" resultType="domain.Student">
        select * from student
    </select>

    <select id="selectCount" resultType="int">
        select count(*) as ct from student
    </select>

    <select id="selectNameById" resultType="string">
        select name from student where id = 1;
    </select>

    <select id="selectCountBySex" resultType="hashmap">
        select sex,count(*) as ct from student group by sex
    </select>



    <update id="update">
        update student set sex = #{sex} where id = #{id}  <--#{} 会根据传入参数的对象进行反射,然后根据属性类型进行类型修饰  比如传进来为String类型 会自动增加双引号-->
    </update>


    <select id="selectAllByOrder" resultType="domain.Student">
        select * from student order by id ${flag}       <--${} 传进来是啥就是啥  不会进行类型修饰-->
    </select>

</mapper>
上一篇下一篇

猜你喜欢

热点阅读