首页
友链
Search
1
01-快捷命令
132 阅读
2
寒假计划
128 阅读
3
浏览器规范(ES module)和 node.js 规范(Common JS)
120 阅读
4
03-概念解析
119 阅读
5
学期计划(大三下学期)
102 阅读
计划
算法
面试题
运维
Ansible
Linux
数据库
neo4j
共用
web 前端
CSS
JavaScript
Vue
Node.js
英语单词
工程化
JAVA
mysql
收获
面试
mybatis
Spring
基础
spring-mvc
问题
项目
宠物乐园
速查
问题集
git
学习
sql
二阶段
登录
Search
标签搜索
spring
mysql
vue
ansible
CSS
面试
计划
收获
JAVA面试题
spring-mvc
Starrylsi
累计撰写
106
篇文章
累计收到
37
条评论
首页
栏目
计划
算法
面试题
运维
Ansible
Linux
数据库
neo4j
共用
web 前端
CSS
JavaScript
Vue
Node.js
英语单词
工程化
JAVA
mysql
收获
面试
mybatis
Spring
基础
spring-mvc
问题
项目
宠物乐园
速查
问题集
git
学习
sql
二阶段
页面
友链
搜索到
9
篇与
的结果
2024-09-10
04_一对多_学生班级
目标: 能够自己实现学生班级案例,完成一对多查询了解:collection 标签专门用来映射集合属性实现分步查询的关键就是将 join on连接去掉,在collection添加select="查询的xml全类名,比立即加载多写一个接口"注: 代码仅供理解1.数据库表##1. 创建班级表 create table t_clazz( `id` int primary key auto_increment, `name` varchar(50) ); ##1.2 插入班级信息 insert into t_clazz(`name`) values('javaEE20220228'); insert into t_clazz(`name`) values('javaEE20220325'); insert into t_clazz(`name`) values('javaEE20220420'); insert into t_clazz(`name`) values('javaEE20220515'); ##1.3 创建学生表 create table t_student( `id` int primary key auto_increment, `name` varchar(50), `clazz_id` int, foreign key(`clazz_id`) references t_clazz(`id`) ); ##1.4 插入班级信息 insert into t_student(`name`,`clazz_id`) values('stu0228_1',1); insert into t_student(`name`,`clazz_id`) values('stu0228_2',1); insert into t_student(`name`,`clazz_id`) values('stu0228_3',1); insert into t_student(`name`,`clazz_id`) values('stu0325_1',2); insert into t_student(`name`,`clazz_id`) values('stu0325_2',2); insert into t_student(`name`,`clazz_id`) values('stu0420_1',3);2.config,lib3.实现clazz的分步查询public interface ClazzDAO { public Clazz queryClazzById(int id); /** * 我要分两次查询, * 一次只查常用数据,班级信息<br/> * 当我需要使用学生信息的时候。再查询一次<br/> */ public Clazz queryClazzTwoStep(int id); } <resultMap type="com.zhuama.pojo.Clazz" id="queryClazzByIdForTwoStepLazy_resultMap"> <id column="id" property="id"/> <result column="name" property="name"/> <!-- collection 是专门映射集合的标签 property 属性设置你要设置和集合的属性名 ofType是 这个集合中每个元素的具体类型 select 是你要查询的语句 column 属性设置你要执行的select对应的查询语句需要的参数列 --> <collection property="stuList" ofType="com.zhuama.pojo.Student" select="com.zhuama.dao.StudentMapper.queryStudentsByClazzId" column="id" /> </resultMap> <!-- public Clazz queryClazzByIdForTwoStepLazy(int id); --> <select id="queryClazzByIdForTwoStepLazy" resultMap="queryClazzByIdForTwoStepLazy_resultMap"> select id,name from t_clazz where id = #{id} </select> 4.实现student的分步查询
2024年09月10日
16 阅读
0 评论
0 点赞
2024-09-10
03_一对一_锁钥_分步查询
目标: 熟练使用自定义resultmap关键: 1.不使用join on连接两个表 2.association的select="第二步查询的方法全类名"3.使用association1. 创建一对一数据库表1.1 创建锁表create table t_lock( `id` int primary key auto_increment, `name` varchar(50) );1.2 创建钥匙表create table t_key( `id` int primary key auto_increment, `name` varchar(50), `lock_id` int , foreign key(`lock_id`) references t_lock(`id`) );1.3 插入初始化数据insert into t_lock(`name`) values('阿里巴巴'); insert into t_lock(`name`) values('华为'); insert into t_lock(`name`) values('联想'); insert into t_key(`name`,`lock_id`) values('马云',1); insert into t_key(`name`,`lock_id`) values('任正非',2); insert into t_key(`name`,`lock_id`) values('柳传志',3);2. 引入配置文件,和需要的库,创建接口config/jdbc.properis config/log4j.properties config/mybatis-config.xml lib/druid-1.1.10.jar lib/log4j-1.2.17.jar lib/mybatis-3.4.1.jar lib/mysql-connector-java-5.1.37-bin.jar3. 编写xml文件3.1 associationassociation 标签专门映射Bean对象中的子对象(一个Bean)专门用来配置一对一标签<mapper namespace="top.starrylsi.dao.KeyDAO"> <!-- 如果类中存在组合的情况 可以使用resultMap 将组合中的内容指定给对应的属性 column 需要sql中的列名 property 需要类中属性名.自身属性的 通常情况下 为了保证每个对象之间存在独立类关系 在resultMap标签中添加 对应关系 有两种关系标签 : 一对一标签 : <association> <association>标签中的 property属性 1.需要指定类中的组合属性名 2.需要指定该属性的类型 javaType="全类名" --> <!-- <resultMap type="key" id="resultMap_queryKeyById"> <id column="id" property="id"/> <result column="name" property="name" /> <result column="lock_id" property="lock.id"/> <result column="lock_name" property="lock.name"/> </resultMap> --> <resultMap type="top.starrylsi.pojo.Key" id="resultMap_queryKeyById"> <id column="id" property="id"/> <result column="name" property="name"/> <association property="lock" javaType="top.starrylsi.pojo.Lock"> <id column="lock_id" property="id"/> <result column="lock_name" property="name"/> </association> </resultMap> <select id="queryKeyById" resultMap="resultMap_queryKeyById"> select k.id, k.name, l.id lock_id ,l.name lock_name from t_key k join t_lock l on k.lock_id = l.id where k.id = #{id} </select> </mapper>3.2 分页查询 <resultMap type="top.starrylsi.pojo.Key" id="queryKeyByIdTwoStep_resultMap"> <id column="id" property="id"/> <result column="name" property="name"/> <association property="lock" javaType="top.starrylsi.pojo.Lock" select="top.starrylsi.dao.LockDAO.queryLockById" column="lock_id"></association> </resultMap> <select id="queryKeyByIdTwoStep" resultMap="queryKeyByIdTwoStep_resultMap"> select id,name,lock_id from t_key where id = #{id} </select>延迟加载在一定程序上可以减少很多没有必要的查询。给数据库服务器提升性能上的优化。 要启用延迟加载,需要在mybatis-config.xml配置文件中,添加如下两个全局的settings配置。 <!-- 打开延迟加载的开关 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 将积极加载改为消极加载 按需加载 --> <setting name="aggressiveLazyLoading" value="false"/> 错误点mybatis-config中的mapper 路径用的是 resource,resouce只能读取一个文件,而class可以读取这个类的所有文件junit 版本号与 代码写法不一样在实现分页查询的时候,由于LockDAO的mapper没有在mybatis-config中声明而报错
2024年09月10日
11 阅读
0 评论
0 点赞
2024-09-09
02-mybatis 配置和方法参数
目标熟练配置mybatis-config.xml{dotted startColor="#6c4747" endColor="#1989fa"/}方法参数1.properis 配置属性<properties resource="jdbc.properties" />2.settings 配置设置<settings> <!-- 自动识别驼峰命名和数据库命名 --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>3.typeAliases 配置别名<typeAliases> <!-- 单独配置指定的类 和它的别名 --> <!-- <typeAlias type="com.zhuama.pojo.User" alias="user"/> --> <!-- 指定包中的所有类 都含有别名 默认是类名首字母小写 可以在类中使用@Alias注解给类起别名 但一般不推荐 --> <package name="com.zhuama.pojo"/> </typeAliases>4.typeHandler 类型处理器5.environments 环境配置<environments default="test"> <!-- 开发环境 --> <environment id="development"> <transactionManager type="JDBC" /> <!-- dataSource 数据源 POOLED 表示使用数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="${driverClassName}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> <!-- 测试环境 --> <environment id="test"> <!-- 配置事务管理器 --> <transactionManager type="JDBC" /> <!-- 配置数据库连接池 --> <dataSource type="com.zhuama.factory.DruidFactory" /> </environment> </environments>6.配置不同数据库执行对应的sql<!-- 配置自动识别不同的数据库执行不同的sql语句 --> <databaseIdProvider type="DB_VENDOR"> <property name="Oracle" value="oracle"/> <property name="MySQL" value="mysql"/> </databaseIdProvider>7.加载sql文件的配置<mappers> <!-- 直接加载指定的xml文件 --> <!-- <mapper resource="com/zhuama/mapper/UserMapper.xml" /> --> <!-- 使用文件路径加载指定的xml --> <!-- <mapper url="file:///D:\0422SSMWorkspace\mybatis-day02-setting\src\com\zhuama\mapper\UserMapper.xml" /> --> <!-- 使用类名加载xml 要求文件名必须与对应的接口名一致 --> <!-- <mapper class="com.zhuama.mapper.UserMapper" /> --> <!-- 读取指定包中的xml --> <package name="com.zhuama.mapper"/> </mappers>8.使用注解实现增删改查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> <!-- 配置文件标签 --> <properties resource="jdbc.properties" /> <!-- 配置mybatis的设置功能 --> <settings> <!-- 自动识别驼峰命名和数据库命名 --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!-- 配置别名 --> <typeAliases> <!-- 单独配置指定的类 和它的别名 --> <!-- <typeAlias type="com.zhuama.pojo.User" alias="user"/> --> <!-- 指定包中的所有类 都含有别名 默认是类名首字母小写 可以在类中使用@Alias注解给类起别名 但一般不推荐 --> <package name="com.zhuama.pojo"/> </typeAliases> <environments default="test"> <!-- 开发环境 --> <environment id="development"> <transactionManager type="JDBC" /> <!-- dataSource 数据源 POOLED 表示使用数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="${driverClassName}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> <!-- 测试环境 --> <environment id="test"> <!-- 配置事务管理器 --> <transactionManager type="JDBC" /> <!-- 配置数据库连接池 --> <dataSource type="com.zhuama.factory.DruidFactory" /> </environment> </environments> <!-- 引入sql语句对应的配置文件 --> <!-- 配置自动识别不同的数据库执行不同的sql语句 --> <databaseIdProvider type="DB_VENDOR"> <property name="Oracle" value="oracle"/> <property name="MySQL" value="mysql"/> </databaseIdProvider> <mappers> <!-- 直接加载指定的xml文件 --> <!-- <mapper resource="com/zhuama/mapper/UserMapper.xml" /> --> <!-- 使用文件路径加载指定的xml --> <!-- <mapper url="file:///D:\0422SSMWorkspace\mybatis-day02-setting\src\com\zhuama\mapper\UserMapper.xml" /> --> <!-- 使用类名加载xml 要求文件名必须与对应的接口名一致 --> <!-- <mapper class="com.zhuama.mapper.UserMapper" /> --> <!-- 读取指定包中的xml --> <package name="com.zhuama.mapper"/> </mappers> </configuration>
2024年09月09日
11 阅读
0 评论
0 点赞
2024-09-08
07-数据库的连接
目标掌握连接数据库的四个步骤理解工厂模式概念1.工厂模式三种工厂模式都是为了解决对象创建过程中的耦合问题,使得系统更容易扩展和维护。简单工厂模式适用于创建逻辑相对简单的情况;工厂方法模式适用于有多个产品族需要创建的情况;抽象工厂模式适用于需要创建一系列相关或依赖的产品对象的情况。2.java为了保证支持所有的数据库 提供给所有的数据库厂商三个核心接口 Connection 连接Statement 语句ResultSet 结果集3.java访问数据库 需要提供四个步骤{timeline}{timeline-item color="#19be6b"}1.注册驱动{/timeline-item}{timeline-item color="#19be6b"}2.提供数据库的url 规则:jdbc:mysql://ip:端口号/database名称{/timeline-item}{timeline-item color="#19be6b"}3.提供用户名、密码{/timeline-item}{timeline-item color="#19be6b"}4.根据参数 生成Connection对象{/timeline-item}{/timeline}导入jar包1.根目录新建文件夹命名为 lib2.右键jar包->添加至构建路径案例都是三个阶段: 1.准备(获取连接,定义sql,定义statement或prepareStatement)2.使用(stmt.executeUpdate,存储参数和pstmt.executeUpdate)3.销毁(关流).connection案例代码public class ConnectionTest { public static void main(String[] args) { try { //1.注册驱动 //DriverManager.registerDriver(new Driver()); //1.1也可以使用反射加载驱动 //1.8版本之后 可以不加载 自动加载 // Class.forName("com.mysql.jdbc.Driver"); //2.提供数据库的url String url = "jdbc:mysql://localhost/?"; //3.提供用户名、密码 String password = "?"; String username = "?"; //4.生成连接对象 Connection con= DriverManager.getConnection(url, username,password); System.out.println(con); } catch (SQLException e) { e.printStackTrace(); } } }statement案例代码public class StatementTest { public static void main(String[] args) { //1.获取连接 Connection conn = JDBCUtils.getConnection(); Date date = new Date(); //2.定义sql String sql = "insert into test6(name,password,create_date) " + "values('李思','123','"+ new java.sql.Date(date.getTime()) +"')"; //3.获取Statement对象 Statement stmt = null; try { stmt = conn.createStatement(); //4.执行DML语句时 使用executeUpdate int result = stmt.executeUpdate(sql); System.out.println(result > 0 ? "添加成功" : "添加失败"); } catch (SQLException e) { e.printStackTrace(); } finally { //5.关流 JDBCUtils.close(conn,stmt); } } } prepareStatement 案例代码/** * 由于Statement存储数据时需要拼接字符串 * 会造成sql注入问题 * * sql注入:拼接字符串时 被强行插入不符合规则数据 造成数据库宕机 * * 所以java提供了Statement接口的子接口 * PreparedStatement 可以用来提供可变参数 * * * * * * */ public class PrepareTest { public static void main(String[] args) { //1.获取连接 Connection conn = JDBCUtils.getConnection(); //2.声明PreparedStatement对象 PreparedStatement pstmt = null; //3.定义sql String sql = "insert into test6 values(null,?,null,?)"; try { //4.生成pstmt对象 pstmt = conn.prepareStatement(sql); //5.存储参数 pstmt.setString(1, "赵柳"); pstmt.setDate(2, new java.sql.Date(new Date().getTime())); //6.执行sql并获取返回值 int result = pstmt.executeUpdate(); System.out.println(result > 0 ? "添加成功" : "添加失败"); } catch (SQLException e) { e.printStackTrace(); } finally { //7.关流 JDBCUtils.close(conn, pstmt); } } } result 案例代码查询多行数据public class ResultSetTest1 { public static void main(String[] args) { //0.声明一个Person对象 Person person = null; //1.获取连接 Connection conn = JDBCUtils.getConnection(); //2.声明pstmt和rs对象 PreparedStatement pstmt = null; ResultSet rs = null; //3.定义sql String sql = "select * from test6 where id = ?"; try { //4.根据sql生成pstmt pstmt = conn.prepareStatement(sql); //5.传递参数 pstmt.setInt(1, 2); //6.执行sql并获取rs对象 rs = pstmt.executeQuery(); //7.遍历rs对象 并获取数据 while(rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); String password = rs.getString("password"); Date createDate = rs.getDate("create_date"); person = new Person(id, name, password, createDate); } } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.close(conn, pstmt, rs); } System.out.println(person); } }
2024年09月08日
18 阅读
0 评论
0 点赞
2024-09-08
06-事物
目标掌握一个案例解释事物目录:1. 概念 2. 案例 1. 概念事物: 是数据库实际应用时最重要的知识点之一提供了两个功能 1.提交 commit 2.回滚 rollback数据库事物默认提交需要手动开启事物SET AUTOINCREMENT=FALSE;当开启事物时 数据不会立刻提交 在其他客户端无法查看当前数据2. 案例
2024年09月08日
18 阅读
0 评论
1 点赞
1
2