1.sqlyog软件的使用.
使用这个工具可以直接创建数据库 表 直接添加数据
2.jdbc
jdbc是什么 jdbc:java数据库连接.
jdbc有什么用 jdbc可以适配市面上大多数数据库.我们使用java语言开发只要写一套程序就ok.
jdbc怎么用
[1]加载对应数据库的驱动
[2]连接要操作的数据库
[3]准备你要执行的sql语句 select * from info;
[4]执行sql语句 返回一个结果
[5]把结果数据取出来.
@Testpublic void jdbcTest1() throws Exception{//1.加载对应的驱动程序DriverManager.registerDriver(new Driver());//2.获取数据库的连接 参数1:通过url地址来连接数据库 参数2:用户名 参数3:密码Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hm104", "root", "123");//3.准备一个要执行的sql语句String sql = "select * from orders";//4.执行sql语句前 要先获取statement对象 用来执行sql语句Statement statement = conn.createStatement();//5.执行一个查询sql语句 返回一个结果集ResultSet resultSet = statement.executeQuery(sql);//6.想取出数据需要先移动光标 因为光标默认是第一行之前// resultSet.first();while(resultSet.next()){//7.获取对应列的数据int id = resultSet.getInt(1);String name = resultSet.getString(2);int price = resultSet.getInt(3);System.out.println("id:"+id+"---"+name+"--->"+price);}//8.关闭conn statement result对象 释放资源 先打开的后释放resultSet.close();statement.close();conn.close();}
3.jdbc加强
1.driverManager:注册驱动 获取一个数据库连接
2.Connection :获取一个statement对象,获取一个preparedStatement(预编译对象 可以防止sql注入)
3.statement对象 :执行一个查询的sql语句使用executeQuery(String sql) 如果执行的是insert update delete 应该使用executeUpdate();
4.ResultSet:代表结果集 只有进行查询的sdl语句的时候才会返回该对象,结果集内部默认有一个光标 光标默认在数据第一行之前.我们需要获取数据需要移动光标 移动光标的方法next() first() last();
4.sql注入
1.通过一个登录案例模拟 创建一个用户表用来模拟用户登录信息
create table login(id int,name varchar(20),pwd varchar(20));
insert into login values(1,'abc','123');
insert into login values(2,'abcd','1234');
2.模拟登录
select * from login where name='abc' and pwd='123'
select * from login where name='abc'or'1==1' and pwd='123dhdhdhdhdhd'
select * from login where name= 'abc\'or\'1==1' and pwd= '123dhdhdhdhdhd'
3.代码实现:
private static void loginIn(String name, String pwd) throws Exception{//1.加载对应的驱动程序DriverManager.registerDriver(new Driver());//2.获取数据库的连接 参数1:通过url地址来连接数据库 参数2:用户名 参数3:密码Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hm104", "root", "123");//3.准备一个要执行的sql语句 ?代表占位符 607String sql = "select * from login where name= ? and pwd= ?";//4.执行sql语句前 要先获取statement对象 为了防止sql注入 我们获取一个preparedstatement 对象PreparedStatement prepareStatement = conn.prepareStatement(sql);//4.1 设置?占位符的内容prepareStatement.setString(1, name);prepareStatement.setString(2, pwd);//5.执行一个查询sql语句 返回一个结果集ResultSet resultSet = prepareStatement.executeQuery();//6.想取出数据需要先移动光标 因为光标默认是第一行之前if (resultSet.next()) {System.out.println("登录成功");}else {System.out.println("登录失败");}//8.关闭conn statement result对象 释放资源 先打开的后释放resultSet.close();prepareStatement.close();conn.close();}}
5.sqlite数据库
sqlite是轻量级 嵌入式的数据库. 不需要安装sqlite软件.因为已经嵌入到android系统里
先创建数据库 在操作数据库里面的表 在操作表里面的记录 sqliteOpenHelper
5.1使用传统sql语句实现增删改查逻辑
//点击按钮实现向数据库增加一条记录 其实就是执行一个插入的sql语句public void click1(View view) {//1.想把数据库文件创建出来 第一次是创建数据库 第二次调用就是打开数据库SQLiteDatabase db = myOpenHelper.getWritableDatabase();//2.执行一个插入的sql语句db.execSQL("insert into info(name,phone) values('abc','13777777')");//3.当db对象用完后 需要关闭db.close();}//点击按钮实现向数据库删除一条记录 其实就是执行一个插入的sql语句public void click2(View view) {//1. 第一次是创建数据库 第二次调用就是打开数据库SQLiteDatabase db = myOpenHelper.getWritableDatabase();//2.执行一个插入的sql语句db.execSQL("delete from info where name='abc'");//3.当db对象用完后 需要关闭db.close();}//点击按钮实现向数据库修改一条记录 其实就是执行一个插入的sql语句public void click3(View view) {//1. 第一次是创建数据库 第二次调用就是打开数据库SQLiteDatabase db = myOpenHelper.getWritableDatabase();//2.执行一个插入的sql语句db.execSQL("update info set phone='139999999'where name='abc'");//3.当db对象用完后 需要关闭db.close();}//点击按钮实现向数据库 查询记录 其实就是执行一个插入的sql语句public void click4(View view) {//1. 第一次是创建数据库 第二次调用就是打开数据库SQLiteDatabase db = myOpenHelper.getReadableDatabase();//2.执行一个插入的sql语句 当执行查询sql语句的时候不能使用execSQL方法 因为这个方法返回值是voidCursor cursor = db.rawQuery("select * from info", null);//3.移动光标把数据取出来if (cursor!=null){while (cursor.moveToNext()){//4.取出对应列的值 列的索引 从0开始// int id = cursor.getInt(0);String id = cursor.getString(0);String name = cursor.getString(1);String phone = cursor.getString(2);System.out.println("id:"+id+"---"+name+"---"+phone);}}//3.当db对象用完后 需要关闭db.close();}
5.2.使用谷歌封装好的api实现增删改查逻辑
传统实现方式 调用方法没有返回值,程序员不容易进行判断 ,传统的sql语句很容易写错.
//点击按钮实现向数据库增加一条记录 其实就是执行一个插入的sql语句public void click1(View view) {//1.想把数据库文件创建出来 第一次是创建数据库 第二次调用就是打开数据库SQLiteDatabase db = myOpenHelper.getWritableDatabase();//2.调用insert方法执行插入逻辑// db.execSQL("insert into info(name,phone) values('abc','13777')");/*** 参数1:表名* 参数2:占位作用 如果字段什么数据也不插入就使用NULL占位 如果插入数据了就使用插入的数据* 参数3:编程小技巧 填写参数的时候 先不用管参数具体是什么含义 先把方法写完整.*///2.1创建ContentValues实例 这个实例其实就是map 往数据库中添加记录ContentValues values = new ContentValues(); //实际上底层就是一个map map由键值构成values.put("name","lisi"); //key:应该是列名values.put("phone","110");//2.2 调用insert方法插入数据 返回值:代表新插入行的id 2条记录 1 2 3long info = db.insert("info", null, values);if (info!=-1){Toast.makeText(this, "插入成功", Toast.LENGTH_SHORT).show();}else{Toast.makeText(this, "插入失败", Toast.LENGTH_SHORT).show();}//3.当db对象用完后 需要关闭db.close();}//点击按钮实现向数据库删除一条记录 其实就是执行一个插入的sql语句public void click2(View view) {//1. 第一次是创建数据库 第二次调用就是打开数据库SQLiteDatabase db = myOpenHelper.getWritableDatabase();//2.执行一个插入的sql语句// db.execSQL("delete from info where name='abc'");/*** 参数2:删除条件* 参数3:?号占位* 返回值: 代表删除的行数* 原理:底层在帮助我们封装sql语句*/int info = db.delete("info", "name=?", new String[]{"lisi"});Toast.makeText(this, "删除了"+info+"行", Toast.LENGTH_SHORT).show();//3.当db对象用完后 需要关闭db.close();}//点击按钮实现向数据库修改一条记录 其实就是执行一个插入的sql语句public void click3(View view) {//1. 第一次是创建数据库 第二次调用就是打开数据库SQLiteDatabase db = myOpenHelper.getWritableDatabase();//2.执行一个插入的sql语句// db.execSQL("update info set phone='139999999'where name='abc'");ContentValues values = new ContentValues();values.put("phone","120");int info = db.update("info", values, "name=?", new String[]{"lisi"});Toast.makeText(this, "更新了"+info+"行", Toast.LENGTH_SHORT).show();//3.当db对象用完后 需要关闭db.close();}//点击按钮实现向数据库 查询记录 其实就是执行一个插入的sql语句public void click4(View view) {//1. 第一次是创建数据库 第二次调用就是打开数据库SQLiteDatabase db = myOpenHelper.getReadableDatabase();//2.执行一个插入的sql语句 当执行查询sql语句的时候不能使用execSQL方法 因为这个方法返回值是void// Cursor cursor = db.rawQuery("select * from info", null); id name phone/*** 参数1:表名* 参数2 :代表要查询的列 new String[]{"id","name","phone"} null什么也不写就不知道要查什么 默认查所有* 参数3:查询条件 没有查询条件 ?* 参数4: 对条件占位* 参数5:group by 分组 不分组* 参数6:having null*/Cursor cursor = db.query("info", null, null, null, null, null, null, null);//3.移动光标把数据取出来if (cursor!=null){while (cursor.moveToNext()){//4.取出对应列的值 列的索引 从0开始// int id = cursor.getInt(0);String id = cursor.getString(0);String name = cursor.getString(1);String phone = cursor.getString(2);System.out.println("id:"+id+"---"+name+"---"+phone);}}//3.当db对象用完后 需要关闭db.close();}
6.事务
什么是事务:事务就是执行一段逻辑 要么同时成功 要么同时失败. 银行转账. 张三给李四转账 张三账户-100 李四账号+100
sqlite3 指令打开数据库 sqlite3 Account.db 如何改变dos编码 chcp 936(gbk) 65001(utf-8)
public void click(View view) {//1.先开启事务 //当硬盘满的时候 只能调用读SQLiteDatabase db = myOpenHelper.getReadableDatabase();//2.开启事务db.beginTransaction();try {//代表你要实现的逻辑 张三-100 李四+ 100db.execSQL("update info set money= money-200 where name=?",new String[] { "张三" });int i = 10/0;db.execSQL("update info set money= money+200 where name=?",new String[] { "李四" });//设置一个标记 当这行代码成功的时候 说明事务执行成功 当事务没进行成功 事务会进行一个回滚操作db.setTransactionSuccessful();}catch (Exception e){Toast.makeText(this, "服务器忙!!!!请稍后在转", Toast.LENGTH_SHORT).show();}finally {//结束事务db.endTransaction();}}
1439

被折叠的 条评论
为什么被折叠?



