讲义:
动态sql可以定义代码片断,可以进行逻辑判断,可以进行循环处理(批量处理),使条件判断更为简单。 一、动态sql核心标签:
1、<sql>:当多种类型的查询语句的查询字段或者查询条件相同时,可以将其定义为常量,方便调用。
2、<include>:用来引用<sql>定义的代码片断。 <!--定义代码片断--> <sql id=allColumns> id,username,birthday,sex,address </sql> <!--引用定义好的代码片断--> <select id=getAll resultType=users > select <include refid=allColumns></include> from users </select> 3、<if>:进行条件判断。
test 属性:if 执行条件(条件判断的取值可以是实体类的成员变量,可以是map的key,可以是@Param注解的名称)。
4、<where>:
特性:标签可以自动的将第一个条件前面的逻辑运算符 (or ,and) 去掉,比如 id 查询条件前面是有“and”关键字的,但是在打印出来的 SQL 中却没有。
<select id=getByCondition parameterType=users resultType=users> select <include refid=allColumns></include> from users <where> <if test=userName != null and userName != ''> and username like concat('%',#{userName},'%') </if> <if test=birthday != null> and birthday = #{birthday} </if> <if test=sex !
前言 1.spring在配置时代,都是基于xml配置的,启动一个spring容器,通过ClassPathXmlApplicationContext类的refresh方法,然后解析bean标签,完成bean的注册,解析自定义标签<context:component-scan base-package=cn.com.dq.xml></context:component-scan>对注解的支撑,完成bean的注册 2.spring在零配置时代,基于注解,如何启动容器?如何完成对注解的支撑?
AnnotationConfigApplicationContext AnnotationConfigApplicationContext是基于注解启动spring容器的类,它有2个构造方法,1.参数是包路径,2.参数是一个类
构造方法参数是包路径 public AnnotationConfigApplicationContext(String... basePackages) { this(); scan(basePackages); refresh(); } this方法 public AnnotationConfigApplicationContext() { this.reader = new AnnotatedBeanDefinitionReader(this); this.scanner = new ClassPathBeanDefinitionScanner(this); } this方法是他的无参构造器,在无参构造器中,干了2件事情,1.new了一个AnnotatedBeanDefinitionReader,2.new 了一个ClassPathBeanDefinitionScanner
AnnotatedBeanDefinitionReader看着似曾相识,我们在xml启动容器的时候,要做xml解析,创建了一个XmlBeanDefinitionReader ClassPathBeanDefinitionScanner也是看着似曾相识,我们在xml启动容器时候,xml自定义标签解析<context:component-scan base-package=cn.com.dq.xml></context:component-scan>标签时候,创建了一个扫描器就是ClassPathBeanDefinitionScanner scan方法 public void scan(String... basePackages) { Assert.notEmpty(basePackages, At least one base package must be specified); this.scanner.scan(basePackages); } public int scan(String... basePackages) { int beanCountAtScanStart = this.registry.getBeanDefinitionCount(); doScan(basePackages); // Register annotation config processors, if necessary.
内容概要 pyhton操作MySQL SQL注入问题 修改表SQL语句补充 视图、触发器、储存过程 事务 流程控制 函数 索引与慢查询优化 内容详情 pyhton操作MySQL python中支持操作MySQL的模块很多 其中最常见的当属'pymysql' # 属于第三方模块 pip3 install pymysql # 基本使用 import pymsql 1.链接服务端 conn_obj = pymysql.connect( host='127.0.0.1', # MySQL服务端的IP地址 post=3306, # MySQL默认PORT地址(端口号) user='root', # 用户名 password='', # 密码 也可以简写 passwd databsae='', # 库名称 也可以简写 db charset='utf8' # 字符编码 千万不要加杠 utf-8会报错 ) 2.产生获取命令的游标对象 cursor = conn_obj.cursor( cursor=pymysql.sursor.DictCursor ) # 括号内不写参数 数据是元组套元组 不够精确 添加参数则会将数据处理成字典 3.编写SQL语句 sql1 = 'show tables;' # SQL语句会被高亮显示 不用惊慌 sql2 = 'select * from teacher;' sql3 = 'select * from score;' 4.
HamsterBear lradc按键驱动的适配 平台 - F1C200s Linux版本 - 5.17.2 ADC按键 - 4 KEY tablet 驱动程序位于主线内核:
drivers/input/keyboard/sun4i-lradc-keys.c 设备树binding
Documentation/devicetree/bindings/input/allwinner,sun4i-a10-lradc-keys.yaml 适配流程 开启驱动程序编译开关 进入kernel目录,执行make menuconfig
输入/后搜索KEYBOARD_SUN4I_LRADC 按1跳转到选项位置,修改选项为*后保存退出 查看设备树Binding,并修改添加设备树节点 示例如下
examples: - | lradc: lradc@1c22800 { compatible = allwinner,sun4i-a10-lradc-keys; reg = <0x01c22800 0x100>; interrupts = <31>; vref-supply = <®_vcc3v0>; button-191 { label = Volume Up; linux,code = <115>; channel = <0>; voltage = <191274>; }; button-392 { label = Volume Down; linux,code = <114>; channel = <0>; voltage = <392644>; }; }; 修改后的lradc节点 底板有4个按键,linux,code对应input evnet按键code值
目录python操作MySQLSQL注入问题二次确认修改表SQL语句补充视图、触发器、存储过程视图视图的概念视图的作用视图的制作触发器触发器概念触发器作用触发器种类触发器创建具体案例事务事务的概念事务的作用事务的四大特性具体使用存储过程类似于定义函数相当于调用函数具体案例函数移除指定字符大小写转换获取左右起始指定个数字符返回读音相似值(对英文效果)日期格式:date_format流程控制索引与慢查询优化索引就是一种数据结构索引的基本用法索引的影响
python操作MySQL python第三方模块中支持操作MySQL的模块很多 其中pymysql使用频率较高
import pymysql # 链接服务端 conn_obj = pymysql.connect( host='127.0.0.1', # MySQL服务端的IP地址 port=3306, # MySQL默认PORT地址(端口号) user='root', # 用户名 password='qwer9999', # 密码,也可以简写为passwd database='pymysql_db', # 库名称,也可以简写为db charset='utf8' # 字符编码 ) # 产生获取命令的游标对象 cursor = conn_obj.cursor() # 括号内不写参数,数据是元组套元组 # cursor = conn_obj.cursor( # cursor=pymysql.cursors.DictCursor # ) # 括号内写参数,数据会处理成字典形式 # sql1 = 'show tables;' sql1 = 'select * from t1;' # SQL语句会被高亮显示 # 执行SQL语句 affect_rows = cursor.execute(sql1) print(affect_rows) # 执行SQL语句之后受影响的行数 # 获取数据 # res = cursor.
目录 1.python操作MySQL 2.SQL注入及解决方式 3.二次确认 4.修改表SQL语句补充 5.视图 6.触发器 7.事务 8.存储过程 9.函数 10.流程控制 11.索引 12.脏读、幻读、不可重复读 内容 1.python操作MySQL python中支持操作MySQL的模块很多,其中最常见的当属:pymysql
属于第三方模块:pip install pymysql
基本使用 1.链接服务端
打印成功表示已经连接上database
2.产生获取命令的游标对象(打开终端输入命令的地方)
3.编写sql语句
4.执行sql语句(返回的结果是sql语句之后受影响的行数)
5.获取结果
通过这种方式来获取数据,如果字段很多并且是相同数据类型,无法知道对应的数据,所以需要更加精确(字典是存储数据最精确的)
而在第二步中,cursor括号内不写参数,结果是元组套元组,不够精确,添加参数之后会将数据处理成字典
完整代码
结果:
[{'cid': 1, 'caption': '三年二班'}, {'cid': 2, 'caption': '三年三班'}, {'cid': 3, 'caption': '一年二班'}, {'cid': 4, 'caption': '二年九班'}]
补充说明 fetchall():一次性获取所有结果
fetchone():获取结果集中的第一个;一个接着一个
fetchmany():获取结果集中的结果个数
cursor.scroll(1, 'relative'):相对于当前位置往后移动一个单位
cursor.scroll(1, 'absolute'):相对于起始位置往后移动一个单位
SQL注入及解决方式 SQL注入问题 编写一个登录功能
第一种情况:写正确的用户名错误的密码也可以登录
第二种情况:用户名和密码都不需要也可以登录
用navicat查看 将sql语句在navicat中运行,两种情况利用的是MySQL注释语法及逻辑运算符
第一种情况:
第二种情况:
解决方式 想办法过滤掉特殊符号,execute方法自带校验SQL注入问题,自动处理特殊符号
print(sum) sum = 42 print(sum) def inc(n): sum = n + 1 print(sum) return sum sum = inc(7) + inc(7) print(sum) 不是
第一次:Build-in
第二次:Global
第三次:Local
第四次:Global
list1 = [1,9,8,4] print( sorted(list1)) print( sorted(list1,reverse = True)) print( sorted(list1,True)) 是
def func(a,b,c,/,*,d,e,f): return( [a,b,c,d,e,f] ) print(func(1,2,3,d = 4,e = 5,f = 6)) def solve(a,b,c): ''' 求解一元二次方程,返回方程的两个根 :param a,b,c: int 方程系数 :return: tuple ''' delta = b*b-4*a*c delta_sqrt = abs(delta)**0.5 p1 = -b/2/a p2 = delta_sqrt/2/a if delta>=0: root1 = p1 + p2 root2 = p1 - p2 else: root1 = complex(p1,p2) root2 = complex(p1,-p2) return root1,root2 print(solve.
目录python操作mysqlSQL注入问题二次确认修改表sql语句视图触发器事务存储过程函数流程控制索引
python操作mysql python中支持操作MySQL的模块很多 其中最常见的当属'pymysql' # 属于第三方模块 pip3 install pymysql # 基本使用 import pymysql # 1.链接服务端 conn_obj = pymysql.connect( host='127.0.0.1', # MySQL服务端的IP地址 port=3306, # MySQL默认PORT地址(端口号) user='root', # 用户名 password='cc123', # 密码 也可以简写 passwd database='db4', # 库名称 也可以简写 db charset='utf8' # 字符编码 千万不要加杠utf-8 ) # 2.产生获取命令的游标对象 cursor = conn_obj.cursor( cursor=pymysql.cursors.DictCursor ) # 括号内不写参数 数据是元组要元组 不够精确 添加参数则会将数据处理成字典 # 3.编写SQL语句 # sql1 = 'show tables;' sql1 = 'select * from teacher;' # SQL语句会被高亮显示 末尾;可加可不加 # sql1 = 'select * from score;' # 4.
Ruby提供了ripper这个工具,我们可利用此工具分析ruby代码,方便定位性能问题。 以下内容都是以如下代码为例: x > 100 ? 'foo' : 'bar'
Ruby在执行程序前会将代码转化为更加结构化的语句
第一步:将代码切分为一个一个的词条
ripper的tokenize的方法可以将代码转化为词条数组
require 'ripper' require 'pp' p Ripper.tokenize(x > 1 ? 'foo' : 'bar') 以上程序执行结果如下:
[x, , >, , 1, , ?, , ', foo, ', , :, , ', bar, ']
大家可以看到代码只是被分割成一个个词条,这里还不会去判断语法正确性
第二步:词法解析
第一步完成后,接下来就是词法解析,这一步会对每一个词条加上一些附加信息
require 'ripper' require 'pp' pp Ripper.lex(x > 100 ? 'foo' : 'bar') 以上程序执行结果如下:
[[[1, 0], :on_ident, x], [[1, 1], :on_sp, ], [[1, 2], :on_op, >], [[1, 3], :on_sp, ], [[1, 4], :on_int, 100], [[1, 7], :on_sp, ], [[1, 8], :on_op, ?
目录python操作MySQLpymysql模块基本使用代码execute和executemany创建数据库案例插入单条数据批量插入多条数据查询数据fetchone()fetchmany()fetchall()控制光标SQL注入问题介绍二次确认修改表SQL语句补充视图视图的概念视图的作用视图的制作触发器概念作用触发器种类触发器创建语法具体案例触发器其他补充事务概念使用事务的目的事务的四大特性 — ACID使用案例事务的创建代码存储过程参数in — 输入参数out — 回传参数inout — 输出输出参数函数流程控制索引概念索引的基本用法索引的影响B+树索引的优势和劣势
python操作MySQL python中支持操作MySQL的模块很多 其中最常见的当属'pymysql'
pymysql模块 由于能操作MySQL的模块是第三方模块,我们需要pip安装。
pip3 install pymysql 基本使用 # 使用过程: 引用API模块 获取与数据库的连接 执行sql语句与存储过程 关闭数据库连接 代码 # 导入模块 import pymysql # 1.链接服务端 conn_obj = pymysql.connect( host='127.0.0.1', # MySQL服务端的IP地址 port=3306, # MySQL默认PORT地址(端口号) user='root', # 用户名 password='jason123', # 密码 也可以简写 passwd database='jp04_3', # 库名称 也可以简写 db charset='utf8' # 字符编码 千万不要加杠utf-8 ) ''' 要想操作数据库,光连接数据是不够的,必须拿到操作数据库的游标,才能进行后续的操作,比如: 读取数据、添加数据。通过获取到的数据库连接实例conn下的cursor()方法来创建游标。游标用来接收返回结果。 ''' # 2.