文章目录
JSON
1.json格式
{key:value,key:value}
var person={
"name":"hanxzioalei",
“age”:18,
}
2.json数组格式
[{key:value,key:value},{key:value,key:value}]
<script>
var person={
"name":"韩晓磊",
"age":18
}
//将json转换为字符串
var str=JSON.stringify(person);
console.log(str);
//模拟str是服务端传递给我们客户端的,我们在拿到服务器传递过来的json字符串之后,需要将Ⅶ转换成json对象才能解析出数据
var p=JSON.parse(str);
console.log(p);
</script>
正则表达式
//匹配验证:检验一个字符串中是否包含o字母
var str="hello"
//编写一个用于校验的正则表达式
var reg1=/o/
//使用正则表达式去检验字符串
console.log(reg1.test(str));
//匹配读取:读取一个字符串中第一个l字母
//编写一个正则表达式
var reg2=/l/
//使用正则表达式去读取字符串
console.log( str.match(reg2))
//匹配替换:将字符换中第一个o替换为@
//编写一个正则表达式
var reg3=/o/
//使用正则表达式替换内容
//'@'只能用小括号包裹,大括号无效
console.log( str.replace(reg3,'@'))
// search()方法 检查字符串中是否有hel字符串
//有返回下标,没有返回-1
console.log(str.search(/hel/));
var reg3=/o/gi
表示全局(g)查找o字母,并且忽略(i)大小写
var reg3=/^h/
判断字符串是否以h开头
var reg3=/h$/
判断字符串是否以$结尾
var reg3=/[a-zA-Z]{11}/
判断字符串是否包含11个字母
var reg3=/^[a-zA-Z]{11}$/
判断字符串有且只包含11个字母
注意:
验证是调用正则表达式的方法,
而匹配查找与匹配替换是要查找字符串的放法。
多行查找 m
如果没有使用多行查找,那么你的字符串无论是几行,都被当成一行匹配
var str1="hello\nword"
var str2="hello"
var reg=/hello$/m
reg.test(str1) //true
reg.test(str2) //true
表示谁就在谁后面加
常用正则直接百度
var str2='a'
var reg4=/[a]{2}/
console.log(reg4.test(str2))
//只要是字符串中某字符出现次数大于要检测的数量,就为true
xml
第一行写xml约束
<?xml version="1.0" encoding="utf-8"?>
第二行是根标签,有且只有一个根标签,根标签名称随便起。
Tomcat
tomcat是一个免费的,开放源代码的Web应用服务器,是Apache软件基金会项目中的一个核心项目,由Apache ,Sun和一些公司以及个人共同开发而成,深受Java爱好者的喜爱,是一款比较流行的web应用服务器。
查看默认端口号占用情况
netstat -aon|findstr "8080"
去任务管理器中结束 PID为8980的进程
下载:
https://tomcat.apache.org/
安装:
解压即可,
卸载:删除就可以
启动:
去bin目录下找startup.bat启动
关闭
部署
常用第三种,热部署
静态项目与动态项目
将Tomcat集成到IDEA中,并且创建javaEE的项目,部署项目。
JDBC
导jar包不会问问别人
/**
* jdbc快速入门
*/
public class jdbc {
public static void main(String[] args) throws Exception {
//1.注册驱动
//这里的cj MySql5之后的jar包可以省略
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:23306/atguigudb";
String username="root";
String password="0071hanxiaolei";
//返回的是一个connection 对象
Connection conn= DriverManager.getConnection(url,username, password);
//3.定义一个sql语句
String sql="update account set money=4000 where id=1";
//4.获取执行sql的对象statement
Statement stmt=conn.createStatement();
//5.执行sql
int count =stmt.executeUpdate(sql);
//6.处理结果
System.out.println(count);
//7.释放资源 后人先出
stmt.close();
conn.close();
}
}
JDBC API 详解
处理事务要用异常处理方式
try {
//开启事务
conn.setAutoCommit(false);
//5.执行sql
int count1 =stmt.executeUpdate(sql1);
int count2 =stmt.executeUpdate(sql2);
//6.处理结果
System.out.println(count1);
System.out.println(count2);
// 提交事务
conn.commit();
} catch (Exception throwables) {
//如果有异常回滚事务
conn.rollback();
throwables.printStackTrace();
}
在执行DML之后会返回大于0的数,而DDL不一定会返回大于0的数也可能是0.
public class jdbc_ResultSet {
public static void main(String[] args) throws Exception {
//1.注册驱动
// Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:23306/atguigudb";
String username="root";
String password="0071hanxiaolei";
//返回的是一个connection 对象
Connection conn= DriverManager.getConnection(url,username, password);
//3.定义SQL语句
String sql="select * FROM account";
//4.获取statement对象
Statement stmt =conn.createStatement();
//5.执行sql
ResultSet rs = stmt.executeQuery(sql);
//6.处理结果 遍历rs中的所有数据
//光标向下移动一行,并且判断是否有数据
while(rs.next()){
//列数是从1开始的,不是从0开始
int id=rs.getInt(1);
String name=rs.getString (2);
double money=rs.getDouble(3);
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println("-----------------");
}
//7.释放资源
rs.close();
stmt.close();
conn.close();
}
}
步骤:
1.定义实体类Account
2.查询数据,封装到Account对象中
3.将Account对象存入ArrayList集合中
Account类
public class Account {
//对应表中的字段
private int id;
private String name;
private double money;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}
2.查询数据,将数据封装到Account对象里
3.将Account 对象存入ArrayList集合中
public class jdbc_ResultSet {
public static void main(String[] args) throws Exception {
//1.注册驱动
// Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:23306/atguigudb";
String username="root";
String password="0071hanxiaolei";
//返回的是一个connection 对象
Connection conn= DriverManager.getConnection(url,username, password);
//3.定义SQL语句
String sql="select * FROM account";
//4.获取statement对象
Statement stmt =conn.createStatement();
//5.执行sql
ResultSet rs = stmt.executeQuery(sql);
//创建集合
List<Account> list =new ArrayList<>();
//6.处理结果 遍历rs中的所有数据
//光标向下移动一行,并且判断是否有数据
while(rs.next()){
Account account = new Account();
//列数是从1开始的,不是从0开始
int id=rs.getInt(1);
String name=rs.getString (2);
double money=rs.getDouble(3);
//赋值
account.setId(id);
account.setName(name);
account.setMoney(money);
//存入集合
list.add(account);
}
System.out.println(list);
//7.释放资源
rs.close();
stmt.close();
conn.close();
}
}
注意这里的sql与变量的拼接方式
SQL注入
' or '1' = '1
public class jdbc_PreparedStatement {
public static void main(String[] args) throws Exception {
//1.注册驱动
// Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:23306/atguigudb";
String username="root";
String password="0071hanxiaolei";
//返回的是一个connection 对象
Connection conn= DriverManager.getConnection(url,username, password);
//模拟接受用户名和密码
String name="zhangsan";
String pwd ="asdfghjkl";
//3.定义一个sql语句
String sql ="select * FROM tb_user Where name = ? and password= ?";
//获取preparedStatement对象
PreparedStatement pstmt = conn.prepareStatement(sql);
//4.获取执行sql的对象statement
Statement stmt=conn.createStatement();
//设置?的值
pstmt.setString(1,name);
pstmt.setString(2,pwd);
//执行sql
ResultSet rs=pstmt.executeQuery(); //此处不用再传sql语句了,返回了一个ResultSet 结果集
//判断是否登录成功
if (rs.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
//7.释放资源 后人先出
rs.close();
pstmt.close();
conn.close();
}
}
Druid配置文件
driverClassName=com.mysql.cj.jdbc.Driver
#URL连接数据库的URL,其中travel(以下面例子来说)为连接的数据库,后面的参数可不改但不删
url=jdbc:mysql://localhost:23306/atguigudb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
characterEncoding=utf-8
#安装mysql时候设置的用户与密码
username=root
password=0071hanxiaolei
#初始化物理连接的个数
initialSize=5
#最大连接池数量
maxActive=10
#获取连接时最大等待时间
maxWait=3000
#用来检测连接是否有效的sql
validationQuery=SELECT 1
#保证安全性!
testWhileIdle=true
操作数据库步骤
1.查询所有数据
public class DruidDemo {
public static void main(String[] args) throws Exception {
//加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("jdbc_demo/src/druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取数据库连接 Connection
Connection conn = dataSource.getConnection();
//定义sql语句
String sql="select * FROM account";
//获取Prepare对象
PreparedStatement pstmt =conn.prepareStatement(sql);
//设置参数
//执行sql
ResultSet rs=pstmt.executeQuery();
//处理结果 List<Account> 封装Account对象,装载List集合
Account account=null;
List<Account> accountList=new ArrayList<>();
while (rs.next()){
//获取数据
int id = rs.getInt("id");
String name = rs.getString("name");
double money = rs.getDouble("money");
//封装Account对象
account=new Account();
account.setId(id);
account.setName(name);
account.setMoney(money);
//装载集合
accountList.add(account);
}
System.out.println(accountList);
//释放资源
rs.close();
pstmt.close();
conn.close();
//查看当前文件所在路径
// System.out.println(System.getProperty("user.dir"));
}
}
2.向数据库添加数据
public class DruidDemo2 {
public static void main(String[] args) throws Exception {
//模拟接收页面提交的数据
String name="香飘飘";
double money=50000;
//加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("jdbc_demo/src/druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取数据库连接 Connection
Connection conn = dataSource.getConnection();
//定义sql语句
String sql="insert into account(name,money) values(?,?);";
//获取Prepare对象
PreparedStatement pstmt =conn.prepareStatement(sql);
//设置参数
pstmt.setString(1,name);
pstmt.setDouble(2,money);
//执行sql
int count=pstmt.executeUpdate(); //返回的是影响的行数
//处理结果 List<Account> 封装Account对象,装载List集合
System.out.println(count>0);
//释放资源
pstmt.close();
conn.close();
//查看当前文件所在路径
// System.out.println(System.getProperty("user.dir"));
}
}
3.根据id修改
public class DruidDemo3 {
public static void main(String[] args) throws Exception {
//模拟接收页面提交的数据
String name="臭飘飘";
double money=80000;
int id=3;
//加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("jdbc_demo/src/druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取数据库连接 Connection
Connection conn = dataSource.getConnection();
//定义sql语句
String sql="update account set name=?,money=? where id=?";
//获取Prepare对象
PreparedStatement pstmt =conn.prepareStatement(sql);
//设置参数
pstmt.setString(1,name);
pstmt.setDouble(2,money);
pstmt.setInt(3,id);
//执行sql
int count=pstmt.executeUpdate(); //返回的是影响的行数
//处理结果 List<Account> 封装Account对象,装载List集合
System.out.println(count>0);
//释放资源
pstmt.close();
conn.close();
//查看当前文件所在路径
// System.out.println(System.getProperty("user.dir"));
}
}
4.根据id删除数据
public class DruidDemo4 {
public static void main(String[] args) throws Exception {
//模拟接收页面提交的数据
int id=3;
//加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("jdbc_demo/src/druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取数据库连接 Connection
Connection conn = dataSource.getConnection();
//定义sql语句
String sql="delete from account where id=?";
//获取Prepare对象
PreparedStatement pstmt =conn.prepareStatement(sql);
//设置参数
pstmt.setInt(1,id);
//执行sql
int count=pstmt.executeUpdate(); //返回的是影响的行数
//处理结果 List<Account> 封装Account对象,装载List集合
System.out.println(count>0);
//释放资源
pstmt.close();
conn.close();
//查看当前文件所在路径
// System.out.println(System.getProperty("user.dir"));
}
}
Maven
MyBatis
配置文件
1.logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<logger name="com.itheima" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</configuration>
2.mybatis_config.xml
官网复制的,用于数据库的连接,参数改成自己的
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<!--编写mybatis核心配置文件,解决硬编码问题-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:23306/mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="0071hanxiaolei"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载sql的映射文件-->
<!--统一管理sql语句,解决硬编码问题-->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
3.UserMapper.xml
写sql语句的
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace:名称空间
id:这条查询语句的唯一标识
resultType:返回值类型
-->
<mapper namespace="test">
<select id="selectAll" resultType="com.ithema.pojo.User">
select * from tb_user;
</select>
</mapper>
4.pom.xml
maven配置文件,导包用的
<dependencies>
<!-- mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<!-- junit测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<!-- 添加logback依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
User类
public class User {
private Integer id;
private String username;
private String password;
private String gender;
private String addr;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", gender='" + gender + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
MybatisDemo类
public class MybatisDemo {
public static void main(String[] args) throws IOException {
//1.加载mybatis的核心代码,获取SqlSessionFactory (官网cv过来)
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//重点在sqlsession
//2.获取SqlSession 对象,用他来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql
List<User> users = sqlSession.selectList("test.selectAll");
//4.处理结果
System.out.println(users);
//5.释放资源
sqlSession.close();
}
}
1.首先定义一个接口,接口最好单独存放在一个包内,然后在资源文件中定义一个与接口包名一样的
文件,把UserMapper放进去。这样在编译时,接口与配置文件才会在一起。
2.
设置UserMapper.xml中的namespace为mapper接口的全限定名
3.接口中的方法
public interface UserMapper {
//看返回的结果是一个还是集合,一个就用User对象.
List<User> selectAll();
}
4.编码
public class MybatisDemo2 {
public static void main(String[] args) throws IOException {
//1.加载mybatis的核心代码,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SqlSession 对象,用他来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql
// List<User> users = sqlSession.selectList("test.selectAll");
//3.1获取UserMapper接口代理对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
List<User> users=userMapper.selectAll();
//4.处理结果
System.out.println(users);
//5.释放资源
sqlSession.close();
}
}
5.细节
修改mybatis_config.xml
整套代码格式,看mybatis_demo文件
路径:
D:\javaweb\java\javacode\mybatis_demo
案例
BrandMapper.xml
<mapper namespace="com.ithema.mapper.BrandMapper">
<!-- 由于下滑线转驼峰命名,会有数据映射不上,所有用resultMap来映射
id:唯一标识
type:映射的类型,支持别名,忽略大小写
resultMap使用步骤:
1.定义<resultMap>标签
2.在<slect>标签中,使用resultMap属性替换resultType属性
-->
<resultMap id="brandResultMap" type="Brand">
<!-- 这里只写不一样的映射-->
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<!-- 直接映射resultMap中的就行-->
<select id="selectAll" resultMap="brandResultMap">
select *
from mybatis.tb_brand;
</select>
</mapper>
<!--
参数占位符
1. #{} :会将其替换成? 为了防止sql注入
2。${} :拼接字符串 存在sql注入问题
使用时机:
1.参数传递一定要用:#{}
2.表名或者列名不固定的时候:${}
特殊字符处理
1.转义字符
2.CDATA区 在里面写字符 大写CD回车就行
-->
<select id="selectById" resultMap="brandResultMap">
select *
from mybatis.tb_brand where id = #{id};
</select>
详细内容看
D:\javaweb\java\javacode\mybatis_demo
<!-- 动态多条件查询
if 完成条件判断
test;逻辑表达式
问题:
如果没有第一个条件,第二个条件语句多一个and, 可以利用恒等式解决 1=1
官方解决方式 <where><where>代替where,可以自动去掉第二个条件为第一个条件时的and
-->
<select id="selectByCondition" resultMap="brandResultMap">
select *
from mybatis.tb_brand
<where>
<if test="status!=null">
status = #{status}
</if>
<if test="companyName!=null and companyName!=''">
and company_name like #{companyName}
</if>
<if test="brandName!=null and brandName!=''">
and brand_name like #{brandName};
</if>
</where>
</select>
只要提供choose里的一个值就行。
<!-- 单条件动态查询
where标签可以动态查看查询条件是否正确,如果一个查询条件都没有,where将不匹配条件
-->
<select id="selectByConditionSingle" resultMap="brandResultMap">
select *
from mybatis.tb_brand
<where>
<choose>
<when test="status!=null">
status=#{status}
</when>
<when test="companyName!=null and companyName!=''">
and company_name like #{companyName}
</when>
<when test="brandName!=null and brandName!=''">
and brand_name like #{brandName}
</when>
</choose>
</where>
</select>
<insert id="add" useGeneratedKeys="true" keyProperty="id">
insert into mybatis.tb_brand(brand_name, company_name, ordered, description, status)
values (#{brandName},#{companyName},#{ordered},#{description},#{status});
</insert>
这里的useGeneratedKeys="true" keyProperty="id"
为了能获取到主键的值
/**
* 添加
*
*/
void add(Brand brand);
/**
* 添加
* 需要提交事务,事务回滚,否则数据添加不成功
* 如果在获取SqlSession对象时,添加参数true 则表示自动提交事务
*
*/
@Test
public void testAdd() throws IOException {
// 模拟页面上动态传过来的参数
int status=0;
String companyName="波导手机";
String brandName="波导";
String description="波导手机,手机中的战斗机";
int ordered=100;
//给对象参数法设置对象参数
Brand brand =new Brand();
brand.setStatus(status);
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setDescription(description);
brand.setOrdered(ordered);
//1.获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SqlSession 对象,用他来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3获取BrandMapper接口代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
//4.执行方法
brandMapper.add(brand);
//5.提交事务
sqlSession.commit();
//这里是获取主键的值
Integer id = brand.getId();
System.out.println(id);
//5.释放资源
sqlSession.close();
}
<update id="update">
update mybatis.tb_brand
set brand_name =#{brandName},
company_name =#{companyName},
ordered =#{ordered},
description =#{description},
status =#{status}
where id = #{id};
</update>
/**
* 修改
*
*/
@Test
public void testUpdate() throws IOException {
// 模拟页面上动态传过来的参数
int id =7;
int status=0;
String companyName="波导小手机";
String brandName="波导公司";
String description="波导手机,手机中的垃圾";
int ordered=200;
//给对象参数法设置对象参数
Brand brand =new Brand();
brand.setStatus(status);
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setDescription(description);
brand.setOrdered(ordered);
brand.setId(id);
//1.获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SqlSession 对象,用他来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3获取BrandMapper接口代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
//4.执行方法
int count= brandMapper.update(brand);
//5.提交事务
sqlSession.commit();
System.out.println(count);
//5.释放资源
sqlSession.close();
}
<!--修改数据-->
<update id="update">
update mybatis.tb_brand
<set>
<if test="brandName!=null and brandName!=''">
brand_name =#{brandName},
</if>
<if test="companyName!=null and companyName!=''">
company_name =#{companyName},
</if>
<if test="ordered!=null and ordered!=''">
ordered =#{ordered},
</if>
<if test="description!=null and description!=''">
description =#{description},
</if>
<if test="status!=null ">
status =#{status}
</if>
</set>
where id = #{id};
</update>
如果一个修改数据都没有,那么set就多余了,或者最后一个条件没有,多个逗号语法错误,所以用标签
<delete id="deleteByIds">
# mybatis中会将数组参数封装成一个Map集合
# 默认:array=数组
# 也可以使用@param注解改变map集合的默认key的名称
delete from mybatis.tb_brand where id
in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
;
</delete>
/**
* 批量删除
*
*/
void deleteByIds(@Param("ids") int[] ids);
HTTP
Servlet
provided 只在打包 编译时有效,运行时无效。防止与tomcat冲突
@WebServlet(urlPatterns = "/demo2",loadOnStartup = 0)
public class servlet_demo2 implements Servlet {
/**
* 初始化方法
* 调用时机:默认情况下,Servlet被第一次访问时,调用
* 通过loadOnStartup 默认为-1,如果改为正整数:就成了服务器启动时调用init()
*调用次数:1
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init>>>>");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务的方法
* 调用时机:每一次servlet被访问时调用
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello word");
}
/**
* 销毁方法
* 调用时机:内存释放或者服务器关闭时,servlet会被销毁
*/
@Override
public void destroy() {
System.out.println("destroy");
}
@Override
public String getServletInfo() {
return null;
}
}
@WebServlet("/demo3")
public class servlet_demo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get>>>>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post>>>>>");
}
}
Request Response
@WebServlet("/demo4")
public class servlet_demo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//get请求逻辑
System.out.println("GET>>>>");
//获取所有参数的map集合
Map<String,String[]> map =req.getParameterMap();
for (String key : map.keySet()) {
System.out.print(key+':');
//获取值
String[] values=map.get(key);
for (String value:values){
System.out.print(value+" ");
}
System.out.println();
}
//1.根据key,获取多个参数值
String[] hobbys=req.getParameterValues("hobby");
for (String hobby : hobbys) {
System.out.print(hobby);
}
//2.根据key,获取单个参数值,getParameter比较常用
String username=req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//post 请求逻辑
System.out.println("POST>>>>");
//获取所有参数的map集合
Map<String,String[]> map =req.getParameterMap();
for (String key : map.keySet()) {
System.out.print(key+':');
//获取值
String[] values=map.get(key);
for (String value:values){
System.out.print(value+" ");
}
System.out.println();
}
//1.根据key,获取多个参数值
String[] hobbys=req.getParameterValues("hobby");
for (String hobby : hobbys) {
System.out.print(hobby);
}
//2.根据key,获取单个参数值,getParameter比较常用
String username=req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
}
}
Idea模板创建servlet
//post 请求逻辑
//解决控制台中文乱码问题
req.setCharacterEncoding("UTF-8"); //设置字符输入流的编码
//2.根据key,获取单个参数值,getParameter比较常用
String username=req.getParameter("username");
//解决get控制台乱码问题
username=new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
System.out.println("response>>");
System.out.println("demo8");
//重定向
//1.设置响应状态码为 302
response.setStatus(302);
//2.设置响应头 Location
//动态获取虚拟目录
String contextPath=request.getContextPath();
// response.setHeader("Location","/tomcat_demo3/demo9");
//简化重定向方法
response.sendRedirect(contextPath+"/demo9");
一定要写虚拟目录
//设置响应数据的格式及编码
response.setContentType("text/html;charset=utf-8");
//1.获取字符输出流
PrintWriter writer =response.getWriter();
writer.write("你好");
writer.write("<h1>你好<h1>");
//1.读取文件
FileInputStream fis = new FileInputStream("d://images/a1.png");
//2.获取response 字节输出流
ServletOutputStream os = response.getOutputStream();
//3.完成流的copy
// byte [] buff= new byte[1024];
// int len=0;
// while ((len= fis.read(buff))!=-1){
// os.write(buff,0,len);
// }
//maven导入 io依赖 使用工具类简化字节流复制操作
IOUtils.copy(fis,os);
fis.close();
ssm