从开始使用Windows软件到自己编程,一切有点东西
的软件都需要涉及到数据库,它存储着我们的重要信息~-~
开始
你可能首先知道这些?
1.为什么要使用数据库?
数据库是做数据持久化保存的一种方式!
2.什么是数据持久化,它与什么相对应?
数据在创建和使用过程中都是在内存中进行的,我们要将他保存下来可以下一次使用,将数据模型转为存储模型的过程叫持久化操作!
3.Java连接数据库或者说Java操纵数据库前期我们需要准备什么?
1.首先你要有一个数据库!这里我们使用的是MySql
关于Windows和Linux下Mysql数据库的安装:
MySql官方Download:下载地址
Windows
Linux安装mysql并配置外网访问
2.你需要Java连接Mysql的驱动
第一节:Java连接数据库-jdbc
1.在环境中导入jar包
可以通过Maven方式或者lib导入jar
2.开始编码阶段
①加载驱动
Class.forName("com.mysql.jdbc.Driver");
//在新版的mysql驱动中是
Class.forName("com.mysql.cj.jdbc.Driver");
②获取数据库连接
/**
url:jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&useUTF-8=true&character=utf-8&useSSL=true
此前你需要定义 url,user,password
*/
Connection connection = DriverManager.getConnection(url, user, password);
③获取prepareStatement或者Statement
//这里需要传入sql ,字符串的拼接形式or? 这里涉及到sql注入问题
PreparedStatement preparedStatement = connection.prepareStatement(sql);
④获取结果集ResultSet
//如果是查询使用以下方式
ResultSet resultSet=preparedStatement.executeQuery();
⑤将结果集放入Entity中
List<T> list=new ArrayList<>();
//新建T类型 放入list集合中,当然如果是单个查询返回T即可
⑥关闭连接
//一定不要忘记,要关闭连接
closeAll(connection,preparedStatement,resultSet);
第二节:自己封装jdbc+Spring的JdbcTemplate
封装JDBC的思路是使用模板方法模式,将其中的公有部分抽取出来
最后封装如下:
1.获取连接:
public static Connection getConnection() {
final String url = "jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&useUTF-8=true&character=utf-8&useSSL=true";
final String user = "root";
final String password = "xxx";
Connection connection=null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
2.执行查询操作
public static <T> List ExecuteQuery(String sql , QueryMap<T> queryMap){
List<T> list=new ArrayList<>();
Connection connection=getConnection();
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
try {
preparedStatement = connection.prepareStatement(sql);
resultSet=preparedStatement.executeQuery();
while (resultSet.next()){
list.add(queryMap.MapSet(resultSet)) ;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
closeAll(connection,preparedStatement,resultSet);
}
return list;
}
3.执行更新操作
public static int ExecuteUpdate(String sql, Object ...s){
int result=0;
Connection connection=null;
PreparedStatement preparedStatement=null;
try {
connection=getConnection();
preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < s.length; i++) {
preparedStatement.setObject(i+1,s[i]);
}
result = preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
closeAll(connection,preparedStatement,null);
}
return result;
}
4.关闭所有
public static void closeAll(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
try {
if (connection!=null){
connection.close();
}
if (preparedStatement!=null){
preparedStatement.close();
}
if (resultSet!=null){
preparedStatement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
5.关于rowMap
import java.sql.ResultSet;
public interface QueryMap<T> {
<T> T MapSet(ResultSet resultSet);
}
6.SpringJdbcTemplate?
封装的思想是使用模板方法模式将共同的抽取出来,变化的使用策略模式,实时传入的思想。
第三节:什么是数据源?DataSource,数据库连接池?
数据源顾名思义就是数据的来源
在Java中Mysql配置一般最少需要url,user,password.
数据库连接池:创建数据库连接是一个很耗费时间和资源的事情,每次将使用完连接归还到池子当中,每次从池子中取,有效的解决了创建耗费资源的问题。而且在大多数框架中都要使用数据库连接池!
数据库连接池现在有哪些呢?
如:c3p0,dbcp,Druid等
第四节:配置使用Mybatis
配置步骤及Mapper.xml的配置
Mybatis-Maven:https://mvnrepository.com/artifact/org.mybatis/mybatis
Mybatis官网:http://www.mybatis.org/mybatis-3/
1.导入jar包
2.配置mybatis-config.xml
3.书写接口
4.书写接口Mapper.xml(SQL语句)
5.执行调用
第五节:Spring+Mybatis
Spring+Mybatis的配置步骤及文档
1.导入jar包,包含Spring的相关包+Spring JDBC的包+Mybatis+SpringMybatis的包
2.配合bean dataSource
3.配置 sqlSessionFactory
4.配置MapperScannerConfigurer或者
5.配置事务相关 transactionManage
第六节:Mybatis解决了我们什么问题?
1.sql语句在Mapper.xml中配置,不需要在代码中书写
2.使用模板方法,不需要我们书写重复代码
3.使用ResultMap或者ResulType接收结果,简单易用
第七节:Mybatis的结果集映射 1-N的问题
1-N官方推荐的解决方式 left join
1-1的方式
第八节:Mybatis处理复杂表关系
使用ResultMap
一对一的关系
一对多的关系
第九节:Mysql常见优化
分页查询优化
查询索引进行优化
数据库字段进行优化
第十节:开发注意事项
如果是个人开发在没有用到数据库连接池的时候
注意关闭连接
什么时候进行优化?
在发生性能问题后进行优化
Mybatis中#{}和 一般情况下禁止使用 {}防止SQL注入
第十一节:附录
1.数据库的事务
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
ACID特性
2.数据库的隔离级别
读未提交:可以读到没有没有另一事务中没有提交的数据
读提交:只能读到事务commit后的数据
重复读:保证两次重复读的数据相同
序列化:一切有序进行
3.数据库的四种现象
脏读 | 不可重复读 | 幻读 | |
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |
脏读:读到没有提交的数据
不可重复读:两次读取不一致 读-读
幻读:读-写 数据不一致 数据条数不一致
4.数据库的limit分页查找
在分页时用id将不需要的隔离开
5.数据库如何手动设置事务或者说创建事务
6.数据库如何加行锁,什么情况下加
锁只在查询中加,其他的会自动加锁?
START TRANSACTION;
SAVEPOINT point1;
ROLLBACK to point1;
release savepoint point1
commit;
START TRANSACTION;
SELECT * FROM student WHERE id=1 FOR UPDATE;
SELECT sleep(10);
COMMIT;
START TRANSACTION;
SELECT * FROM student WHERE id=1 lock in share mode ;
SELECT sleep(10);
COMMIT;
rollback;
Java编写事务:
conn.setAutoCommit(false);开启事务操作
conn.commit();提交操作
connection.rollback();回滚操作
connection.setSavepoint();设置回滚点
Spring+Mybatis设置事务
事务注解
@Transactional
Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
//设置回滚点
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
//回滚操作
备注在阿里巴巴规范中
@Transactional 必须设置 rollback
不管怎么样最后都需commit
START TRANSACTION; 会将上次事务提交
set transaction read only; #设置事务只读
set transaction read write; #设置事务可读、写
release savepoint point1; #删除保存点