美文网首页
Java和MySQL简建立连接

Java和MySQL简建立连接

作者: 爱吃胡萝卜的小白兔 | 来源:发表于2020-07-15 10:55 被阅读0次

JDBC

JDBC插入多条数据

package com.easy.view;

import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class Test6 {

    public static void main(String[] args) throws Exception {
        //如何插入多条数据,减少数据库的压力
        
        
        //4个数据源
        //1.驱动:连接数据库的一个不可或缺的类,可以在com.mysql.jdbc包下找到Driver这个类
        String driver = "com.mysql.jdbc.Driver";
        //2.jdbc连接数据库的路径
        String url = "jdbc:mysql://127.0.0.1:3306/myemployees";
        
        //3.用户名
        String userName = "root";
        //4.密码
        String psw = "123456";
        
        //五个执行步骤
        //1.加载驱动
        Class.forName(driver);
        
        //2.连接数据库
        //获取数据库连接
        //连接对象
        java.sql.Connection conn = DriverManager.getConnection(url, userName, psw);
        
        
        
        String selectSql = "insert into employees (last_name) values (?)";
        
        //3.预编译sql,获取预编译对象:预先编译,在执行之前编译成二进制
        PreparedStatement pre = conn.prepareStatement(selectSql);
        
        //Batch就是把所有的代码放在一块儿执行
        for (int i = 0; i < 10; i++) {
            //方法括号里面的1表示第一个?
            pre.setString(1, String.valueOf(i));
            pre.addBatch();
        }
        
        int[] i = pre.executeBatch();
        
        for (int j : i) {
            System.out.println(j);
        }
        
        conn.close();
    }
}

JDBC查询

package com.easy.view;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test6 {

    public static void main(String[] args) throws Exception {
        // 如何执行查询操作

        //4个数据源
        //1.驱动:连接数据库的一个不可或缺的类,可以在com.mysql.jdbc包下找到Driver这个类
        String driver = "com.mysql.jdbc.Driver";
        //2.jdbc连接数据库的路径
        String url = "jdbc:mysql://127.0.0.1:3306/myemployees";
        
        //3.用户名
        String userName = "root";
        //4.密码
        String psw = "123456";
        
        //五个执行步骤
        //1.加载驱动
        Class.forName(driver);
        
        //2.连接数据库
        //获取数据库连接
        //连接对象
        java.sql.Connection conn = DriverManager.getConnection(url, userName, psw);
        
        String selectSql = "select last_name, department_id from employees where employee_id = 104";
        
        //3.预编译sql,获取预编译对象:预先编译,在执行之前编译成二进制
        PreparedStatement pre =  conn.prepareStatement(selectSql);
        
        //4.执行查询操作
        ResultSet res = pre.executeQuery();
        //next相当于游标
        while(res.next()) {
            //String也可以写Object
            System.out.println(res.getString("last_name"));
            System.out.println(res.getObject("department_id"));
        }
        
        //5.关闭连接对象
        conn.close();
    }
}

JDBC动态传参

package com.easy.view;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test6 {

    public static void main(String[] args) throws Exception {
        //动态传参where
        
        
        //4个数据源
        //1.驱动:连接数据库的一个不可或缺的类,可以在com.mysql.jdbc包下找到Driver这个类
        String driver = "com.mysql.jdbc.Driver";
        //2.jdbc连接数据库的路径
        String url = "jdbc:mysql://127.0.0.1:3306/myemployees";
        
        //3.用户名
        String userName = "root";
        //4.密码
        String psw = "123456";
        
        //五个执行步骤
        //1.加载驱动
        Class.forName(driver);
        
        //2.连接数据库
        //获取数据库连接
        //连接对象
        java.sql.Connection conn = DriverManager.getConnection(url, userName, psw);
        
        String selectSql = "select last_name, department_id, salary from employees where last_name = ? or year = ?";
        
        //3.预编译sql,获取预编译对象:预先编译,在执行之前编译成二进制
        PreparedStatement pre =  conn.prepareStatement(selectSql);
        pre.setString(1, "Ernst");
        pre.setInt(2, 50);

        //4.执行查询操作
        ResultSet res = pre.executeQuery();
        //next相当于游标
        while(res.next()) {
            //String也可以写Object
            System.out.println(res.getString("last_name"));
            System.out.println(res.getObject("department_id"));
            System.out.println(res.getObject("salary"));
        }
        
        //5.关闭连接对象
        conn.close();
    }
}

JDBC回滚

package com.easy.view;

import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class Test6 {

    public static void main(String[] args) throws Exception {
        //关闭自动提交,使用rollback
        //4个数据源
        //1.驱动:连接数据库的一个不可或缺的类,可以在com.mysql.jdbc包下找到Driver这个类
        String driver = "com.mysql.jdbc.Driver";
        //2.jdbc连接数据库的路径
        String url = "jdbc:mysql://127.0.0.1:3306/myemployees";
        
        //3.用户名
        String userName = "root";
        //4.密码
        String psw = "123456";
        
        //五个执行步骤
        //1.加载驱动
        Class.forName(driver);
        
        //2.连接数据库
        //获取数据库连接
        //连接对象
        java.sql.Connection conn = DriverManager.getConnection(url, userName, psw);
        
        //默认自动提交,修改为手动提交
        conn.setAutoCommit(false);
        
        String sql = "delete from employees where employee_id = ?";
        
        //3.预编译sql,获取预编译对象:预先编译,在执行之前编译成二进制
        PreparedStatement pre =  conn.prepareStatement(sql);
        pre.setInt(1, 104);
        //4.拿到数据库里执行
        //i:在数据库内执行了多少条数据
        int i = pre.executeUpdate();
        
        System.out.println(i);
        
        conn.rollback();
        //5.关闭连接对象
        conn.close();
    }
}

