本文共 4746 字,大约阅读时间需要 15 分钟。
url="jdbc:mysql://localhost:3306/mydb" 主协议:自协议://IP(数据库的IP):端口/库名
while(resultSet.next()){resultSet.getXXX("表头字段\字段序号(序号从1开始)");} //next让指针下移一行,没有返回false
public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydbs", "root", "123456"); Statement statement = connection.createStatement(); // statement.executeUpdate("insert into employee values(00000,'ed','de','d0')"); connection.close(); statement.close();}
自己查文档去!!!!!
public static void main(String[] args) throws ClassNotFoundException, SQLException { Scanner scanner = new Scanner(System.in); System.out.println("请输入用户名"); String username=scanner.next(); /*System.out.println("请输入密码"); String password=scanner.next();*/ Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydbs", "root", "123456"); //这里的操作对象可能会发生SQL注入现象 Statement statement = connection.createStatement(); String sql="select *from employee where emp_no='"+username+"'";//这里的命令使用了拼串 ResultSet resultSet = statement.executeQuery(sql); /* //这里使用了预编译操作对象 String sql="select *from employee where emp_no=?"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1,username); ResultSet resultSet = preparedStatement.executeQuery();*/ if(resultSet.next()){ System.out.println("登陆成功"); }else { System.out.println("登陆失败"); } connection.close(); //preparedStatement.close(); statement.close();
SQL注入:欺骗服务器的恶意命令
拼串引起的SQL注入 预防: 使用可以预防SQL注入的操作对象–预编译操作对象 预编译操作对象:连接对象.prepareStatement(“select * from 表名where 字段=? and 字段=?”)需要值的地方用?占位 预编译操作对象.setXXX(问号位置索引,值)public class JDBCUtils { //获取连接对象的三个参数 private static String url; private static String username; private static String password; //私有化构造,遇到反射就怂了 private JDBCUtils() { } //静态代码块--数据写死,高耦合 static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } url="jdbc:mysql:///mydb"; username="root"; password="123456"; } //获取连接对象 private static Connection getConnection() throws SQLException { return DriverManager.getConnection(url,username,password); } //释放资源 //查询语句返回一个结果集,所以需要三个参数 private static void close(Connection conn, Statement sta, ResultSet rs) throws SQLException { //做非空判断 if(conn!=null){ conn.close(); } if(sta!=null){ sta.close(); } if(rs!=null){ rs.close(); } } //DML语句返回int只需要两个参数 private static void close(Connection conn, Statement sta) throws SQLException { //做非空判断 if(conn!=null){ conn.close(); } if(sta!=null){ sta.close(); } }}
文件后缀名properties
把写死的数据放置在配置文件里,通过修改配置文件达到修改工具类的目的。 解耦和数据库中的事务:最小逻辑单元,组成事务的逻辑单元是不可分割的,只能同时成功或者失败
原子性Atomicity:最小单元
一致性Consistency:把所有事务看成一个整体,一起改变状态
隔离性Isolation:多个并发事务之间要相互隔离,每个用户的事务不能相互干扰
持久性Durability:数据的改变是永久性的
连接对象.setAutoCommit(false);//事务的自动提交改为手动提交
异常处理,在遇到异常时让事务回滚:连接对象.rollback(指定回滚点,没有设置就回到最初状态); 设置回滚点:连接对象.setsaveoint(); 无论异常与否都需要提交事务:连接对象.commit();addBatch();加入批处理
executeBatch();执行批处理–把数据先缓存起来,统一处理。 clearBatch();清空缓存DBCP和C3P0的区别:
DBCP没有自动回收空闲连接的功能;
C3P0有自动回收控线连接的功能。
DBCP(DataBaseConnectionPool)数据库连接池。
单独使用DBCP需要2个包:commons-dbcp.jar和commons-pool.jar
方式一:硬编码方式,将连接参数写在代码里
新建一个数据源new BasicDataSource();
连接驱动:资源库.setDriverClassName(“路径”);
设置参数:setXXX();
建立连接:资源库.getConnecting();
方式二:配置文件
通过工厂类创建数据源new BasicDataSourceFactory().createDataSource(properties);
方式三:配置文件-xml
标签形式的配置文件
可以有第二配置
方式一:硬编码方式,将参数写到代码
使用的类:ComboPoolDataSource
设置驱动以及参数setXXX();
建立连接:.getConnection();
获取预编译操作对象
方式二:配置文件
两个要求:
1.配置文件的文件名必须是固定的
2.配置文件必须放在SRC下
新建对象时会自动读取配置
所属阿里
方式一:硬编码
创建对象new DruidDataSource();
设置参数;
获取连接诶对象;
获取预编译操作对象
方式二:配置文件
所有配置文件的键名都是固定的约定俗成的
创建数据源new DruidDataSourceFactory().createataSource(properties);
获取操作对象new QueryRunner(数据源对象);
使用:操作对象.update();
操作对象.query();
转载地址:http://jlfli.baihongyu.com/