pt25django教程

查询数据

通过 MyModel.objects 管理器方法调用查询接口,查询数据库

方法说明
all()查询全部记录,返回QuerySet查询对象
get()查询符合条件的单一记录
filter()查询符合条件的多条记录
exclude()查询符合条件之外的全部记录

all()方法

MyModel.objects.all()

查询MyModel实体中所有的数据,等同于 select * from tabel;
返回值: QuerySet容器对象,内部存放 MyModel 实例

from bookstore.models import Book
books = Book.objects.all()
for book in books:print("书名", book.title, '出版社:', book.pub)[root@vm mysite2]# python3 manage.py shell
>>> from bookstore.models import Book
>>> books = Book.objects.all()
>>> for book in books:
...     print("书名:", book.title, '价格:', book.price,'出版社:', book.pub)
...
书名: java 价格: 50.00 出版社:>>> for book in books:
...     print(book)
...
Book object (1)
Book object (2)#数据库信息    
+----+-------+-------+--------------+-----+
| id | title | price | market_price | pub |
+----+-------+-------+--------------+-----+
|  1 | java  | 50.00 |         0.00 |     |
+----+-------+-------+--------------+-----+

返回自定义字符串

在模型类中重写__str__ 方法,实现自定义默认的字符串

[root@vm mysite2]# vim bookstore/models.pyclass Book(models.Model):title = ...def __str__(self):info = "书名: %s, 出版社: %s, 定价: %s" % (self.title, self.pub, self.price)return info
#重新登录终端
[root@vm mysite2]# python3 manage.py shell
>>> from bookstore.models import Book
>>> books = Book.objects.all()
>>> for book in books:
...     print(book)
...
书名: java, 出版社: , 定价: 50.00
书名: python, 出版社: 清华, 定价: 50.00

查询返回指定列(字典表示)

用法: MyModel.objects.values(列1,列2…)

  • 作用: 查询部分列的数据并返回,同select 列1,列2 from xxx

  • 返回值: QuerySet,返回查询结果容器,容器内存字典,每个字典代表一条数据,格式为: {‘列1’: 值1, ‘列2’: 值2}

from bookstore.models import Book
books = Book.objects.values("title", "pub")
for book in books:print("书名", book["title"], '出版社:', book['pub'])print("book=", book)#打印    
书名 java 出版社:
book= {'title': 'java', 'pub': ''}  
书名 python 出版社: 清华
book= {'title': 'python', 'pub': '清华'}
...

查询返回指定列(元组表示)

用法:MyModel.objects.values_list(列1,列2…)

  • 作用::返回元组形式的查询结果,返回值: QuerySet容器对象,内部存放元组

    会将查询出来的数据封装到元组中,再封装到查询集合QuerySet中

from bookstore.models import Book
books = Book.objects.values_list("title", "pub")
for book in books:print("书名", book[0], '出版社:', book[1])print("book=", book)#打印    
书名 java 出版社:
book= ('java', '')
书名 python 出版社: 清华
book= ('python', '清华')... 

排序查询 order_by

  • 方法:order_by,用法:MyModel.objects.order_by(‘-列’,‘列’)
  • 作用: 用SQL 语句的ORDER BY对查询结果,根据某个字段选择性的进行排序。默认是按照升序排序,降序排序则需要在列前增加’-'表示
from bookstore.models import Book
books = Book.objects.order_by("-price")
for book in books:print("书名:", book.title, '定价:', book.price)书名: xiyou 定价: 700.00
书名: c++ 定价: 100.00
书名: honglou 定价: 90.00    

条件查询 - filter

  • 方法: filter(条件),语法: MyModel.objects.filter(属性1=值1, 属性2=值2)

  • 返回值:QuerySet容器对象,内部存放 MyModel 实例

  • 说明: 当多个属性在一起时为"与"关系,

# 查询书中出版社为"清华大学出版社"的图书
from bookstore.models import Book
books = Book.objects.filter(pub="清华",price=100)
for book in books:print("书名:", book.title)书名: c++# 查询Author实体中name为王老师并且age是28岁的authors=Author.objects.filter(name='王老师',age=28)

