mysql数据库连接

mysql数据库连接

在这里插入图片描述

1、利用druid进行数据库连接(尚servlet)

1.1先创建数据库和表

drop database if exists book;

create database book;

use book;

create table t_user(
`id` int primary key auto_increment,
`username` varchar(20) not null unique,
`password` varchar(32) not null,
`email` varchar(200)
);

insert into t_user(`username`,`password`,`email`) values('admin','admin','admin@atguigu.com');

select * from t_user;

1.2、编写数据库对应的javaBean

public class User {
	private Integer id;
	private String username;
	private String password;
	private String email;
}

1.1、src目录下的jdbc.properties文件

username=root
password=hushoutao
url=jdbc:mysql://localhost:3306/book?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true 
driverClassName=com.mysql.cj.jdbc.Driver
initialSize=5
maxActive=10

1.2、编写JdbcUtils工具类(在utils下)

package com.atguigu.utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class JdbcUtils {

    private static DruidDataSource dataSource;

    static {
        try {
            Properties properties = new Properties();
            // 读取 jdbc.properties属性配置文件
            InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            // 从流中加载数据
            properties.load(inputStream);
            // 创建 数据库连接 池
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
            System.out.println(dataSource.getConnection());//测试是否连接成功
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    /**
     * 获取数据库连接池中的连接
     * @return 如果返回null,说明获取连接失败<br/>有值就是获取连接成功
     */
    public static Connection getConnection(){
        Connection conn = null;

        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 关闭连接,放回数据库连接池
     * @param conn
     */
    public static void close(Connection conn){
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

1.3、WEB-INF下的lib目录下要导入mysql-connector-java-8.0.15.jar和druid-1.1.9.jar

1.4、利用JdbcUtilsTest进行测试

package com.atguigu.test;

import com.atguigu.utils.JdbcUtils;
import org.junit.Test;

import java.sql.Connection;

/**
 * @author hst
 * @create 2020-12-07 11:45
 * @Description:
 */
public class JdbcUtilsTest {

    @Test
    public void testJdbcUtils(){
        for (int i = 0; i < 100; i++) {
            Connection connection = JdbcUtils.getConnection();
            System.out.println(connection);
			JdbcUtils.close(connection);//数据库连接池中的连接在用完后一定要及时的释放,不然因为1.1中的jdbc.properties中设置了maxActive=10(数据库连接池中的连接数最大为10),所以最多只能连接10个
        }
    }
}

1.5、编写BaseDao(要先导入commons-dbutils-1.3.jar)

package com.atguigu.dao.impl;


import com.atguigu.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * @author hst
 * @create 2020-12-07 12:06
 * @Description:
 */
public abstract class BaseDao {
    private QueryRunner queryRunner = new QueryRunner();

    /**
     * update()方法,用来执行Insert/update/Delete方法
     * @param sql SQL语句
     * @param args SQL中的参数(?,?,?)
     * @return 返回-1表示失败,返回其它表示影响的行数
     */
    public int update(String sql,Object...args){
        Connection conn = JdbcUtils.getConnection();
        try {
            return queryRunner.update(conn,sql, args);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
           JdbcUtils.close(conn);
        }
        return -1;
    }

    /**
     * 查询后返回一个javaBean的sql语句
     * @param sql 执行的sql语句
     * @param type 返回的对象类型
     * @param args SQL对应的参数类型
     * @param <T>  返回的类型的泛型
     * @return
     */
    public <T> T queryForOne(String sql,Class<T> type,Object...args){
        Connection conn = JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn,sql, new BeanHandler<T>(type),args);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
             JdbcUtils.close(conn);
        }
        return null;
    }

    /**
     * 查询后返回多个javaBean的sql语句
     * @param sql 执行的sql语句
     * @param type 返回的对象类型
     * @param args SQL对应的参数类型
     * @param <T>  返回的类型的泛型
     * @return
     */

    public <T> List<T> queryForList(String sql,Class<T> type,Object...args){
        Connection conn = JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn,sql, new BeanListHandler<T>(type),args);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(conn);
        }
        return null;
    }

    /**
     * 执行返回一行一列的sql语句
     * @param sql 执行的sql语句
     * @param args sql对应的参数值
     * @return
     */
    public Object queryForSingleValue(String sql,Object...args){
        Connection conn = JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn,sql, new ScalarHandler(),args);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(conn);
        }
        return null;
    }
}

1.6、编写UserDao和测试

dao下的UserDao

package com.atguigu.dao;

import com.atguigu.pojo.User;

/**
 * @author hst
 * @create 2020-12-07 12:44
 * @Description:
 */
public interface UserDao {

    /**
     * 根据用户名查询用户信息(注册时检验用户名是否存在)
     * @param username
     * @return 如果返回null,说明没有这个用户(用户名可用),反之说明用户名不可用
     */
    public User queryUserByUserName(String username);

    /**
     * 添加用户信息(注册)
     * @param user
     * @return
     */
    public int InsertUser(User user);


    /**
     * 根据用户名、密码查询用户信息(登陆)
     * @param username
     * @param password
     * @return 如果返回null说明用户名或密码错误
     */
    public User queryUserByUsernameAndPasswrod(String username,String password);
}

dao下的Impl下的UserDaoImpl

package com.atguigu.dao.impl;

import com.atguigu.dao.UserDao;
import com.atguigu.pojo.User;

import java.net.PasswordAuthentication;

/**
 * @author hst
 * @create 2020-12-07 12:54
 * @Description:
 */
public class UserDaoImpl extends BaseDao implements UserDao {

    @Override
    public User queryUserByUserName(String username) {
        String sql = "select `id`,`username`,`password`,`email` from t_user where username = ?";
        return queryForOne(sql,User.class, username);
    }

    @Override
    public int InsertUser(User user) {
        String sql = "insert into t_user(`username`,`password`,`email`) values(?,?,?)";
        return update(sql,user.getUsername(),user.getPassword(),user.getEmail());
    }

    @Override
    public User queryUserByUsernameAndPasswrod(String username, String password) {
        String sql = "select `id`,`username`,`password`,`email` from t_user where username = ? AND password = ?";
        return queryForOne(sql,User.class,username,password);
    }
}

然后在test下创建UserDaoTest进行测试

package com.atguigu.test;

import com.atguigu.dao.impl.UserDaoImpl;
import com.atguigu.pojo.User;
import org.junit.Test;

import javax.sound.midi.Soundbank;

import static org.junit.Assert.*;

/**
 * @author hst
 * @create 2020-12-07 13:14
 * @Description:
 */
public class UserDaoTest {
    UserDaoImpl userDao = new UserDaoImpl();
    @Test
    public void queryUserByUserName() {
//        System.out.println(userDao.queryUserByUserName("admin"));
        if(userDao.queryUserByUserName("admin123") == null){
            System.out.println("用户名可用!");
        }else{
            System.out.println("用户名不可用!");
        }
    }

    @Test
    public void insertUser() {
        System.out.println(userDao.InsertUser(new User(null,"hufaf","admin","122581@qq.com")));
    }

    @Test
    public void queryUserByUsernameAndPasswrod() {
        if(userDao.queryUserByUsernameAndPasswrod("admin","admin")==null){
            System.out.println("用户或密码错误");
        }else {
            System.out.println("登陆成功");
        }
    }
}
原文地址:https://www.cnblogs.com/ryyy/p/14228211.html