JDBC将数据库中的信息装入List

package com.easy.view;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class Test6 {

    public static void main(String[] args) throws Exception {
        //如何将数据库中的数据装入List
        
        //4个数据源
        //1.驱动:连接数据库的一个不可或缺的类,可以在com.mysql.jdbc包下找到Driver这个类
        String driver = "com.mysql.jdbc.Driver";
        //2.jdbc连接数据库的路径
        String url = "jdbc:mysql://127.0.0.1:3306/myemployees";
        
        //3.用户名
        String userName = "root";
        //4.密码
        String psw = "123456";
        
        //五个执行步骤
        //1.加载驱动
        Class.forName(driver);
        
        //2.连接数据库
        //获取数据库连接
        //连接对象
        java.sql.Connection conn = DriverManager.getConnection(url, userName, psw);
        
        String selectSql = "select last_name, department_id, salary from employees";
        
        //3.预编译sql,获取预编译对象:预先编译,在执行之前编译成二进制
        PreparedStatement pre = conn.prepareStatement(selectSql);
        
        //4.执行查询操作
        ResultSet res = pre.executeQuery();
        
        List<Employees> list = new ArrayList<Employees>();
        //next相当于游标
        while(res.next()) {
            Employees employees = new Employees();
            employees.setLast_name(res.getString("last_name"));
            list.add(employees);
        }
        for (Employees employees : list) {
            System.out.println(employees.getLast_name());
        }
        System.out.println(list);
        
        //5.关闭连接对象
        conn.close();
    }
}

JDBC模糊查询

package com.easy.view;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test6 {

    public static void main(String[] args) throws Exception {
        // 如何进行模糊查询
        
        
        //4个数据源
        //1.驱动:连接数据库的一个不可或缺的类,可以在com.mysql.jdbc包下找到Driver这个类
        String driver = "com.mysql.jdbc.Driver";
        //2.jdbc连接数据库的路径
        String url = "jdbc:mysql://127.0.0.1:3306/sale";
        
        //3.用户名
        String userName = "root";
        //4.密码
        String psw = "123456";
        
        //五个执行步骤
        //1.加载驱动
        Class.forName(driver);
        
        //2.连接数据库
        //获取数据库连接
        //连接对象
        java.sql.Connection conn = DriverManager.getConnection(url, userName, psw);
        
        String name = "金";
        //这种写法不常用
//      String selectSql = "select username from user where username like '%" + name + "%'";
        
        
        String selectSql = "select username from user where username like ?";
        
        //3.预编译sql,获取预编译对象:预先编译,在执行之前编译成二进制
        PreparedStatement pre = conn.prepareStatement(selectSql);
        
        pre.setString(1, "%" + name + "%");

        //4.执行查询操作
        ResultSet res = pre.executeQuery();
        //next相当于游标
        while(res.next()) {
            //String也可以写Object
            System.out.println(res.getString("username"));
        }
        
        //5.关闭连接对象
        conn.close();
    }
}

JDBC如何写多条SQL语句

package com.easy.view;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test6 {

    public static void main(String[] args) throws Exception {
        //如何在1个JDBC中写入多个SQL语句
        //4个数据源
        //1.驱动:连接数据库的一个不可或缺的类,可以在com.mysql.jdbc包下找到Driver这个类
        String driver = "com.mysql.jdbc.Driver";
        //2.jdbc连接数据库的路径
        String url = "jdbc:mysql://127.0.0.1:3306/school";
        
        //3.用户名
        String userName = "root";
        //4.密码
        String psw = "123456";
        
        //五个执行步骤
        //1.加载驱动
        Class.forName(driver);
        
        //2.连接数据库
        //获取数据库连接
        //连接对象
        java.sql.Connection conn = DriverManager.getConnection(url, userName, psw);
        
        String sql = "select * from student where classid = ?";
        String sql2 = "select * from teacher where class_id = ?";
        
        //3.预编译sql,获取预编译对象:预先编译,在执行之前编译成二进制
        PreparedStatement pre = conn.prepareStatement(sql);
        PreparedStatement pre2 = conn.prepareStatement(sql2);
        pre.setInt(1, 1);
        pre2.setInt(1, 1);
        
         //4.执行查询操作
         ResultSet res = pre.executeQuery();
         ResultSet res2 = pre2.executeQuery();
                
        //next相当于游标
                while(res.next()) {
                    System.out.println(res.getObject("name"));
                }
                while(res2.next()) {
                    System.out.println(res2.getObject("name"));
                }
        //5.关闭连接对象
        conn.close();
    }
}

JDBC如何用res.nex()判断是否在数据库中有重复的值