条件查询 - get

  • 方法: get(条件) 语法: MyModel.objects.get(条件)

  • 作用:返回满足条件的唯一一条数据,编码时,一定要加try。

  • 说明: 该方法只能返回一条数据

    - 查询结果多余一条数据则抛出,Model.MultipleObjectsReturned异常
    - 查询结果如果没有数据则抛出Model.DoesNotExist异常
    

使用:

>>> from bookstore.models import Book
>>> book = Book.objects.get(id=1)
>>> print(book)
书名: java, 出版社: , 定价: 50.00
>>> print(book.title)
java#报错
>>> book = Book.objects.get(id=9)
...
bookstore.models.Book.DoesNotExist: Book matching query does not exist.>>> book = Book.objects.get(pub="清华")
...
bookstore.models.Book.MultipleObjectsReturned: get() returned more than one Book -- it returned 2!

对比filter和get方法

filter()方法:返回的是QuerySet类型,可以有0个、1个、多个对象。
get()方法:返回的是一个模型类的对象,只能返回1个对象,0个或多个将会报错!所以对于get方法,编码时,一定要加try。      

条件查询 - exclude

  • 方法: exclude(条件) 语法: MyModel.objects.exclude(条件)
  • 作用:,返回不包含此 条件的 全部的数据集
#查询 清华  出版社,定价等于50以外的全部图书
>>> books = Book.objects.exclude(pub="清华", price=50)
>>> for book in books:
...     print(book)

使用orm做数据的查询注意:

    MyModel.objects.all();MyModel.objects.values();MyModel.objects.values_list();MyModel.objects.get(); MyModel.objects.filter();MyModel.objects.exclude(); MyModel.objects.order_by();只有get返回单个对象,其他返回的是QuerySet容器。values返回的容器中的元素是字典;values_list则是元组;其他都是对象	

查询谓词

每一个查询谓词是一个独立的查询功能

__exact : 等值匹配

Author.objects.filter(id__exact=1)  #等同id=1
# 等同于select * from author where id = 1

__contains : 包含指定值

Author.objects.filter(name__contains='w')
# 等同于 select * from author where name like '%w%'

__startswith : 以 XXX 开始

__endswith : 以 XXX 结束

__gt : 大于指定值

Author.objects.filer(age__gt=50)
# 等同于 select * from author where age > 50__lt : 小于
__gte : 大于等于
__lte : 小于等于

__in : 指定范围内

Author.objects.filter(country__in=['中国','日本','韩国'])
# 等同于 select * from author where country in ('中国','日本','韩国')

__range : 指定的区间范围内

# 查找年龄在某一区间内的所有作者,包含边界值
Author.objects.filter(age__range=(35,50))
# 等同于 SELECT ... WHERE Author BETWEEN 35 and 50;

详细内容参见: https://docs.djangoproject.com/en/2.2/ref/models/querysets/#field-lookups

修改数据

修改单个实体的某些字段值的步骤:

  1. 查,通过 get() 得到要修改的实体对象
  2. 改,通过 对象.属性 的方式修改数据
  3. 存,通过 对象.save() 保存数据
>>> from bookstore.models import Book
>>> abook = Book.objects.get(id=1)
>>> print(abook.price)
50.00
>>> abook.price = "10.5"
>>> abook.save()
>>> print(abook.price)
10.5

通过 QuerySet 批量修改 对应的全部字段

直接调用QuerySet的update(属性=值) 实现批量修改 ,也可批量改一条

返回值:更新数据的数量

# 将id大于3的所有图书价格定为0元
books = Book.objects.filter(id__gt=3)
books.update(price=0)# 将所有书的零售价定为100元
books = Book.objects.all()
books.update(market_price=100)

删除数据

  • 删除记录是指删除数据库中的一条或多条记录
  • 删除单个MyModel对象或删除一个查询结果集(QuerySet)中的全部对象都是调用 delete()方法

