使用DBUtil来进行数据的几种查询方式

目录

一、最简单直接的数据库查询

二、使用ResultSetHandler进行数据库映射和查询

1、单条数据的查询

2、集合数据的查询

3、复杂数据库的查询

4、用HashMap进行复杂的数据库查询


​​​​​​​

最开始我们要先导DBUtil的包进来

一、最简单直接的数据库查询

1、首先我们要有jdbc.properties文件,在这里我们用的是德鲁伊进行JDBC连接

druid.username=root
druid.password=123456
druid.url=jdbc:mysql://127.0.0.1:3306/aa?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false
druid.driverClassName=com.mysql.cj.jdbc.Driver
druid.keepAlive=300
druid.maxWait=300
druid.initialSize=10
druid.maxActive=20

2、然后要有用户类,与数据库中的User表对应

public class User {

    private int id;
    private String username;
    private String password;

    public User(int id, String uesrname, String password) {
        this.id = id;
        this.username = uesrname;
        this.password = password;
    }

    public User() {}

    public int getId() {
        return id;
    }

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

    public String getUesrname() {
        return username;
    }

    public void setUesrname(String uesrname) {
        this.username = uesrname;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", uesrname='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

3、建个工具类,对资源的调用和返回资源

public class PoolUtil {
    private static DataSource DATASOURCE  = null;
    static {
        Properties properties = new Properties();
        try {
            properties.load(PoolTest.class.getClassLoader().getResourceAsStream("jdbc.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        DATASOURCE = new DruidDataSource();
        ((DruidDataSource)DATASOURCE).configFromPropety(properties);
    }

    public static DataSource getDataSource(){
        return DATASOURCE;
    }
}

4、现在是我们的重头戏了,测试类

这个可以对数据库进行查询,我们写的是User类,数据库里对应的一定要是user表,查询的内容会完全展现

public class UtilTest {
    @Test
    public void testAdd(){

        // 最直接的调用
        ResultSetHandler<List<User>> h = new BeanListHandler<User>(User.class);

        QueryRunner run = new QueryRunner(PoolUtil.getDataSource());
        // Execute the query and get the results back from the handler
        try {
            List<User> result = run.query(
                    "SELECT * FROM user", h);
            System.out.println(result);
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

二、使用ResultSetHandler进行数据库映射和查询

1、单条数据的查询

假如我们数据库的表与User类名字对不上,就要用另外一种形式,要先映射再查询,引号里面的名称要与数据库中一样,不然会报错

如此,我们可以查询到id为1的数据库数据,这种写法只能查询单行数据,我试了不写where id = 1,最后出来的是id数最后的那组数据

public class UtilTest {
    @Test
    public void testAdd(){

        ResultSetHandler<User> h = new ResultSetHandler<User>() {
            @Override
            public User handle(ResultSet resultSet) throws SQLException {
                User user = new User();
                while (resultSet.next()){
                    user.setId(resultSet.getInt("id"));
                    user.setUesrname(resultSet.getString("username"));
                    user.setPassword(resultSet.getString("password"));
                }
                return user;
            }
        };


        QueryRunner run = new QueryRunner(PoolUtil.getDataSource());
        // Execute the query and get the results back from the handler
        try {
            List<User> result = run.query(
                    "SELECT * FROM user where id = 1", h);
            System.out.println(result);
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

2、集合数据的查询

这是如何查询数据集合的代码,可以查询user表内所有的数据信息。不过我们还是建议名称一样,这样可以省很多代码,方便快捷。不过这个只能用在简单的查询上面,复杂的查询还是要用ResultSetHandler

public class UtilTest {
    @Test
    public void testAdd(){

        ResultSetHandler<List<User>> h = new ResultSetHandler<List<User>>() {
            @Override
            public List<User> handle(ResultSet resultSet) throws SQLException {
                List<User> users = new ArrayList<>();
                while (resultSet.next()){
                    User user = new User();
                    user.setId(resultSet.getInt("id"));
                    user.setUesrname(resultSet.getString("username"));
                    user.setPassword(resultSet.getString("password"));
                    users.add(user);
                }
                return users;
            }
        };

        QueryRunner run = new QueryRunner(PoolUtil.getDataSource());
        try {
            List<User> result = run.query(
                    "SELECT * FROM user", h);
            System.out.println(result);
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

3、复杂数据库的查询

复杂的查询代码演示,下面的查询代码是将user表和teacher表合并在一起,所以查询出来的结果是两个表的结合。之前的user数据表里面没有和teacher相关的id,所以我们要建一个:

user表,t_id是新建的

teacher表

在数据库的查询里面,我们要查询的语句先写出来,并且对每个数据起个别名

SELECT t.id tid,t.`name` tname,u.id uid,u.username uusername,u.`password` upassword FROM teacher t LEFT JOIN `user` u on t.id = u.t_id

然后我们在Teacher这个类里面加入user表里面的三个数据类型,新加的数据名称可以按别名来,这样好区分,容易记住

public class Teacher {
    private int id;
    private String name;

    private int uId;
    private String uUsername;
    private String uPassword;

    public int getuId() {
        return uId;
    }

    public void setuId(int uId) {
        this.uId = uId;
    }

    public String getuUsername() {
        return uUsername;
    }

    public void setuUsername(String uUsername) {
        this.uUsername = uUsername;
    }

    public String getuPassword() {
        return uPassword;
    }

    public void setuPassword(String uPassword) {
        this.uPassword = uPassword;
    }

    public Teacher(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Teacher(){}

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", uId=" + uId +
                ", uUsername='" + uUsername + '\'' +
                ", uPassword='" + uPassword + '\'' +
                '}';
    }
}

然后在测试类中进行测试,大功告成

public class UtilTest {
    @Test
    public void testAdd() {

        ResultSetHandler<List<Teacher>> h = new ResultSetHandler<List<Teacher>>() {
            @Override
            public List<Teacher> handle(ResultSet resultSet) throws SQLException {
                List<Teacher> teachers = new ArrayList<>();
                while (resultSet.next()) {
                    Teacher teacher = new Teacher();
                    teacher.setId(resultSet.getInt("tid"));
                    teacher.setName(resultSet.getString("tname"));
                    teacher.setuId(resultSet.getInt("uid"));
                    teacher.setuUsername(resultSet.getString("uusername"));
                    teacher.setuPassword(resultSet.getString("upassword"));
                    teachers.add(teacher);
                }
                return teachers;
            }
        };

        QueryRunner run = new QueryRunner(PoolUtil.getDataSource());
        try {
            List<Teacher> result = run.query(
                    "SELECT t.id tid,t.`name` tname,u.id uid,u.username uusername,u.`password` upassword FROM teacher t LEFT JOIN `user` u on t.id = u.t_id", h);
            System.out.println(result);
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

4、用HashMap进行复杂的数据库查询

如果我们不想污染teacher,可以用HashMap来代替。在操作中老师建议我们使用user类来写,而不是使用map,user看起来会比较舒服,没有那么别扭,但是企业中,map用的非常多

public class UtilTest {
    @Test
    public void testAdd() {

        ResultSetHandler<List<Map<String,Object>>> h = new ResultSetHandler<List<Map<String,Object>>>() {
            @Override
            public List<Map<String,Object>> handle(ResultSet resultSet) throws SQLException {
                List<Map<String,Object>> teachers = new ArrayList<>();
                while (resultSet.next()) {
                    // 8是初始容量,键的内容随意性很大,其实可以随便填
                    Map<String,Object> teacher = new HashMap<>(8);
                    teacher.put("tid",resultSet.getInt("tid"));
                    teacher.put("tname",resultSet.getString("tname"));
                    teacher.put("uid",resultSet.getInt("uid"));
                    teacher.put("uusername",resultSet.getString("uusername"));
                    teacher.put("upassword",resultSet.getString("upassword"));

                    teachers.add(teacher);
                }
                return teachers;
            }
        };

        QueryRunner run = new QueryRunner(PoolUtil.getDataSource());
        try {
            List<Map<String,Object>> result = run.query(
                    "SELECT t.id tid,t.`name` tname,u.id uid,u.username uusername,u.`password` upassword FROM teacher t LEFT JOIN `user` u on t.id = u.t_id", h);
            System.out.println(result);
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值