目录
Maven
Maven是专门用于管理和构建Java项目的工具,它的主要功能有:
>提供了一套标准化的项目结构
>提供了一套标准化的构建流程(编译,测试,打包,发布……)
>提供了一套依赖管理机制
依赖管理
>依赖管理其实就是管理你项目所依赖的第三方资源(jar包、插件.…)
Maven常用命令
- compile:编译
- clean:清理
- test:测试
- package:打包
- install:安装
依赖范围
通过设置坐标的依赖范围(scope),可以设置对应jar包的作用范围:编译环境、测试环境、运行环境
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.32</version> <scope>runtime</scope> </dependency>
依赖范围 | 编译classpath | 测试classpath | 运行classpath | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | logback |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jdbc驱动 |
system | Y | Y | - | 存储在本地的jar包 |
import | 引入DependencyManagement |
<scop>默认值:compile
MyBatis
MyBatis 是一款优秀的持久层框架,用于简化JDBC开发
持久层
- 负责将数据保存到数据库的那一层代码
- JavaE三层架构:表现层、业务层、持久层
框架
- 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
- 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
使用Mapper代理方式完成入门案例
1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
2.设置SQL映射文件的namespace属性为Mapper接口全限定名
3.在Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
4.编码
- 通过SqlSession的getMapper方法获取Mapper接口的代理对象
- 调用对应方法完成sql的执行
MyBatis核心配置文件的顶层结构如下:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
数据库表的字段与实体类中不一致时,可以用resultMap映射
<resultMap id="brandResultMap" type="Brand"> <!-- id:完成主键字段的映射 result:完成一般字段的映射 column:表的列名 property:实体类的属性名 最后将resultType替换成resultMap即可 --> <result column="brand_name" property="brandName"/> <result column="company_name" property="companyName"/> </resultMap>
参数占位符
1.#{}:将其替换为?,可以防止sql注入
2.${}:拼参数
3.使用时机
* 参数传递的时候:#{}
* 表名或列名不固定的时候:${},会存在sql输入的问题
参数类型
parameterType 可以省略
特殊字符处理
1.转义字符
2.CDATA区 适用于字符较多
SaL语句设置多个参数有几种方式?
1)散装参数:需要使用@Param(“SQL中的参数占位符名称")
2)实体类封装参数
*只需要保证SQL中的参数名和实体类属性名对应上,即可设置成功
3)map集合
*只需要保证SQL中的参数名和map集合的键的名称对应上,即可设置成功
SQL语句会随着用户的输入或外部条件的变化而变化,我们称为动态SQL
动态SQL
if:用于判断参数是否有值,使用test属性进行条件判断
*存在的问题:第一个条件不需要逻辑运算符
*解决方案:
1)使用恒等式让所有条件格式都一样
2)<where>标签替换where关键字
从多个条件中选择一个
choose(when,otherwise):选择,类似于Java中的switch语句
<insert id="add" useGeneratedKeys="true" keyProperty="id">
动态修改字段
案例:
测试类:
@Test
public void update() throws Exception {
//接受参数
int status=1;
String companyName="小米科技有限公司";
String brandName="小米";
String description="从不期待米粉的期待";
int ordered=200;
int id=3;
//封装对象
Brand brand=new Brand();
brand.setStatus(status);
brand.setId(id);
//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.获取Mapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//4.执行方法
int count = brandMapper.update(brand);
System.out.println(count);
//提交事务
sqlSession.commit();
//5.释放资源
sqlSession.close();
}
<update id="update">
update tb_brand
<set>
<if test="status != null">
status=#{status}
</if>
<if test="companyName != null and companyName != '' ">
company_name=#{companyName}
</if>
<if test="brandName != null and brandName != '' ">
brand_name=#{brandName}
</if>
<if test="ordered != null">
ordered=#{ordered}
</if>
<if test="description != null and description != '' ">
description=#{description}
</if>
</set>
where id=#{id};
</update>
批量删除
mybatis会将数组参数,封装为一个Map集合。
*默认:array=数组
*使用@Param注解改变map集合的默认key的名称
单个参数:
1.POJO类型:直接使用,属性名和参数占位符名称一致
2.Map集合:直接使用,键名和参数占位符名称一致
3.ColLection:封装为Map集合
map.put("arg0",collection集合);
4.List;封装为Map集合
map.put("arg0",List集合);
5.Array:封装为Map集合
map.put("arg0",数组);
6.其他类型:直接使用
多个参数:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
配置文件完成复杂功能