删除单个对象

  1. 查找查询结果对应的一个数据对象
  2. 调用这个数据对象的delete()方法实现删除
try:auth = Author.objects.get(id=1)auth.delete()
except:print(删除失败)

删除查询结果集

  1. 查找查询结果集中满足条件的全部QuerySet查询集合对象,
  2. 调用查询集合对象的delete()方法实现删除,生成一条sql执行
# 删除全部作者中,年龄大于65的全部信息
auths = Author.objects.filter(age__gt=65)
auths.delete()

图书管理系统搭建

(结合页面完成增删改查)

查询功能url:    http://127.0.0.1:8000/bookstore/booksview: views.books_view html:  "bookstore/books.html"models: Book类添加功能url:    http://127.0.0.1:8000/bookstore/add_bookview: views.add_book html:  "bookstore/add_book.html"models: Book类
预览:添加图书
ID	书名	出版社	定价	零售价	操作
1	java		10.50	0.00	修改 删除
...[root@vm ~]# mysql -uroot -p123456 -e "select * from mysite2.bookstore_book"
+----+---------+--------+--------------+--------+
| id | title   | price  | market_price | pub    |
+----+---------+--------+--------------+--------+
|  1 | java    |  50.00 |         0.00 |        |
|  2 | python  |  50.00 |         0.00 | 清华   |
|  3 | c++     | 100.00 |         0.00 | 清华   |
|  4 | xiyou   | 700.00 |         0.00 | beida  |
|  5 | honglou |  90.00 |         0.00 | beida  |
+----+---------+--------+--------------+--------+

回顾下之前创建好的配置

[root@vm mysite2]# python3 manage.py startapp bookstore
[root@vm mysite2]# vim mysite2/settings.pyINSTALLED_APPS = [
...'bookstore',[root@vm mysite2]# vim bookstore/models.pyclass Book(models.Model):title = models.CharField("书名", max_length=50, default='')price = models.DecimalField('定价', max_digits=7, decimal_places=2, default=0.0)# 新增属性/字段 (要有默认值)market_price = models.DecimalField("零售价",max_digits=5,decimal_places=2,default=0.0)pub = models.CharField("出版社", max_length=50,default="")def __str__(self):info = "书名: %s, 出版社: %s, 定价: %s" % (self.title, self.pub, self.price)return info

新增bookstore/books.html配置

[root@vm mysite2]# vim bookstore/urls.py
from django.urls import path
from . import viewsurlpatterns = [path('books',views.books_view),
][root@vm mysite2]# vim bookstore/views.py
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from .models import Book# Create your views here.
def add_book(request):books = Book.objects.all()return render(request,'bookstore/books.html',locals())[root@vm mysite2]# mkdir -p bookstore/templates/bootstore
[root@vm mysite2]# vim bookstore/templates/bootstore/books.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>图书列表</title>
</head>
<body>
</body>
</html>http://192.168.1.11:8000/bookstore/books  #访问验证路由#补充books.html功能  
#href="/bookstore/add_book" bookstore前加/ 从/  不加是当前页面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>图书列表</title>
</head>
<body>
<a href="/bookstore/add_book">添加图书</a>
<table><tr><th>ID</th><th>书名</th><th>出版社</th><th>定价</th><th>零售价</th><th>操作</th></tr>{% for book in books %}<tr><td>{{ book.id }}</td><td>{{ book.title }}</td><td>{{ book.pub }}</td><td>{{ book.price }}</td><td>{{ book.market_price }}</td><td><a href="#">修改</a><a href="#">删除</a></td></tr>{% endfor %}
</table>
</body>
</html>

写添加功能/bookstore/add_book