package com.easy.view;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test6 {

    public static void main(String[] args) throws Exception {
        // 如何用res.next()判断是否重复
        
        //4个数据源
        //1.驱动:连接数据库的一个不可或缺的类,可以在com.mysql.jdbc包下找到Driver这个类
        String driver = "com.mysql.jdbc.Driver";
        //2.jdbc连接数据库的路径
        String url = "jdbc:mysql://127.0.0.1:3306/sale";
        
        //3.用户名
        String userName = "root";
        //4.密码
        String psw = "123456";
        
        //五个执行步骤
        //1.加载驱动
        Class.forName(driver);
        
        //2.连接数据库
        //获取数据库连接
        //连接对象
        java.sql.Connection conn = DriverManager.getConnection(url, userName, psw);
        
        String selectSql = "select username from user where username = '刘吉'";
        
        //3.预编译sql,获取预编译对象:预先编译,在执行之前编译成二进制
        PreparedStatement pre =  conn.prepareStatement(selectSql);
        
        //4.执行查询操作
        ResultSet res = pre.executeQuery();
        //next相当于游标
        //res.next()就是查看sql语句的查询结果,如果有值,则返回true;如果没有,则返回false
        if (res.next()) {
            System.out.println("用户名重复");
        }
        else {
            System.out.println("用户名不重复");
        }
        
        
        //5.关闭连接对象
        conn.close();
    }
}

JDBC手动提交

package com.easy.view;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test6 {

    public static void main(String[] args) throws Exception {
        //关闭自动提交
        //4个数据源
        //1.驱动:连接数据库的一个不可或缺的类,可以在com.mysql.jdbc包下找到Driver这个类
        String driver = "com.mysql.jdbc.Driver";
        //2.jdbc连接数据库的路径
        String url = "jdbc:mysql://127.0.0.1:3306/myemployees";
        
        //3.用户名
        String userName = "root";
        //4.密码
        String psw = "123456";
        
        //五个执行步骤
        //1.加载驱动
        Class.forName(driver);
        
        //2.连接数据库
        //获取数据库连接
        //连接对象
        java.sql.Connection conn = DriverManager.getConnection(url, userName, psw);
        //默认自动提交
        conn.setAutoCommit(false);
        
        String sql = "delete from employees where employee_id = ?";
        
        //3.预编译sql,获取预编译对象:预先编译,在执行之前编译成二进制
        PreparedStatement pre =  conn.prepareStatement(sql);
        pre.setInt(1, 121);
        //4.拿到数据库里执行
        //i:在数据库内执行了多少条数据
        int i = pre.executeUpdate();
        
        System.out.println(i);
        
        conn.commit();
        //5.关闭连接对象
        conn.close();
    }
}

JDBC增删改

package com.easy.view;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test6 {

    public static void main(String[] args) throws Exception {
        //如何执行增删改的操作
        //4个数据源
        //1.驱动:连接数据库的一个不可或缺的类,可以在com.mysql.jdbc包下找到Driver这个类
        String driver = "com.mysql.jdbc.Driver";
        //2.jdbc连接数据库的路径
        String url = "jdbc:mysql://127.0.0.1:3306/myemployees";
        
        //3.用户名
        String userName = "root";
        //4.密码
        String psw = "123456";
        
        //五个执行步骤
        //1.加载驱动
        Class.forName(driver);
        
        //2.连接数据库
        //获取数据库连接
        //连接对象
        java.sql.Connection conn = DriverManager.getConnection(url, userName, psw);
        
        String sql = "delete from employees where employee_id = 120";
        
        //3.预编译sql,获取预编译对象:预先编译,在执行之前编译成二进制
        PreparedStatement pre =  conn.prepareStatement(sql);
        
        //4.拿到数据库里执行
        //i:在数据库内执行了多少条数据
        int i = pre.executeUpdate();
        
        System.out.println(i);
        //5.关闭连接对象
        conn.close();
    }
}

MyBatis

main方法里面写

//获取一个sql的会话,连接数据库
SqlSession sqlSession = MyBatisTools.getSqlSession();

//获取接口对象,以class结尾
//Mapper叫作映射
EmployeesMapper emp = sqlSession.getMapper(EmployeesMapper.class);

//中间用emp就可以调用EmployeesMapper接口里面的方法

//提交:Mybatis不是自动提交
sqlSession.commit();
//关闭会话
sqlSession.close();

查询最高工资

//⑤查询部门最高工资,取出的max(salary)不可能用一个属性来接,因此定义int类型就好了
    int selectMaxsalary();

<!-- //⑤查询部门最高工资,取出的max(salary)不可能用一个属性来接,因此定义int类型就好了 -->
    <select id = "selectMaxsalary" resultType = "java.lang.Integer">
        select max(salary) from employees;
    </select>

//      int i = emp.selectMaxsalary();
//      System.out.println(i);

传多个参数用对象

//④传多个参数,用对象。保证实体类里面的属性和数据库中表的字段名一致
    Employees selectBysalaryAndyear(Employees employees);

    <!-- //④传多个参数,用对象 -->
    <select id = "selectBysalaryAndyear"  parameterType = "com.easyup.model.Employees" resultType = "com.easyup.model.Employees">
        <!-- {}里面写实体类里面属性的名字 -->
        select last_name from employees where salary = #{salary} and year = #{year};
    </select>

Employees employees = new Employees();
//      employees.setYear(22);
//      employees.setSalary(42000);
//      Employees i = emp.selectBysalaryAndyear(employees);
//      System.out.println(i.getLast_name());

