JavaEE入门级别最全教程4--初学者必看
Posted J哥.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaEE入门级别最全教程4--初学者必看相关的知识,希望对你有一定的参考价值。
健康万岁,商业无罪,大家好我是Laity也是你们的J哥。
一、JavaWeb介绍
使用Java技术来解决相关web互联网领域的技术栈(其实就是开发网站)
Java 的 api齐全,历史悠久。(后台开发工程师主要数据库和JavaWeb程序的开发)
二、数据库
2.1 mysql
2.1.1 数据库
DB
2.1.2 数据库管理系统
管理数据库的大型软件(MYSQL就是DBMS)
2.1.3 SQL
操作数据库的编程语言(操作市面上所有的关系型数据库)
-
关系型数据库
-
Mysql
-
Oracle
-
SQLite
-
SQL Server
-
-
非关系型数据库
-
MangoDb
-
2.1.4 Mysql安装
MySQL :: Download MySQL Community Server (Archived Versions) Mysql5.7.24
解压即可 -- 配置环境遍历 -- 系统变量 --
新建 MYSQL_HOME = D:...
Path -- %MYSQL_HOME%\\bin
在安装目录创建一个 my.ini
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
default-storage-engine=INNODB
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,EEROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
2.1.5 初始化Mysql
cmd中管理员窗口
mysqld --initialize-insecure
c/windows/system32/cmd.exe
2.1.6 注册Mysql的服务
cmd
mysqld -install
2.1.7 启动Mysql服务
net start mysql // 启动服务
net stop mysql // 停止服务
2.1.8 查看本机服务(windows)
services.msc
2.1.9 修改默认账户密码
mysqladmin -uroot password 1234
2.1.10 登录参数
mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口(默认3306)
mysql -ulaity -pLaity123? -h39.106.227.23 -P3306
2.1.11 cmd导入数据
首先创建数据库
create database mynewblog
把上传上去的sql导入到数据库中
传:将sql文件上传到root下
按照下面的三个步骤,快速导入这个sql文件
mysql>use mynewblog;
mysql>set names utf8;
mysql>source /root/database.sql;
然后屏幕上就会不断的滚,最后提示导入成功。
最后,记得将database.sql删除
确定数据表是否创建成功,即数据文件是否导入成功。
执行命令 show tables;查看数据库下的表。
删除数据库
drop database <数据库名>;
如果遇到 Unknown collation: 'utf8mb4_0900_ai_ci'
• 把文件中的所有的utf8mb4_0900_ai_ci替换为utf8_general_ci
• 以及utf8mb4替换为utf8
否则会报 COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'
-- 向表中插入数据
CREATE TABLE 表名
id ...
username ...
password ...
;
INSERT INTO 表名(id,username,password) value(1,"Laity", 123456);
2.1.12 约束
概念:
-
约束是作用于表中列上的规则,用于限制加入表的数据。
-
约束的存在保证了数据库中数据的正确性、有效性和完整性。
约束的分类:
约束名称 | 描述 | 关键字 |
---|---|---|
非空约束 | 保证列中所有数据不能有null值 | NOT NULL |
唯一约束 | 保证列中所有数据各个不同 | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
检查约束 | 保证列中的值满足某一条件 | CHECK |
默认约束 | 保存数据时,未指定值则采用默认值 | DEFAULT |
外键约束 | 外键用来让两个表的数据之间建立连接,保证数据的唯一性和完整性 | FOREIGN KEY |
MYSQL不支持检查约束
auto_increment :当列时数字类型并且 唯一约束
2.1.13 详解外键约束
概念: 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性
-- 创建表时添加外键约束
create table 表名
列名 数据类型
...
[constraint] [外键名称] foreign key(外键名) references 主表(主表列名)
;
-- 建完表后添加外键约束
alter table 表名 add constraint 外键名称 foreign key (外键字段名称) references 主表名称(主表列名称);
-- 删除外键
alter table 表名 drop foreign key 外键名称
2.1.14 数据库设计
-
一对多
-
一对一
-
多对多
2.1.15 多表查询
-
笛卡尔积:取A,B集合所有组合情况
-
多表查询:从多张表查询数据
-
连接查询
-
内连接:相当于查询A B交集数据
-
外连接:
-
左外连接:相当于查询A表所有数据和交集部分数据
-
右外连接:相当于查询B表所有数据和交集部分数据
-
-
-
子查询
-
连接查询
内连接
-- 隐示内连接
select 字段列表 from 表1,表2... where 条件;
-- 显示内连接
select 字段列表 from 表1 [inner] join 表2 on 条件;
-- 内连接相当于查询A B表交集数据
外连接
-- 左外连接
select 字段列表 from 表1 left [inner] join 表2 on 条件;
-- 右外连接
select 字段列表 from 表1 right [inner] join 表2 on 条件;
-- 左外连接:相当于查询A表所有数据和交集部分数据
-- 右外连接:相当于查询B表所有数据和交集部分数据
子查询
-- 概念:查询中嵌套查询,称嵌套查询为子查询
-- 子查询根据查询结果不同,作用不同:
-- 单行单列:作为条件值,使用 = != > < 等进行条件判断
select 字段列表 from 表 where 字段名 = (子查询);
-- 多行单列:作为条件值,使用in等关键字进行条件判断
select 字段列表 from 表 where 字段名 in (子查询);
-- 多行多列:作为虚拟表
select 字段列表 from (子查询) where 条件;
2.1.16 事务
-- 事务: 广泛应用于银行系统和订单系统等 表的引擎类型必须是 innodb类型才可以使用事务,这也是MySQL默认引擎
所谓事务,它是一个操作系统,要么都执行,要么都不执行,是不可分割的单位。
事务四大特征:(ACID)
1.原子性(A) :整个事务中的所有操作要么成功要么不成功
2.一致性(C) :最终执行的结果是一样的 中间出了问题也不会出现数据丢了的情况
3.隔离性(I) :当事务开启之后:一个事务所做的修改在最终提交前,对其它事务是不可见的(一个sql的执行不会影响到另外一个sql)
4.持久性(D) :一旦事务提交 commit,则其所做的修改会永久保存到数据库 (此时即使数据库系统崩溃,修改的数据也不会丢失)
-- 事务开启 :begin; / start transaction; 中间:sql语句 事务提交 ,结束: commit; 回滚事务:放弃缓存中变更的数据: rollback;
2.2 JDBC
概念:通过Java代码操作关系型数据库的一套API
2.2.1 JDBC驱动jar包下载
-
操作系统选择Platform Independent,下方列表中的两条记录,后缀tar.gz的是Linux版本,.zip的是windows版本。我用的是5.1.48
-
这里下载windows版本的jdbc驱动,版本为8.0.18
-
跳过登录,直接点击红框里的内容,进行下载
2.2.2 JDBC 快速入门
-
创建工程,导入驱动jar包
-
注册驱动
-
Class.forName(“com.mysql.jdbc.Driver”);
-
-
获取连接
-
Connection conn = DriverManager.getConnection(url,username,password);
-
-
定义SQL语句
-
String sql = “update...”;
-
-
获取SQL对象
-
Statement stmt = conn.createStatement();
-
-
执行SQL
-
stmt.executeUpdate(sql);
-
-
处理返回结果
-
释放资源
package com.SqlJDBC.JDBCdemo1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.SqlJDBC.JDBCdemo1
* @date Date : 2021年12月10日 14:05
* @Description: Java语言操作数据库(JDBC快速入门)
*/
public class JDBCTest
public static void main(String[] args) throws ClassNotFoundException, SQLException
// 1. 注册驱动 可以省略不写
Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接 三个参数url username password
// 2.1 jdbc:mysql:// 固定语法
// 2.2 简写 jdbc:mysql:///
String url = "jdbc:mysql://127.0.0.1:3306/java"; // ?useSSL=false
String username = "root";
String password = "wang9264";
Connection conn = DriverManager.getConnection(url, username, password);
// 3. 定义一个SQL语句
String sql = "update account set money = 2000 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();
2.2.3 JDBC API详解
JDBC API 详解 : DriverManager
package com.SqlJDBC.JDBCdemo1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.SqlJDBC.JDBCdemo1
* @date Date : 2021年12月10日 14:05
* @Description: Java语言操作数据库(JDBC API 详解 : DriverManager)
*/
public class JDBCTest2_DriverManager
public static void main(String[] args) throws ClassNotFoundException, SQLException
// 1. 注册驱动 可以省略不写
// Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接 三个参数url username password
// 2.1 jdbc:mysql:// 固定语法
// 2.2 简写 jdbc:mysql:///
String url = "jdbc:mysql:///java?useSSL=false";
String username = "root";
String password = "wang9264";
Connection conn = DriverManager.getConnection(url, username, password);
// 3. 定义一个SQL语句
String sql = "update account set money = 2000 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 详解 : Connection(事务)
package com.SqlJDBC.JDBCdemo1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.SqlJDBC.JDBCdemo1
* @date Date : 2021年12月10日 14:05
* @Description: Java语言操作数据库(JDBC API 详解 : Connection)
*/
public class JDBCTest3_Connection
public static void main(String[] args) throws ClassNotFoundException, SQLException
// 1. 注册驱动 可以省略不写
// Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接 三个参数url username password
// 2.1 jdbc:mysql:// 固定语法
// 2.2 简写 jdbc:mysql:///
String url = "jdbc:mysql:///java?useSSL=false";
String username = "root";
String password = "wang9264";
Connection conn = DriverManager.getConnection(url, username, password);
// 3. 定义一个SQL语句
String sql1 = "update account set money = 3000 where id = 1";
String sql2 = "update account set money = 3000 where id = 2";
// 4. 获取执行sql的对象,Statement
Statement stmt = conn.createStatement();
// 开启事务
conn.setAutoCommit(false);
try
// 5.执行sql
int count1 = stmt.executeUpdate(sql1); // 受影响的行数
// 6.处理结果
System.out.println(count1);
int count2 = stmt.executeUpdate(sql2); // 受影响的行数
System.out.println(count2);
// 提交事务
conn.commit();
catch (Exception throwables)
// 回滚事务
conn.rollback();
throwables.printStackTrace();
// 7.释放资源
stmt.close();
conn.close();
JDBC API 详解 : Statement
package com.SqlJDBC.JDBCdemo1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.SqlJDBC.JDBCdemo1
* @date Date : 2021年12月10日 14:05
* @Description: Java语言操作数据库(JDBC API 详解 : Statement)
*/
public class JDBCTest4_Statement
public static void main(String[] args) throws Exception
// testDML();
testDDL();
/**
* 执行DML语句
*
* @throws Exception
*/
public static void testDML() throws Exception
String url = "jdbc:mysql:///java?useSSL=false";
String username = "root";
String password = "wang9264";
Connection conn = DriverManager.getConnection(url, username, password);
// 3. 定义一个SQL语句
String sql1 = "update account set money = 3000 where id = 1";
// 4. 获取执行sql的对象,Statement
Statement stmt = conn.createStatement();
// 5.执行sql
int count1 = stmt.executeUpdate(sql1); // 执行完DML, 受影响的行数
// 6.处理结果
if (count1 > 0)
System.out.println("修改成功~");
else
System.out.println("修改失败~");
// 7.释放资源
stmt.close();
conn.close();
/**
* 执行DDL语句
*
* @throws Exception
*/
public static void testDDL() throws Exception
String url = "jdbc:mysql:///java?useSSL=false";
String username = "root";
String password = "wang9264";
Connection conn = DriverManager.getConnection(url, username, password);
String sql1 = "create databases javadb";
Statement stmt = conn.createStatement();
// 5.执行sql
int count1 = stmt.executeUpdate(sql1); // 执行完DDL, 受影响的行数
// 6.处理结果
if (count1 > 0)
System.out.println("修改成功~");
else
System.out.println("修改失败~");
// 7.释放资源
stmt.close();
conn.close();
JDBC API 详解 : ResultSet
package com.SqlJDBC.JDBCdemo1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.SqlJDBC.JDBCdemo1
* @date Date : 2021年12月10日 14:05
* @Description: Java语言操作数据库(JDBC API 详解 : ResultSet)
*/
public class JDBCTest5_ResultSet
public static void main(String[] args) throws Exception
// testDML();
testResult();
/**
* 执行Result语句 DQL查询语句
*
* @throws Exception
*/
public static void testResult() throws Exception
String url = "jdbc:mysql:///java?useSSL=false";
String username = "root";
String password = "wang9264";
Connection conn = DriverManager.getConnection(url, username, password);
String sql = "select * from account";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// 遍历结果
// 光标向下移动一行,并且判断当前行是否有数据
while (rs.next())
// 获取数据
int id = rs.getInt(1); // 也可写名称 id
String name = rs.getString(2); // name
double money = rs.getDouble(3); // money
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println("-----------------------");
// 释放资源
rs.close();
stmt.close();
conn.close();
JDBC API 详解 : PrepareStaement
-
作用
-
预防sql注入
-
-
sql注入
-
就是通过操作输入来修改事先定义好的sql语句,用以达到执行代码对服务器进行公鸡的方法。
-
-- 正常
select * from tb_user where username = "zhangsan" and password="123";
-- ' or '1' = '1
select * from tb_user where username='fafafadfaf' and password ='' or '1' = '1'
-- 怎么防止sql注入
-- 就是将敏感字符进行转义
-- String url = "jdbc:mysql:///java?useSSL=false&useServerPrepStmts=true"; // useServerPrepStmts=true开启预编译功能
// sql注入案例
package com.SqlJDBC.JDBCdemo1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.SqlJDBC.JDBCdemo1
* @date Date : 2021年12月10日 14:05
* @Description: Java语言操作数据库(JDBC API 详解 : SQL注入)
*/
public class JDBCTest6_UserLogin
public static void main(String[] args) throws Exception
testUserLogin();
testLogin_Inject();
/**
* 用户登录
*
* @throws Exception
*/
public static void testUserLogin() throws Exception
String url = "jdbc:mysql:///java?useSSL=false";
String username = "root";
String password = "wang9264";
Connection conn = DriverManager.getConnection(url, username, password);
// 接收输入的用户名和密码
String name = "laity";
String pwd = "123";
String sql = "select * from tb_user where username='" + name + "' and password ='" + pwd + "'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// 判断登录成功与否
if (rs.next())
System.out.println("登录成功");
else
System.out.println("登录失败");
// 释放资源
rs.close();
stmt.close();
conn.close();
/**
* 用户登录注入
*
* @throws Exception
*/
public static void testLogin_Inject() throws Exception
String url = "jdbc:mysql:///java?useSSL=false";
String username = "root";
String password = "wang9264";
Connection conn = DriverManager.getConnection(url, username, password);
// 接收输入的用户名和密码
String name = "fafafadfaf";
String pwd = "' or '1' = '1";
String sql = "select * from tb_user where username='" + name + "' and password ='" + pwd + "'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// 判断登录成功与否
if (rs.next())
System.out.println("登录成功");
else
System.out.println("登录失败");
// 释放资源
rs.close();
stmt.close();
conn.close();
// 通过prepareStaement解决sql注入问题
package com.SqlJDBC.JDBCdemo1;
import java.sql.*;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.SqlJDBC.JDBCdemo1
* @date Date : 2021年12月10日 14:05
* @Description: Java语言操作数据库(JDBC API 详解 : SQL注入)
*/
public class JDBCTest7_ProparedStatement
public static void main(String[] args) throws Exception
testLogin_Inject();
/**
* 用户登录注入
*
* @throws Exception
*/
public static void testLogin_Inject() throws Exception
String url = "jdbc:mysql:///java?useSSL=false&useServerPrepStmts=true"; // useServerPrepStmts=true开启预编译功能
String username = "root";
String password = "wang9264";
Connection conn = DriverManager.getConnection(url, username, password);
// 接收输入的用户名和密码
String name = "fafafadfaf";
String pwd = "' or '1' = '1";
String sql = "select * from tb_user where username= ? and password = ? ";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, pwd);
System.out.println(sql);
ResultSet rs = pstmt.executeQuery();
// 判断登录成功与否
if (rs.next())
System.out.println("登录成功");
else
System.out.println("登录失败");
// 释放资源
rs.close();
pstmt.close();
conn.close();
2.2.4 数据库连接池
概念:一个容器,负责发配、管理数据库连接(Connection)
-
好处
-
资源重用
-
提升系统响应速度
-
避免数据库连接漏洞
-
数据库连接池实现
-
标准接口: DataSource
-
官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口。
-
功能:获取连接
-
Connection getConnection();
-
常见的数据库连接池:
-
DBCP
-
C3P0
-
Druid
-
-
Druid(德鲁伊)
-
Druid连接池是阿里巴巴开源的数据库连接池项目。
-
功能强大,性能优秀,是Java语言最好的数据库连接池之一。
-
Druid使用
-
下载(1.1.12)
-
Druid配置文件的配置
-
导入jar包后,将配置文件复制到项目下的src文件夹中
-
-
-
复制好后双击打开配置文件修改配里面的参数就可以使用了。
-
基础配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///java?useSSL=false&useServerPrepStmts=true
username=root
password=wang9264
# 初始化连接数量
initialSize=5
# 最大连接数量
maxActive=10
# 最大等待时间 ms
maxWait=3000
可参考本人博客 Druid详细配置
package com.SqlJDBC.druid;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.SqlJDBC.druid
* @date Date : 2021年12月10日 21:59
* @Description: Druid数据库连接池的使用
*/
public class DruidDemo
public static void main(String[] args) throws Exception
System.out.println(System.getProperty("user.dir")); // 打印当前所在路径
// 1.导入jar包
// 2.定义配置文件
// 3.加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("FrontEndDirection/src/druid.properties"));
// 4.获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 5.获取数据库连接 Connection
Connection connection = dataSource.getConnection();
System.out.println(connection);
注意:在实体类中,基本数据类型建议使用其对应的包装类型
2.3 Maven
-
Maven是专门管理和构建Java项目的工具,它的主要功能有:
-
提供一套标准化的项目结构(eclipse、idea通用代码)
-
提供一套标准化的构建流程(编译、测试、打包、发布......)
-
提供一套依赖管理机制(jar包、插件等)
-
2.3.1 Maven 安装配置
-
说明:当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包:
-
如果有,则在项目中之间引用;
-
如果没有,则会去中央仓库中下载对应的jar包到本地仓库。
-
-
下载仓库地址: maven下载
-
配置环境变量:
紧接着在path中设置:
-
然后运行:mvn -version 当出现下面内容说明环境变量配置成功
-
配置本地仓库: 修改conf/settings.xml中的<localReponsitory>为一个指定目录
-
配置阿里云的私服:修改conf/settings.xml中的 <mirrors>标签,为其添加如下子标签:(下载速度很快)
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
2.3.2 Maven的基本使用
2.3.2.1 Maven的常用命令
-
compile:编译
-
clean:清理
-
test:测试
-
package:打包(生成jar包)
-
windows java -jar xxx 运行
-
liunx nohup java -jar xxx.jar &
-
如果想停止jar运行,ps -ef查看进程(进程多的话也可以加上grep),找到对应的java进程,kill掉。
-
jar xvf test.jar 解压包
-
-
install:安装(将jar包存储到本地仓库中)
2.3.2.2 Maven的生命周期
-
Maven构建项目生命周期描述的是 一次构建过程经历 一共经历了多少个事件
-
Maven对项目构建的生命周期划为3套
-
clean:清理工作
-
default:核心工作,例如编译,测试,打包,安装等
-
site:产生报告,发布站点等
-
-
同一生命周期内,执行后面的命令,前面的所有命令会自动执行(complie->clean->test->package->install)
2.3.2.3 IDEA 配置 Maven环境
-
选择IDEA中File --> Settings
-
搜索 maven
-
设置IDEA 使用本地安装的 Maven,并修改配置文件路径
2.3.2.4 Maven坐标详情
-
Maven中的坐标是 资源的唯一标识
-
使用坐标来定义项目或者引入项目中需要的依赖
-
Maven坐标的主要组成
-
groupld:定义当前Maven项目隶属组织的名称(通常是域名反写,例如:com.itlaity)
-
artifactld:定义当前Maven项目的名称(通常是模块的名称,例如:order-server、goods-server)
-
version:定义当前项目版本号
-
2.3.2.5 创建Maven项目
参考:IntelliJ IDEA 15 创建maven项目 - Tom1997 - 博客园
2.3.2.5 IDEA 导入Maven项目
2.3.2.6 Maven插件
配置Maven-Helper插件
-
选择IDEA中 File ->Settings
-
选择 Plugins
-
搜索 Maven,现在第一个 Maven Helper,点击install安装即可
-
重启IDEA
2.3.3 依赖管理
使用坐标导入jar包
-
在pom.xml 中编写 <dependencies>标签
-
在<dependencies> 标签中 使用<dependency> 引入坐标
-
定义坐标的 groupld,artifatld,version
-
点击刷新按钮,使坐标生效。
<!--导入mysql 驱动 jar包-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
</dependencies>
2.4 MyBatis
-
Mybatis 是一款优秀的持久层框架,用于简化 JDBC开发,它支持定制化 SQL、存储过程以及高级映射。
-
持久层就是负责将数据保存到数据库的那一层代码。
-
JavaEE三层架构:表现层、业务层、持久层。
-
表现层:页面展示的。
-
业务层:使用来做逻辑处理的。
-
-
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
2.4.1 MyBatis快速入门
pom.xml内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--当前项目的坐标-->
<groupId>com.itlaity</groupId>
<artifactId>maven-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!--导入mysql 驱动 jar包-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<!--单元测试的坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- mybatis 依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- 添加日志支持 -->
<!-- log4j日志系统 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- simple logg facade for java(slf4-api.jar)日志接口 和 log4j具体日志系统之间的适配器 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
</dependency>
<!-- 添加logback-classic依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 安装logback-core 依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
</project>
放到src/main/resources/ 的日志配置文件logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 -->
<!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 -->
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds"
debug="false">
<!-- 动态日志级别 -->
<jmxConfigurator />
<!-- 定义日志文件 输出位置 -->
<property name="log_dir" value="../logs" />
<!-- <property name="log_dir" value="/home/data/logs/src" /> -->
<!-- 日志最大的历史 30天 -->
<property name="maxHistory" value="30" />
<!-- ConsoleAppender 控制台输出日志 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
<!-- 设置日志输出格式 -->
[%dyyyy-MM-dd HH:mm:ss.SSS][%logger:%line]%-5level -- %msg%n
</pattern>
</encoder>
</appender>
<logger name="com.itlaity" level="DEBUG" additivity="false">
<appender-ref ref="console"/>
</logger>
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器,只记录WARN级别的日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR,INFO,WARN,DEBUG</level>
</filter>
<!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责出发滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志输出位置 可相对、和绝对路径 -->
<fileNamePattern>
$log_dir/%dyyyy-MM-dd/logback.log
</fileNamePattern>
<maxHistory>$maxHistory</maxHistory>
</rollingPolicy>
<encoder>
<pattern>
<!-- 设置日志输出格式 -->
[%dyyyy-MM-dd HH:mm:ss.SSS][%logger:%line]%-5level -- %msg%n
</pattern>
</encoder>
</appender>
<root>
<!-- 打印TRACE级别日志及以上级别日志 -->
<level value="DEBUG" />
<!-- 控制台输出 -->
<appender-ref ref="console" />
<!-- 文件输出 -->
<appender-ref ref="file" />
</root>
</configuration>
彩色日志bogback.xml(了解)
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_NAME" value="MY_APP_NAME" />
<property name="LOG_DIR" value="logs" />
<property name="FILE_LOG_PATTERN" value="%dyyyy-MM-dd HH:mm:ss.SSS %-5level [%thread] %logger15 - %msg%n" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="%dyyyy-MM-dd HH:mm:ss.SSS %highlight(%-5level) %boldYellow([%thread]) %cyan(%logger15) %msg%n"/>
<contextName>$APP_NAME</contextName>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>$CONSOLE_LOG_PATTERN</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>$LOG_DIR/logFile.log</file>
<append>true</append>
<encoder>
<pattern>$FILE_LOG_PATTERN</pattern>
</encoder>
</appender>
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>$LOG_DIR/dayLogFile.%dyyyy-MM-dd.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>$FILE_LOG_PATTERN</pattern>
</encoder>
</appender>
<!-- 使用root的appender-ref -->
<logger name="com.example.Logger1" level="DEBUG" additivity="true">
</logger>
<!-- 不使用root的appender-ref -->
<logger name="com.example.Logger2" level="DEBUG" additivity="false">
</logger>
<logger name="com.example.Logger3" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="RollingFile" />
</root>
</configuration>
放到src/main/resources/ 的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">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///java?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="wang9264"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载sql映射文件 自建-->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
放到src/main/resources/ 的映射的 SQL 语句文件
注意文件名称一定是有标识性的 例如:对用户表进行操作 UserMapper.xml等
<?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:名称空间
resultType:对应你建立的包名
id:唯一标识不能重复
-->
<mapper namespace="test">
<select id="selectAll" resultType="com.itlaity.pojo.User">
select * from mybatis_user;
</select>
</mapper>
开始写代码src\\main\\java\\com\\itlaity\\pojo\\User.java
package com.itlaity.pojo;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.itlaity
* @date Date : 2021年12月12日 1:37
* @Description: 实体类
*/
// 按住atl+鼠标左键 整列编辑
public class User
private Integer id;
private String username;
private String password;
private char gender;
private String addr;
// 添加get和set方法
/**
* 在java中,为了保证数据的安全性,
* 我们会把数据定义为private等(私有、封装),
* 如果想要调用就会用到set()方法与get方法或者构造函数方法。
* 这里说的是第一种方法,set()与get()
*/
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 char getGender()
return gender;
public void setGender(char 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 + '\\'' +
'';
测试类src\\main\\java\\com\\itlaity\\MyBatisDemo.java
package com.itlaity;
import com.itlaity.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.itlaity
* @date Date : 2021年12月12日 1:55
* @Description: 测试类
*/
public class MyBatisDemo
public static void main(String[] args) throws Exception
// 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");
System.out.println(users);
// 释放资源
sqlSession.close();
如果你认为麻烦
同学我送你一句话: 今朝有酒,今朝醉。明日愁来,明日愁。
2.4.2 Mapper代理开发
-
解决原生方法中的硬编码
-
简化后期执行SQL
设置SQL映射文件的namespace
-
定义一个与sql映射文件同名的mapper接口,并且将Mapper接口和sql映射文件放置在同一目录下(创建目录用 / 来创建)
-
属性为Mapper接口权限定名
-
在mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
-
List<User> selectAll();
-
-
编码
-
通过SqlSession的getMapper方法获取 Mapper接口的代理对象
-
调用对应方法完成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:名称空间
resultType:对应你建立的包名
id:唯一标识不能重复
-->
<!--设置SQL映射文件的namespace属性为Mapper接口权限定名-->
<mapper namespace="com.itlaity.mapper.UserMapper">
<select id="selectAll" resultType="com.itlaity.pojo.User">
select *
from mybatis_user;
</select>
</mapper>
2.4.3 特殊字符处理
// 在编写sql语句中
参数占位符
1.# :执行sql时,会将#占位符替换成 ?,将来自动设置参数值
2.$ :拼sql,会存在sql注入问题。
parameterType:
用于设置参数类型,该参数可以省略。
< 是写不了的 怎么解决呢
1.转义字符
2.CDATA区
2.4.4 注解完成增删改查
-
增(insert)
-
注意默认开启事务:需要手动提交事务 sqlSession.commit();
-
或者在获取 SqlSession时 添加参数 true
-
主键返回:在数据添加成功后,需要获取插入数据库的主键的值
-
只需在sql语句中参加两个属性: useGeneratedKeys 和 KeyProperty
-
返回结果 void
-
-
修改(updata)
-
修改全部字段 上面的JDBC就已经学过
-
修改动态字段 书写动态SQL语句
-
<set><if></if> where id = #id</set>
-
-
-
删除(delete)
-
删除一个
-
delete from 表 where id = #id
-
-
删除多个
-
void deleteByids(@Param("ids") int[] ids) // @Param("ids")注解改变map集合的默认key的名称
-
delete from 表 where id in <foreach collection="ids" item="id" separator="," open="(" close=")"> #id </foreach>
-
-
-
结论 :大多数参数都封装为Map集合,可以使用@Param 注解,替换Map集合中默认的arg键名 param键名。
2.4.5 动态SQL
// 在编写sql语句中(多条件查询)
动态sql(搜索添加一个需要三个参数,但用户只输入1个参数)
1.我们需加条件判断即可
2.<if test="参数 != null and 参数!= '' "> 执行要求参数 </if>
3.问题: 第一个条件不需要逻辑运算符
1. 解决方案 :恒等式 1=1/ <where> 替换 where 关键字
// 单条件查询
<choose> <!--相当于 switch-->
<when> <!--相当于 case-->
</when>
<otherwise><!--default-->
1 = 1
</otherwise>
</choose>
2.4.6 注解开发
-
查询:@Select
-
添加:@Insert
-
修改:@Updata
-
删除:@Delete
-
提示:注解完成简单功能,配置文件完成复杂功能。
// 在maaper接口中写
@select("sql语句")
User selectById();
// UserMapper.xml中就不需要写了
接JavaEE入门级别最全教程1--初学者必看
接JavaEE入门级别最全教程2--初学者必看
接JavaEE入门级别最全教程3--初学者必看
JavaWeb结束之后会学习基础的html等等 这里的技术栈J哥以前就发表过文章
也可以看我的另一个博客
感谢大家的观看!!!
以上是关于JavaEE入门级别最全教程4--初学者必看的主要内容,如果未能解决你的问题,请参考以下文章