[root@vm mysite2]# vim mysite2/urls.pyurlpatterns = [path('add_book/',include('add_book.urls')),[root@vm mysite2]# vim bookstore/urls.py
from django.urls import path
from . import viewsurlpatterns = [path('add_book',views.add_book),
][root@vm mysite2]# vim bookstore/views.py
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from .models import Book# Create your views here.
def add_book(request):if request.method == 'GET':# 返回添加图书的页面return render(request,'bookstore/add_book.html')elif request.method == 'POST':# return HttpResponse("添加图书成功!") #结合下方完整的add_book.html验证逻辑#OK了,再注释写下面的功能# 1.获取用户在add_book.html表单控件中输入的数据,title = request.POST['title']pub = request.POST['pub']price = request.POST['price']market_price = request.POST['market_price']# 2. 检查数据...# 3.添加到数据库Book.objects.create(title=title,pub=pub,price=price,market_price=market_price)# 重定向到图书列表return HttpResponseRedirect('/bookstore/books')[root@vm mysite2]# vim bookstore/templates/bootstore/add_book.html
#先验证title,再设计form表单
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>添加图书</title>  
</head>
<body>
<form action="/bookstore/add_book" method="post"><p>书名:<input type="text" name="title"></p><p>出版社:<input type="text" name="pub"></p><p>定价:<input type="text" name="price"></p><p>零售价:<input type="text" name="market_price"></p><p><input type="submit" value="添加"></p>
</form>
</body>
</html>

修改和删除

  通过浏览器地址栏向服务器传参,方式有哪些?1. path转换器2. 查询字符串
修改功能url:    http://127.0.0.1:8000/bookstore/update_book/1view: views.update_book html:  "bookstore/update_book.html"models: Book类
删除功能 url:    http://127.0.0.1:8000/bookstore/del_book?bid=1view: views.del_book html:  "bookstore/del_book.html"models: Book类从业务角度谈谈删除问题?1. 真正删除时,一般要有提示信息?防止误删。2. 标记删除。常用!!!不是把数据真正的从数据库中删除掉,而是增加一个标记以示区分。
[root@vm mysite2]# vim bookstore/urls.py
from django.urls import path
from . import views
urlpatterns = [path('books',views.books_view),path('add_book',views.add_book),path('update_book/<int:bid>',views.update_book),#使用了path转换器,与查询字符串选其中一个使用path('del_book',views.del_book),
]
[root@vm mysite2]# vim bookstore/views.py
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import renderfrom .models import Book# Create your views here.
def books_view(request):books = Book.objects.all()return render(request,'bookstore/books.html',locals())def add_book(request):if request.method == 'GET':# 返回添加图书的页面return render(request,'bookstore/add_book.html')elif request.method == 'POST':# 1.获取用户在表单中输入的数据title = request.POST['title']pub = request.POST['pub']price = request.POST['price']market_price = request.POST['market_price']# 2. 检查数据...# 3.添加到数据库Book.objects.create(title=title,pub=pub,price=price,market_price=market_price)# return HttpResponse("添加图书成功!")# 重定向到图书列表return HttpResponseRedirect('/bookstore/books')def update_book(request, bid):# 根据bid,从数据库中获取要修改的book对象# get,加trytry:book = Book.objects.get(id=bid)except:return HttpResponse("图书编号有误!")if request.method == "GET":return render(request,'bookstore/update_book.html',locals())elif request.method == "POST":# 1查,【2改,3保存】# 获取用户输入的新的数据给属性赋值title = request.POST['title']pub = request.POST['pub']price = request.POST['price']market_price = request.POST['market_price']book.title = titlebook.pub = pubbook.price = pricebook.market_price = market_price# 保存book.save()# return HttpResponse("修改图书成功!")# 重定向到图书列表return HttpResponseRedirect('/bookstore/books')def del_book(request):# 1.根据查询字符串获取图书ID.bid = request.GET.get('bid')# 2.根据图书ID获取图书对象try:book = Book.objects.get(id=bid)# 3.直接执行delete操作book.delete()except:return HttpResponse("图书ID有误!")# 4. 重定向到列表页return HttpResponseRedirect('/bookstore/books')
[root@vm mysite2]# vim bookstore/templates/bookstore/books.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>图书列表</title>
</head>
<body>
<a href="/bookstore/add_book">添加图书</a>
<table><tr><th>ID</th><th>书名</th><th>出版社</th><th>定价</th><th>零售价</th><th>操作</th></tr>{% for book in books %}<tr><td>{{ book.id }}</td><td>{{ book.title }}</td><td>{{ book.pub }}</td><td>{{ book.price }}</td><td>{{ book.market_price }}</td><td><a href="/bookstore/update_book/{{ book.id }}">修改</a><a href="/bookstore/del_book?bid={{ book.id }}">删除</a></td></tr>{% endfor %}
</table>
</body>
</html>
[root@vm mysite2]# vim bookstore/templates/bookstore/update_book.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>修改图书</title>
</head>
<body>
<form action="/bookstore/update_book/{{ book.id }}" method="post"><p>书名:<input type="text" name="title" value="{{ book.title }}"></p><p>出版社:<input type="text" name="pub" value="{{ book.pub }}"></p><p>定价:<input type="text" name="price" value="{{ book.price }}" ></p><p>零售价:<input type="text" name="market_price"  value="{{ book.market_price }}" ></p><p><input type="submit" value="修改"></p>
</form>
</body>
</html>
小的项目管理  cMTV    运维数据整理企业级的项目前端T     基于文档,json格式数据,RESTful 接口规范,跨域问题解决后端cMV  python web     