动态SQL

    //⑥动态SQL
    //(1)where if,可以省略前面的and
    List<Employees> selectByNameAndJobId(Employees emp);
    //(2)set if:可以省略掉后面的逗号
    int updateLastName(Employees emp);
    //(3)foreach————SQL:list(1,2,3,4):遍历集合
    List<Employees> selectEmpByids(List<Integer> ids);
    //(4)<sql><include>标签可以将select后面要查询的语句重复使用,不必每次都写
    Employees selectEmpById(Employees emp);


<!-- //⑥动态SQL
    //(1)where if,可以省略前面的and -->
    <select id = "selectByNameAndJobId" resultType = "com.easyup.model.Employees">
        select last_name, job_id
        from employees
        <where>
        <!-- where if 是去掉字if里面前面的and的,但是不能删除if里面后面的and -->
        <!-- where if 至少传入一个参数 -->
        
            <if test = "last_name != null and last_name != ''">
                last_name = #{last_name}
            </if>
            
            <if test= "job_id != null and job_id != ''">
                and job_id = #{job_id}
            </if>
        </where>
    </select>


    <!-- //(2)set if:可以省略掉后面的逗号 -->
    <update id = "updateLastName" >
        update employees
        <!--  删除语句后面的逗号 -->
        <set>
            <if test = "last_name != null and last_name != ''">
                last_name = #{last_name},
            </if >
            
            <if test= "job_id != null and job_id != ''">
                job_id = #{job_id}
            </if>
        </set>
        where employee_id = #{employee_id}
    </update>
    
    <!-- //(3)foreach————SQL:list(1,2,3,4):遍历集合 -->
    <!-- 此处参数是int类型的集合,可以写参数也可以不写 -->
    <select id = "selectEmpByids" parameterType = "java.lang.Integer" resultType = "com.easyup.model.Employees">
        select last_name
        from employees
        where employee_id
        in
        <!-- item表示in()里面的内容 -->
        <foreach collection = "list" open = "(" close = ")" separator = "," item = "item">
            #{item}
        </foreach>
    </select>
    
    
    <!-- //(4)<sql><include>标签可以将select后面要查询的语句重复使用,不必每次都写 -->
    <sql id = "empSql">
    last_name, job_id, salary, employee_id, year
    </sql>

    <select id = "selectEmpById" parameterType = "com.easyup.model.Employees"  resultType = "com.easyup.model.Employees">
        select 
        <include refid = "empSql"></include>
        from employees
        where employee_id = #{employee_id}
    </select>


//      Employees empl = new Employees(); 
        
        //where if方法的调用
//      empl.setLast_name("Ernst");
//      empl.setJob_id("IT_PROG");
        
//      List<Employees> list = emp.selectByNameAndJobId(empl);
//      for (Employees employees : list) {
//          System.out.println(employees.getLast_name());
//          System.out.println(employees.getJob_id());
//      }
        
        //set if方法的调用
//      empl.setLast_name("Pataballa11111");
//      empl.setEmployee_id(106);
//      int i = emp.updateLastName(empl);
//      System.out.println(i);
        
        //foreach方法的调用
//      List<Integer> list = new ArrayList<Integer>();
//      list.add(105);
//      list.add(106);
//      list.add(107);
//      list.add(108);
//      List<Employees> selectEmpByids = emp.selectEmpByids(list);
//      for (Employees employees : selectEmpByids) {
//          System.out.println(employees.getLast_name());
//      }
        
        //<include>方法的调用
//      empl.setEmployee_id(105);
//      Employees selectEmpById = emp.selectEmpById(empl);
//      System.out.println(selectEmpById);

动态传参需要写入参数

//③动态传参需要写入参数
    Employees selectById(int employee_id);


<!-- //③动态传参需要写入参数 -->
    <!-- 动态传参 -->
    <select id = "selectById"  parameterType = "java.lang.Integer" resultType = "com.easyup.model.Employees">
        <!-- {}里面写实体类里面属性的名字,或者参数的名字 -->
        select last_name from employees where employee_id = #{employee_id};
    </select>


//查看一个字段的单个信息
//      Employees employees= emp.selectById(108);
//      System.out.println(employees.getLast_name());

多表查询:一对多

    //多表查询:查询一个表和另一个表中相同字段有相同值,因此主表也有多个值,需要用List来接
    //(2)一对多
    List<Departments> selectDepEmp();


    <!-- //(2)一对多 -->
    <resultMap type = "com.easyup.model.Departments" id = "DepMap">
        <result column = "department_name" property = "departmentName"/>
        <collection property = "empList" ofType = "com.easyup.model.Employees">
            <result column = "last_name" property = "lastName"/>
        </collection>
    </resultMap>

    <select id = "selectDepEmp" resultMap = "DepMap">
        select departments.department_name, employees.last_name
        from departments, employees
        where departments.department_id = employees.department_id;
    </select>


        //一对多
//      List<Departments> list = dep.selectDepEmp();
//      for (Departments d : list) {
//          System.out.println(d.getDepartmentName());
//          for (Employees e : d.getEmpList()) {
//              System.out.println(e.getLastName());
//          }
//      }

