美文网首页
原生的增删改查带?号#{name}

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

作者: _FireFly_ | 来源:发表于2020-11-07 09:36 被阅读0次

    如何在操作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>
    

    相关文章

      网友评论

          本文标题:原生的增删改查带?号#{name}

          本文链接:https://www.haomeiwen.com/subject/vetavktx.html