聚合查询

聚合查询是指对一个数据表中的一个字段的数据进行部分或全部进行统计查询,查bookstore_book数据表中的全部书的平均价格,查询所有书的总个数等,都要使用聚合查询

不带分组聚合

不带分组的聚合查询是指导将全部数据进行集中统计查询,聚合函数【需要导入】,聚合函数有: Sum, Avg, Count, Max, Min

from django.db.models import *
MyModel.objects.aggregate(结果变量名=聚合函数('列'))

返回结果:由 结果变量名和值组成的字典

# 得到所有书的平均价格
from bookstore.models import Book
from django.db.models import *
result = Book.objects.aggregate(myAvg=Avg('price'))
print("result=", result)  # result= {'myAvg': Decimal('189.700000')}
print("平均价格是:", result['myAvg']) #平均价格是: 189.700000# 得到数据表里有多少本书
from django.db.models import Count
result = Book.objects.aggregate(mycnt=Count('title'))
print("result=", result)  #result= {'mycnt': 5}
print("数据记录总个数是:", result['mycnt'])  #数据记录总个数是: 5

分组聚合(走两步)

分组聚合是指通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。

1、通过先用查询结果MyModel.objects.values 查找查询要分组聚合的列,返回 QuerySet 结果集,内部存储结果的字典

MyModel.objects.values('列1', '列2')
pub_set = Book.objects.values('pub')
print(pub_set)  # <QuerySet [{'pub': '清华'}, {'pub': '清华'}, {'pub': '清华'}, {'pub': 'beida'}, {'pub': 'beida'}]>

2、通过返回结果的 QuerySet.annotate 方法分组聚合得到分组结果

QuerySet.annotate(结果变量名=聚合函数('列'))
pub_count_set = pub_set.annotate(myCount=Count('pub'),mysum=Sum('price'))
print(pub_count_set)  <QuerySet [{'pub': '清华', 'myCount': 3, 'mysum': Decimal('160.50')}, {'pub': 'beida', 'myCount': 2, 'mysum': Decimal('788.00')}]>>>> for item in pub_count_set:
...     print(item['pub'],item['myCount'],item['mysum'])
...
清华 3 160.50
beida 2 788.00

F对象field

一个F对象代表数据库中某条记录的字段的信息

作用: 通常是对数据库中的字段值在不获取的情况下进行操作,用于类属性(字段)之间的比较。使用时需要先导入

from django.db.models import F
F('列名')  

说明: 一个 F() 对象代表了一个model的字段的值,F对象通常是对数据库中的字段值在不加载到内存中的情况下(生成sql),直接在数据库服务器端进行操作

基本使用

更新Book实例中所有的零售价涨10元