多表查询:一对一

    //⑨多表查询
    //(1)一对一:两张表分别由同一字段。要明白是从谁出发去找谁。
    //注意事项:①分清楚多表查询中的一对一和懒加载的一对一的区别:多表查询的一对一只需在该类中有另外一个类的变量,②如果
    //从employees找card
    List<Employees> selectCard();
    //从card找employees
    List<Card> selectCardEmp();


    <!-- //⑨多表查询 -->
    <!-- //(1)一对一:两张表分别由同一字段。要明白是从谁出发去找谁。 -->
    <!-- 从Employees去取Card -->
    <resultMap type = "com.easyup.model.Employees" id = "EmpCard">
        <result column = "last_name" property = "lastName"/>
        <!-- 一对一的关系 -->
        <!-- 从员工表出发,和card是一对一的关系 -->
        <association property = "card" javaType = "com.easyup.model.Card">
            <result column = "card_num" property = "num"/>
        </association>
    </resultMap>
    
    <select id = "selectCard" resultMap = "EmpCard">
        select employees.last_name, card.card_num, employees.salary
        from employees,card
        where employees.card_id = card.id;
    </select>
    
    
    <!-- 从Card去取Employees -->
    <resultMap type = "com.easyup.model.Card" id = "CardEmp">
        <result column = "card_num" property = "num"/>
        <result column = "id" property = "Id"/>
        <!-- 一对一的关系 -->
        <!-- 从员工表出发,和card是一对一的关系 -->
        <!-- association里面的property写的是Employees里面的一个成员变量 -->
        <association property = "employees" javaType = "com.easyup.model.Employees">
            <result column = "last_name" property = "lastName"/>
            <result column = "salary" property = "salary"/>
            <result column = "year" property = "year"/>
            <result column = "employee_id" property = "employee_id"/>
        </association>
    </resultMap>
    
    <select id = "selectCardEmp" resultMap = "CardEmp">
        select employees.last_name, card.card_num, employees.salary, employees.year, employees.employee_id
        from employees,card
        where employees.card_id = card.id;
    </select>


        //从员工表找Card
//      List<Employees> selectCard = emp.selectCard();
//      for (Employees employees : selectCard) {
//          System.out.println(employees);
//      }
        
        //从Card找员工表
//      List<Card> selectCardEmp = emp.selectCardEmp();
//      
//      for (Card card : selectCardEmp) {
//          System.out.println(card);
//      }