>>> from django.db.models import F
>>> from bookstore.models import Book
>>> Book.objects.all().update(market_price=F('market_price')+10)
'''生成sql:UPDATE `bookstore_book` SET `market_price` = (`bookstore_book`.`market_price` + 10) '''
5  #作用了5条数据# 以上做法好于如下代码,有循环读写,慢
books = Book.objects.all()
for book in books:book.market_price=book.marget_price+10book.save()

使用查询谓词__gt

对数据库中两个字段的值进行比较,列出哪儿些书的零售价高于定价?

from django.db.models import F
from bookstore.models import Book
books = Book.objects.filter(market_price__gt=F('price'))
'SELECT * FROM `bookstore_book` WHERE `bookstore_book`.`market_price` > (`bookstore_book`.`price`)
for book in books:print(book.title, '定价:', book.price, '现价:', book.market_price)#go 定价: 88.00 现价: 108.00

Q对象query

完整的表达逻辑操作,在条件中用来实现除 and(&) 以外的 or(|) 或 not(~) 操作,需要先导入再使用

如: 想找出定价低于20元 或 清华大学出版社的全部书,可以写成

from django.db.models import Q
Q(条件1)|Q(条件2)  # 条件1成立或条件2成立
Q(条件1)&Q(条件2)  # 条件1和条件2同时成立
Q(条件1)&~Q(条件2)  # 条件1成立且条件2不成立
...
from django.db.models import Q
# 查找清华大学出版社的书或价格低于50的书
Book.objects.filter(Q(market_price__lt=50) | Q(pub='清华'))
#<QuerySet [<Book: 书名: java, 出版社: 清华, 定价: 10.50>, <Book: 书名: python, 出版社: 清华, 定价: 50.00>, <Book: 书名: c++, 出版社: 清华, 定价: 100.00>, <Book: 书名: xiyou, 出版社: beida, 定价: 700.00>]># 查找不是机械工业出版社的书且价格低于50的书
Book.objects.filter(Q(market_price__lt=50) & ~Q(pub='清华'))
<QuerySet [<Book: 书名: xiyou, 出版社: beida, 定价: 700.00>]>

原生的数据库操作方法

模型管理器的raw

在django中,可以使用模型管理器的raw方法来执行select语句进行数据查询

MyModel.objects.raw(sql语句,[拼接参数])          #防止sql注入

返回值: RawQuerySet 集合对象 【只支持基础操作,比如循环】

books = Book.objects.raw('select * from bookstore_book')
for book in books:print(book)#sql注入攻击问题
s1 = Book.objects.raw('select * from bookstore_book where id=%s'%('1 or 1=1'))
#'select * from bookstore_book where id=%s'%(表单控件获得))
#select * from bookstore_book where id=1 or 1=1;  id=1没有的时候,查询了所有
>>> s1
<RawQuerySet: select * from bookstore_book where id=1 or 1=1>
>>> for book in s1:
...     print(book)
...
书名: java, 出版社: 清华, 定价: 10.50
书名: python, 出版社: 清华, 定价: 50.00
书名: c++, 出版社: 清华, 定价: 100.00
书名: xiyou, 出版社: beida, 定价: 700.00
书名: go, 出版社: beida, 定价: 88.00#防止sql注入,拼接参数1 or之间的空格会发生截断,后面的不要
s2 = Book.objects.raw('select * from bookstore_book where id=%s',['1 or 1=1'])
>>> for book in s2:
...     print(book)
...
书名: java, 出版社: 清华, 定价: 10.50    

游标cursor

使用django中的游标cursor直接对数据库进行 增删改查 操作,使用前需要先导入

from django.db import connection

用创建cursor类的构造函数创建cursor对象,再使用cursor对象
为保证在出现异常时能释放cursor资源,通常使用with语句进行创建操作

from django.db import connection
with connection.cursor() as cur:cur.execute('执行SQL语句', '拼接参数')
# 用SQL语句将id 为 10的 书的出版社改为 "XXX出版社"
from django.db import connection
with connection.cursor() as cur: cur.execute('update bookstore_book set pub="XXX出版社" where id=10;')#拼接参数    
with connection.cursor() as cur:cur.execute('update bookstore_book set pub="XXX出版社" where id=%s',['1 or 1=2'])# 删除 id为1的一条记录
with connection.cursor() as cur:   cur.execute('delete from bookstore_book where id=10;')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/80223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis获取参数值的两种方式#{}和${} 以及 获取参数值的各种情况

一、参数值的两种方式#{}和${} 在 MyBatis 中&#xff0c;可以使用两种方式来获取参数值&#xff1a;#{} 和 ${}。 1. #{}&#xff1a;这是 MyBatis 推荐使用的方式。在 SQL 语句中使用 #{}&#xff0c;MyBatis 会自动将参数值进行预编译处理&#xff0c;防止 SQL 注入攻击&a…

【深度学习】- NLP系列文章之 1.文本表示以及mlp来处理分类问题

系列文章目录 1. 文本分类与词嵌入表示&#xff0c;mlp来处理分类问题 2. RNN、LSTM、GRU三种方式处理文本分类问题 3. 评论情绪分类 还是得开个坑&#xff0c;最近搞论文&#xff0c;使用lstm做的ssd的cache prefetching&#xff0c;意味着我不能再划水了。 文章目录 系列文章…

Java 线性表

以下是一个简单的 Java 线性表&#xff08;ArrayList&#xff09;的实现示例&#xff1a; import java.util.Arrays;public class MyArrayList<E> {private static final int DEFAULT_CAPACITY 10;private int size 0;private Object elements[];public MyArrayList()…

打造“共富果园” 广东乳源推动茶油全产业链高质量发展

新华网广州9月13日电&#xff08;李庆招&#xff09;金秋九月&#xff0c;瓜果飘香&#xff0c;油茶也将迎来采摘期。13日&#xff0c;一场以“中国健康油 茶油新势力”为主题的乳源茶油12221市场体系之产业大会暨供销对接会在广州举行。来自茶油行业的专家、企业家齐聚一堂&am…

三、修改安卓aosp代码更改硬件参数

系列文章目录 第一章 安卓aosp源码编译环境搭建 第二章 手机硬件参数介绍和校验算法 第三章 修改安卓aosp代码更改硬件参数 第四章 编译定制rom并刷机实现硬改(一) 第五章 编译定制rom并刷机实现硬改(二) 第六章 不root不magisk不xposed lsposed frida原生修改定位 第七章 安卓…

Java 中“1000==1000”为false,而”100==100“为true?

如果你运行下面的代码: Integer a 1000, b 1000; System.out.println(a b);//1Integer c 100, d 100; System.out.println(c d);//2你会得到: false true基本知识&#xff1a;我们知道&#xff0c;如果两个引用指向同一个对象&#xff0c;用表示它们是相等的。如果两…

【JavaSE笔记】类和对象(万字详解)

一、前言 Java是一种广泛应用于各个领域的编程语言&#xff0c;它的面向对象编程范式使得它成为了当今软件开发的主要选择之一。通过面向对象编程&#xff0c;Java使程序员能够将代码组织成易于理解和维护的结构&#xff0c;并且在开发大型复杂的应用程序时提供了许多便利。 …

FDM3D打印系列——Blue Mary

大家好&#xff0c;我是阿赵。   这次打印一个拳皇里面的Blue Mary。   打印这个模型的原因&#xff0c;是看到有网友说这个模型用FDM打印不出来&#xff0c;有些人评论说要光固化才行。所以我也想试试。结果是成功的。 一、打印过程 这个模型是分为了5个部分&#xff0c…

uniapp轮播图制作

在Uniapp中实现轮播图可以使用swiper组件&#xff0c;它是一个常用的轮播组件。以下是一个简单的示例&#xff1a; 在你的组件模板文件中&#xff0c;添加swiper组件&#xff0c;并设置相应的属性和事件处理方法&#xff1a; <template><view><swiper autopla…

守护线程?