刚插入一条数据,取出id

    //⑩刚插进去一条信息,然后取出主键:只能用于使用对象作为参数的情况
    int insertEmp(Employees emp);


    <!-- //⑩刚插进去一条信息,然后取出主键 -->
    <insert id = "insertEmp" parameterType = "com.easyup.model.Employees">
        <selectKey order = "AFTER" resultType = "java.lang.Integer" keyProperty = "employee_id">
            //固定方法名
            select last_insert_id()
        </selectKey>
            insert into employees
            (last_name) values (#{lastName})
    </insert>


        //向数据库中添加数据,然后马上取到对应的主键
//      Employees employees = new Employees();
//      employees.setLastName("小明33333333333");
//      int insertEmp = emp.insertEmp(employees);
//      System.out.println("执行了:" + insertEmp);
//      System.out.println("id:" + employees.getEmployee_id());

高级映射

    //⑦高级映射
    //增删改不需要结果集映射,只有查询的时候需要用到结果集映射
    Employees selectById11();


    <!-- //⑦高级映射 -->
    <!--//增删改不需要结果集映射,只有查询的时候需要用到结果集映射 -->
    <resultMap type = "com.easyup.model.Employees" id = "empMap">
        <result column = "last_name" property = "lastName"/>
    </resultMap>
    <select id = "selectById11" resultMap = "empMap">
        select <include refid = "empSql"></include>
        from employees 
        where employee_id = 108;
    </select>


//      Employees selectById11 = emp.selectById11();
//      System.out.println(selectById11);

懒加载,一对一

//懒加载,又叫延迟加载、按需加载
//把多表查询,拆成单表查询,比如从员工表找card表,只有调用getcard的时候才会去查card表
//注意事项:①Employees里面要有Card类型的card;②主查询要查询那个与子查询相关联的字段;③子查询的参数要写与主查询相关联的字段;④log文件要放在src的目录下

    //主查询的方法定义
    Employees selectCardlazy(@Param("empId")int employeeId);


    //主查询的XML
    <resultMap type = "com.easyup.model.Employees" id = "cc">
        <result column = "last_name" property = "lastName"/>
        <association property = "card" javaType = "com.easyup.model.Card"
        select = "com.easyup.mapper.CardMapper.selectCard" column = "card_id"
        fetchType = "lazy">
        </association>
    </resultMap>
    
    
    <select id = "selectCardlazy" resultMap = "cc">
        select last_name,card_id
        from employees
        where employee_id = #{empId}
    </select>


    //子查询的方法定义
    Card selectCard(@Param("id")int id);



    //子查询的XML
    <resultMap type = "com.easyup.model.Card" id = "aa">
        <result column = "id" property = "Id"/>
        <result column = "card_num" property = "num"/>
    </resultMap>

    <select id = "selectCard" resultMap = "aa">
        select id,card_num
        from card
        where id = #{id}
    </select>


        //调用方法
        Employees selectCardlazy = emp.selectCardlazy(104);
//      System.out.println(selectCardlazy.getLastName());
        System.out.println(selectCardlazy.getCard().getNum());

懒加载:一对多

//懒加载:一对多
//注意事项:①department类里面要有employees泛型的List;②collection里面的property要写empList;③子查询的筛选条件要写与主查询相关联的字段;④log文件要放在src的目录下

//从department查员工表,用懒加载
Departments selectFromDepToEmp(@Param("depId")int depId);


<resultMap type = "com.easyup.model.Departments" id = "Deplazy">
<result column = "department_name" property = "departmentName"/>
<result column = "department_id" property = "departmentId"/>
<collection property="empList" ofType = "com.easyup.model.Employees"
select = "com.easyup.mapper.EmployeesMapper.selectFromDepToEmp" column = "department_id"
fetchType = "lazy"
></collection>
</resultMap>

<select id = "selectFromDepToEmp" resultMap = "Deplazy">
    select department_name, department_id
    from departments
    where department_id = #{depId}
</select>


//从部门表找员工表的懒加载
List<Employees> selectFromDepToEmp(@Param("depId")int depId);


<resultMap type = "com.easyup.model.Employees" id = "hh">
    <result column = "last_name" property = "lastName"/>
</resultMap>

<select id = "selectFromDepToEmp" resultMap = "hh">
    select last_name
    from employees
    where department_id = #{depId}
</select>


    Departments selectFromDepToEmp = dep.selectFromDepToEmp(60);
    System.out.println(selectFromDepToEmp.getDepartmentName());
    
    for(Employees employees : selectFromDepToEmp.getEmpList()) {
        System.out.println(employees.getLastName());
    }

懒加载:一对多对一

//根据job_id可以找到多个员工
//接口中的方法定义
List<Jobs> selectJobsEmpLazy(@Param("jobId")String jobId);

//XML的写法
<resultMap type = "com.easyup.model.Jobs" id = "ff">
    <result column = "job_id" property = "jobId"/>
    <result column = "job_title" property = "jobTitle"/>
    <collection property = "empList" ofType = "com.easyup.model.Employees"
        select = "com.easyup.mapper.EmployeesMapper.selectFromJobsToEmployees" column = "job_id"
        fetchType = "lazy">
    </collection>
</resultMap>

<select id = "selectJobsEmpLazy" resultMap = "ff">
    select job_id, job_title
    from jobs
    where job_id = #{jobId}
</select>



//从Jobs表找员工表的懒加载
//方法的定义
List<Employees> selectFromJobsToEmployees(@Param("JobId")String jobId);
//XML的写法
<resultMap type = "com.easyup.model.Employees" id = "gg">
    <result column = "last_name" property = "lastName"/>
    <result column = "salary" property = "salary"/>
    <result column = "employee_id" property = "employee_id"/>
    <association property = "jobGrades" javaType = "com.easyup.model.JobGrades"
    select = "com.easyup.mapper.JobGradesMapper.selectSalaryLevel" column = "salary"
    fetchType = "lazy">
    </association>
</resultMap>

<select id = "selectFromJobsToEmployees" resultMap = "gg">
    select last_name, salary
    from employees
    where job_id = #{jobId}
</select>


//根据查到的员工的工资,去工资登记表里面查对应的工资等级
//方法的定义
JobGrades selectSalaryLevel(@Param("salary")int salary);

//XML的写法
<resultMap type = "com.easyup.model.JobGrades" id = "kk">
    <result column = "grade_level" property = "gradeLevel"/>
</resultMap>

<select id = "selectSalaryLevel" resultMap = "kk">
    select grade_level
    from job_grades
    where #{salary} between lowest_sal and highest_sal
</select>


    //main方法的写法
    //用jobs查员工表一对多
    List<Jobs> selectJobsEmpLazy = job.selectJobsEmpLazy("IT_PROG");
    for (Jobs jobs : selectJobsEmpLazy) {
        System.out.println(jobs.getJobId() + "  " + jobs.getJobTitle());
        for (Employees ee : jobs.getEmpList()) {
            System.out.println(ee.getLastName() + "  " + ee.getSalary());
            System.out.println(ee.getJobGrades().getGradeLevel());
        }
    }

模糊查询

    //⑧模糊查询
    //(1)老师教的第一种
    List<Employees> selectLike(String name);
    //(2)我们的第二种
    List<Employees> selectLikeName(String name);


    <!-- //⑧模糊查询-->
    <!-- //(1)老师教的第一种 -->
    <select id = "selectLike" parameterType = "java.lang.String" resultMap = "empMap">
        select last_name
        from employees
        where last_name like concat('%', #{name}, '%');
    </select>
    
    <!-- //(2)我们的第二种 -->
    <select id = "selectLikeName" parameterType = "java.lang.String" resultMap = "empMap">
        select <include refid = "empSql"></include>
        from employees
        where last_name like #{lastName};
    </select>


//      List<Employees> selectLike = emp.selectLike("Er");
//      for (Employees employees : selectLike) {
//          System.out.println(employees);
//      }
        
//      String name = "sti";
//      List<Employees> selectLikeName = emp.selectLikeName("%" + name + "%");
//      for (Employees employees : selectLikeName) {
//          System.out.println(employees);

取出一个表中一个字段所有的数据要用List来接

//②取出一个表中一个字段所有的数据要用List来接
    List<Employees> selectAll();


<!-- //②取出一个表中一个字段所有的数据要用List来接 -->
    <!-- 查询所有信息的时候不能写* -->
    <select id = "selectAll" resultType = "com.easyup.model.Employees">
        select last_name from employees;
    </select>


//查看一个字段的所有信息
//      List<Employees> list = emp.selectAll();
//      
//      for (Employees employees : list) {
//          System.out.println(employees.getLast_name());
//      }

增删改

    //①增删改的返回值l类型都是int
    int add();
    int delete();
    int update();


    <!-- id表示和哪一个方法进行联系 -->
    <!-- //①增删改的返回值都是int -->
    <insert id = "add">
        insert into employees (last_name)
        values ('小明22222222')
    </insert>
    
    <delete id = "delete">
        delete from employees where employee_id = 152;
    </delete>
    
    <update id = "update">
        update employees set last_name = '大吉哥' where employee_id = 152;
    </update>


//调用接口里面的方法,并接取返回值
//      int i = emp.add();
//      int j = emp.update();
//      int k = emp.delete();

注解查询:查询(一个参数,多个参数均可)

//注解查询:查询一个字段
@Select("select id, card_num from card where id = #{id}")
@Results({
    @Result(column = "card_num", property = "num")
})
Card selectCardId(@Param("id")int id);


    //查询
//      Card selectCardId = car.selectCardId(1);
//      System.out.println(selectCardId.getNum());


//注解查询:查询多个字段
@Select("select employee_id, last_name, salary, year, job_id from employees where employee_id = #{employee_id}")
@Results({
    @Result(column = "employee_id", property = "employee_id"),
    @Result(column = "last_name", property = "lastName"),
    @Result(column = "salary", property = "salary"),
    @Result(column = "year", property = "year"),
    @Result(column = "job_id", property = "job_id")
})
Employees selectemployees(@Param("employee_id") int employee_id);


//      Employees selectemployees = emp.selectemployees(104);
//      System.out.println(selectemployees);

注解查询:多个参数,一半注解,一半XML

//注解查询:多个参数,一半注解,一半XML
int insertEmp1(@Param("salary") int salary, @Param("lastName")String last_name);


<insert id = "insertEmp1">
        insert into employees
        (last_name, salary) values (#{lastName}, #{salary})
</insert>


//      int insertEmp1 = emp.insertEmp1(80000, "小花1111111111");
//      System.out.println(insertEmp1);

注解查询:增删改(无参)

    //注解查询
    @Insert("insert into card (card_num) values (211302)")
    int insertCard();
    
    @Delete("delete from card where card_num = 211302")
    int deleteCard();
    
    @Update("update card set card_num = 777 where id = 3")
    int updateCard();


        //注解查询:添加数据
//      int insertCard = car.insertCard();
//      System.out.println(insertCard);
        
        //注解查询:删除数据
//      int deleteCard = car.deleteCard();
//      System.out.println(deleteCard);
        
        //注解查询:更新数据
//      int updateCard = car.updateCard();
//      System.out.println(updateCard);

注解查询:增删改:多个参数

    //多个参数的写法:
    //更新
    @Update("update card set card_num = #{num} where id = #{id}")
    int updateCard2(@Param("id") int id, @Param("num") int num);
    //删除
    @Delete("delete from card where id = #{id} and card_num = num")
    int deleteCard2(@Param("id") int id, @Param("num") int num);
    //添加
    @Insert("insert into card (id, card_num) values (#{id}, #{num})")
    int insertCard3(@Param("id") int id, @Param("num") int num);


        //多个参数
        //更新
//      int updateCard2 = car.updateCard2(1, 1111111111);
//      System.out.println(updateCard2);

注解查询:增删改:使用对象动态传参

    //动态传参:使用对象
    //更新
    @Update("update card set card_num = #{num} where id = #{id}")
    int updateCard1(Card card);
    //删除
    @Delete("delete from card where id = #{id}")
    int deleteCard1(Card card);
    //添加
    @Insert("insert into card (card_num) values (#{num})")
    int insertCard1(Card card);


        //注解查询——动态传参:更新数据
//      Card card = new Card();
//      card.setId(1);
//      card.setNum(9);
//      int updateCard1 = car.updateCard1(card);
//      System.out.println(updateCard1);
        
        //注解查询——动态传参:删除数据
//      Card card = new Card();
//      card.setId(3);
//      int deleteCard1 = car.deleteCard1(card);
//      System.out.println(deleteCard1);
        
        //注解查询——动态查询:添加数据
//      Card card = new Card();
//      card.setNum(1203);
//      int insertCard1 = car.insertCard1(card);
//      System.out.println(insertCard1);

存储过程

INOUT参数的使用以及PLSQL

-- 传入一个参数,如果大于3则返回100,否则返回500
-- 用户变量作用于当前会话,局部变量作用于begin和end之间
-- INOUT的使用
delimiter $$
create procedure my_pro8(INOUT in_param varchar(20))
begin
    declare param varchar(20);
    if in_param > 3
    then set param := 100;
    else set param := 500;
    end if;
    
    set in_param := param;

end $$
delimiter ;

set @param = 3;
call my_pro8(@param);

select @param;



-- PLSQL while
-- PLSQL:过程语言,在存储过程中使用的语言,也就是和Java一样有循环、分支这些语句,但是很少用到

delimiter $$
create procedure my_pro11_while()
begin
    declare i int;
    set i := 0;
    
    while i < 10 do
    
    insert into boss (name) values (i);
        set i = i + 1;
        end while;


end $$
delimiter ;

call my_pro11_while();

select *
from boss;

既有输入又有输出参数的存储过程

-- 输出模式

delimiter $$
create procedure my_por2( IN in_param  varchar(30),
                 OUT out_param varchar(30))
-- 存储过程体
begin
-- 查询员工表中id为103号员工的信息
select last_name into out_param
from employees
where employee_id = in_param;
end $$
delimiter ;


set @param := null;
call my_por2(103, @param);

select @param;

有多个输出参数的存储过程

-- 如果要返回一行多列的数据 
delimiter $$
create procedure my_por5( IN in_param  varchar(30),
              OUT out_param varchar(30),
                          OUT out_param1 varchar(30),
                          OUT out_param2 varchar(30))

begin
select d.department_name, d.department_id, d.location_id   into out_param, out_param1, out_param2
from employees as e inner join departments as d
on e.department_id = d.department_id
and e.last_name = in_param;
end $$
delimiter ;

set @my_out1 := null;
set @my_out2 := null;
set @my_out3 := null;
call my_por5('Hunold', @my_out1, @my_out2, @my_out3);

select @my_out1, @my_out2,@my_out3;

只有输入参数的存储过程

delimiter $$
create procedure my_por1( IN in_param  varchar(30))
-- 存储过程体
begin
-- 查询员工表中id为103号员工的信息
select *
from employees
where employee_id = in_param;
end $$
delimiter ;

-- 调用存储过程
call my_por1(103);

子查询

from后子查询

-- from后子查询:子句当成一个表来使用,要有字段名字和表名
-- 一般将分组查询的表格作为from后子查询的子表
-- select后子查询,两表之间的关联写在子句里面,from后子查询两表之间的关联写在外面

-- 每个部门的平均工资的工资等级
select *
from (select avg(salary) as ag
from employees
group by department_id) as ag_emp inner join job_grades as j
on ag_emp.ag between j.lowest_sal and j.highest_sal;


-- 查询员工工资比本部门平均工资高(不包含临界值)的员工的员工号,姓名和工资
SELECT employee_id,last_name,salary,e.department_id
FROM employees e
INNER JOIN (
    SELECT AVG(salary) ag,department_id
    FROM employees
    GROUP BY department_id
) ag_dep
ON e.department_id = ag_dep.department_id
WHERE salary > ag_dep.ag;

select后子查询

-- select后子查询:子句当成一个字段来使用

-- 利用部门表查询每个部门的员工个数、部门编号、部门名称
select d.department_id, d.department_name, 
(select count(employee_id)
from employees
where d.department_id = employees.department_id)
from departments as d;

标量子查询

-- 标量子查询:子查询的结果是一个标量
-- 查询工资比105号员工高的所有人信息

select *
from employees
where salary > (select salary
from employees
where employee_id = 105);

行子查询

-- 行子查询:子句返回结果集是一行多列
-- 行子查询可以使用等号,但是不可以使用大于、大于等于、小于、小于等于这类符号
-- 查询与103号年龄和工资都相同的人的信息alter

select *
from employees
where (year, salary) =
(select year, salary
from employees
where employee_id = 1);

列子查询

-- 列子查询:子查询的结果是一列多行
-- 查询比103号或104号员工高的员工的信息

select *
from employees
where salary > any(select salary
from employees
where employee_id in(103,104));

相关子查询

-- 相关子查询:子句有值的话返回true,主句才会进行比对和显示。如果为空的话就不会显示。
-- 相关子查询的子表写在where后面
-- 相关子查询的效率特别高,输出只有两个布尔值,ture和false

-- 查询部门表是否存在年龄大于21岁的员工,如果存在则输出该部门的信息。
select *
from departments
where exists (
select *
from employees
where employees.department_id = departments.department_id
and year > 21
);

其它

不等值内连接

-- 不等值内连接
-- 查询员工所对应的工资等级alter
select j.grade_level,e.last_name
from employees as e inner join job_grades as j
on e.salary between j.lowest_sal and j.highest_sal
and e.last_name = 'Hunold';

将数据按照第一个排序,如果第一个相同的情况下按照第二个排序

select * 
from rank 
order by times asc, time asc;

游标的使用

-- 游标

DELIMITER $$
create PROCEDURE my_pro12()
begin
-- 声明一个标志done, 用来判断游标是否遍历完
DECLARE done INT DEFAULT 0;
-- 声明一个变量,用来存放从游标中提取的数据
-- 特别注意这里的名字不能与由游标中使用的列明相同,
-- 否则得到的数据都是NULL
DECLARE lastName varchar(30) DEFAULT NULL;
DECLARE salaryParam int DEFAULT NULL;
-- 声明游标对应的 SQL 语句
DECLARE cur CURSOR FOR
select last_name, salary from employees;
-- 在游标循环到最后会将 done 设置为 1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 执行查询
open cur;
-- 遍历游标每一行
REPEAT
-- 把一行的信息存放在对应的变量中
FETCH cur INTO lastName, salaryParam;
if not done then
-- 这里就可以使用 lastName, salaryParam 对应的信息了
select lastName, salaryParam;
end if;
UNTIL done END REPEAT;
CLOSE cur;
end $$
DELIMITER ;

call my_pro12();

相关文章

网友评论

      本文标题:Java和MySQL简建立连接

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