守护线程&#xff08;Daemon Thread&#xff09;是一种特殊类型的线程。它与普通线程&#xff08;用户线程&#xff09;的区别&#xff1a; 生命周期&#xff1a; 守护线程的生命周期依赖于其他线程&#xff0c;当所有的用户线程都结束时&#xff0c;守护线程会随之自动终止。…

关于老项目从JDK8升级到JDK17所需要注意的细节

文章目录 ☀️1.关于老项目从JDK8升级到JDK17所需要注意的细节&#x1f338;1.1.更新JDK&#x1f338;1.2.修改Idea中的JDK版本&#x1f338;1.3.关于修改过程中遇到的异常&#x1f338;1.4.IDEA工具栏操作Maven正常&#xff0c;但使用mvn命令运行就报错 ☀️1.关于老项目从JDK…

基于SpringbootShiro实现的CAS单点登录

概述 单点登录&#xff08;Single Sign On,SSO&#xff09;是一种登录管理机制&#xff0c;主要用于多系统集成&#xff0c;即在多个系统中&#xff0c;用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个&#xff0c;无须多次登录。常见的例子就是&#xff0c;…

MCU软核 3. Xilinx Artix7上运行cortex-m3软核

0. 环境 - win10 vivado 2018.3 keil mdk - jlink - XC7A35TV12 1. 下载资料 https://keilpack.azureedge.net/pack/Keil.V2M-MPS2_DSx_BSP.1.1.0.pack https://gitee.com/whik/cortex_m3_on_xc7a100t 2. vivado 2018 Create Project -> Next -> -> Project n…

dp(3) - 背包问题(上)

目录 简论 关于dp问题 : ​编辑 0-1背包问题 定义 : 例题 : 题面 : ​编辑 思路 : 代码(二维) : 代码(一维优化版): 完全背包问题 题目链接 : 题面 : ​编辑 思路 : 代码(朴素) : 代码(优化) : 代码(一维优化) : 多重背包问题 题目链接 : 题面 : ​编辑 …

软件测试常用的功能测试方法

功能测试 功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。针对Web系统的常用测试方法如下&#xff1a; 1. 页面链接检查&#xff1a;每一个链接是否都有对应的页面&#xff0c;并且页面之…

如何判断linux 文件(或lib)是由uclibc还是glibc编译出来的?

工作中使用的编译环境有2套编译器&#xff0c;一个是glibc&#xff0c;一个是uclibc。 有些项目使用的glibc编译的lib&#xff0c;和使用uclibc编译的工程&#xff0c;在一起就会出现reference的编译错误如下&#xff1a; 那和如何来判断一个文件是由哪个编译器编译的呢&#…

软件工程评级B-,有大量调剂名额。北京联合大学考情分析

北京联合大学(B-) 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1239字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 北京…

进程,线程,并发相关入门

进程与线程的简单理解 进程是一个独立的执行单元&#xff0c;它拥有自己的内存空间、文件句柄和系统资源.进程是操作系统层面的,每个应用运行就是一个进程.进程之间通常是隔离的&#xff0c;它们不能直接访问对方的内存空间&#xff0c;必须通过进程间通信&#xff08;IPC&…

详细解释HiveSQL执行计划

一、前言 Hive SQL的执行计划描述SQL实际执行的整体轮廓&#xff0c;通过执行计划能了解SQL程序在转换成相应计算引擎的执行逻辑&#xff0c;掌握了执行逻辑也就能更好地把握程序出现的瓶颈点&#xff0c;从而能够实现更有针对性的优化。此外还能帮助开发者识别看似等价的SQL其…

前端面试话术集锦第 12 篇:高频考点(Vue常考基础知识点)

这是记录前端面试的话术集锦第十二篇博文——高频考点(Vue常考基础知识点),我会不断更新该博文。❗❗❗ 这一章节我们将来学习Vue的一些经常考到的基础知识点。 1. 生命周期钩子函数 在beforeCreate钩子函数调用的时候,是获取不到props或者data中的数据的,因为这些数据的…