简介:Maven主要用于解决导入依赖于Java类的jar和编译Java项目的主要问题,其使用pom文件将自动管理下载的jar包
1.
groupid:包名
artifactid:工程名
location:存放位置
2.结构
工程目录结构:
src
main主程序区
java后端代码
com包
类
resources类路径---配置文件
db.properties
test测试程序区
pom.xml ====project工程 object对象 model模型
依赖的管理,例:***.jar文件
插件管理
3. 在idea中关联maven
解压maven压缩文件;
在idea中settings-->build execution deployment-->build tools-->maven
设置三项:
maven的安装根目录;
配置文件:maven的安装根目录/conf/settings.xml
关联本地仓库的目录:
在安装的地方创建repository,存放maven工程下载的依赖
4.修改配置
配置文件:maven的安装根目录/conf/settings.xml
本地文件夹:C:\tools\maven\repository
设置国内镜像地址:从国内仓库下载资源
alimaven
aliyun maven
https://maven.aliyun.com/repository/public
central
编译环境:设置为jdk8
jdk88
true
1.8
1.8
1.8
1.8
设置有效的编译环境:
jdk88 ---设置profile的id
添加依赖:pom.xml
junit
junit
4.13.2
test
添加注解:
公共类/公共方法/无参/无返回值
public class 类{
@Test
public void teest(){
}
}
使用时在其左边点启动就行
idea插件
在idea中安装插件:settings-->plugin
搜索 lombok
install
重启idea
pom.xml引入依赖:
org.projectlombok
lombok
1.18.22
使用:生成实体类中的相关方法/构造
getter/setter
toString
equals
无参/有参构造
@Data //生成get/set equals 、 hashCode 、toString 方法。
@AllArgsConstructor //全参构造
@NoArgsConstructor //无参构造
@RequiredArgsConstructor //个别参数构造,与@NonNull注解对应
public class User {
@NonNull
private String name; //属性
}
这样使用时,需要添加属性,直接写就行,省区了更改get,set,构造函数...更改
mysql
mysql-connector-java
5.1.48
//mysql引入
junit
junit
4.13.2
test
//测试
org.projectlombok
lombok
1.18.22
//简化实体类的
org.mybatis
mybatis
3.4.6
//mybatis
com.github.pagehelper
pagehelper
5.1.2
//分页插件
javax.servlet
javax.servlet-api
3.1.0
//java service
war
打war包的
框架:半成品
实现了与数据库的交互
免除了jdbc的代码,但是可以实现CRUD,并且可以实现映射(数据--类),使用XML配置和注解两种方式实现;
在pom.xml里导入mysql依赖
mysql
mysql-connector-java
5.1.48
核心文件在resources下创建mybatis.xml,使用其管理映射元文件
( )
//数据库账号
//数据库密码
//从resources路径下读取到的映射元文件的路径
配置映射元文件 **Mapper.xml,例如UserMapper.xml
resources/mapper目录/ **Mapper.xml
//接口所在地
//sql语句书写
DELETE FROM users WHERE u_id=6;
1.加入properties文件:
作用类似于:原来的工具类properties所填写的配置文件
在mybatis.xml中配置
注:在数据源的值里直接使用${properties中的键值名}
首先读取在 properties 元素体内指定的属性。
然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
第一种:给类定义别名,别名自行定义
第二种:引入包名,此时别名默认为类的首字母小写方式
,例:com.entity.User-->user
第三种:java内建类型的别名,查表;
例:java.util.Map;-->map
1. 将类路径下的xml文件以输入流形式读入到程序中:
Inputstream is=Resources.getResourceAsStream("mybatis.xml");
2. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
3.创建SqlSessionFactory对象:创建mybatis实例的核心
SqlSessionFactory factory=builder.build();
使用接口与接口结合
代替了原本的dao层
4.执行
SqlSession:会话对象:
Sqlsession sqlSession=factory.openSession();
.openSession(true)为自动提交
获得接口对象:通过mybatis实例获得
Users mapper = sqlSession.getMapper(Users.class);
执行接口中的方法:
int delete = mapper.delete();//删除一条数据
提交:
sqlSession.commit();
关闭:
sqlSession.close();
语法:
#{参数名}
insert into tb_user values(null,#{参数名},#{参数名},#{参数名})
arg0,arg1,arg2....
param1,param2,param3.....
接口:
public interface UserMapper{
int insert(String name,String pass,String tel,String mail);
}
映射元文件:xml文件
insert into tb_user values(null,#{arg0},#{arg1},#{arg2},#{arg3})
insert into tb_user values(null,#{param1},#{param2},#{param3},#{param4})
注:不能混用两种序号;必须从起始序号开始顺序递增;必须与接口中的参数一一对应;
用实体类的属性名作为参数名;
实体类:
public class User{
//属性,例:name--u_name
private String name;
private String tel;
private String mail;
private String pass;
}
接口:
public interface UserMapper{
int insert(User user);
}
映射元文件:xml文件
insert into tb_user values(null,#{name},#{pass},#{tel},#{mail})
当参数只有一个值时,可任何命名参数名
接口:int deleteById(int id);
User selectOne(String name);
sql: delete from tb_user where u_id=#{uid}
select * from tb_user where u_name like concat('%',#{username},'%')
@Param---mybatis提供的
// name表示方法的形参名
// uname表示传给mybatis的sql里的参数名
接口:User selectOne(@Param("uname")String name,@Param("upass")String pass);
sql: select * from tb_user where u_name=#{uname} and u_pass=#{upass}
将#{key},传入
@Test
public void test10() throws IOException {//排序
Users mapper = sqlSession.getMapper(Users.class);
HashMap map = new HashMap<>();
map.put("name","巴尔");
map.put("password","123");
User user = mapper.selectpassword(map);
System.out.println(user);
}
@Before
public void before()throws Exception{
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
sqlSession=factory.openSession(true);//自动提交
}
//在执行单元测试之后执行的方法
@After
public void after(){
sqlSession.close();
}
User selectpassword(Map map);
在resources下创建一个一个使用sql的xml文件
*Mapper。xml文件配置
注:名空间namespace----与对应接口全类名称一致;
id----与接口中方法名相同
查询的结果如何封装?
查询结果的字段名必须与实体类的属性名相同:
select u_id ,u_name ,u_pass from tb_user;
public class User{
private Integer uid;
private String uname;
private String upass;
}
可通过字段别名的方式将结果集的字段名与实体类的属性名定义一致;
select u_id uid ,u_name uname,u_pass upass from tb_user;
resultType 代表返回类型
parameterType 传入类型 ,一般实体传参会用
基本数据类型:int,string,long,Date;
复杂数据类型:类和Map
#{参数} 获取参数中的值
#{属性名} ,map中则是#{key}
u_id uid,u_name uname,u_pass upass,u_tel tel,u_mail mail
//将上面的部分包裹
主键回填一般用于增加操作中,把插入数据时插入为null的主键id数据填回去,存入到java对象和主键对应的属性中(数据库主键字段为id则回填的是实体类的id属性),实现添加+查询主键一步到位。
自增主键中
select LAST_INSERT_ID() :mysql 中的函数,获取最后插入的自增id值
select LAST_INSERT_ID()
2. < selectKey > sql语句 < /selectKey >:选择主键的标签,嵌套在插入语句中属性:
order:sql语句在插入中的执行顺序,order="AFTER",表示先执行插入再执行查询
resultType:sql语句执行的结果,在此处也是主键的结果
keyProperty:sql语句执行后回填到哪个属性,在此处为用户id,因为插入时它是null
例:
实体类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Users {
private int u_id;
private String u_name;
private String u_password;
private String u_age;
}
dao包
Integer insertUser(Users users);
UsersMapper.xml
select last_insert_id()
insert into users values (null,#{u_name},#{u_password},#{u_age})
测试类
@Test
public void test() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = build.openSession();
Userdaolmpl mapper = sqlSession.getMapper(Userdaolmpl.class);
Users users = new Users(-1,"巴尔","123","女");
Integer integer = mapper.insertUser(users);
System.out.println(integer);
sqlSession.commit();
sqlSession.rollback();
sqlSession.close();
}
可以看到先进行了插入操作,再进行了查询操作,
2. 非自增主键
测试类:
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = build.openSession();
Ordgslmpl mapper = sqlSession.getMapper(Ordgslmpl.class);
Ordgs ordgs = new Ordgs("-1",2,3);
Integer ordgs1 = mapper.insertOrdgs(ordgs);
System.out.println(ordgs1);
sqlSession.commit();
sqlSession.rollback();
sqlSession.close();
接口类
public interface Ordgslmpl {
Integer insertOrdgs(Ordgs ordgs);//添加订单
}
xml中
select REPLACE(uuid(),'-','')
-- 添加订单表
insert into ordgs values (#{o_id},#{o_u_name},#{o_goods})
上面的order=“before”表示mybatis
将取得序列的下一个值作为主键值,并且在执行insert sql
语句之前将值设置到studId
属性上。
标签建立SQL查询结果字段与实体属性的映射关系信息
可加extends,简化步骤
//表示主键字段
//表示非主键字段
对多 用
用户实体类:User
private Integer uid;
private String uname;
...用户基本信息
private List ordereList;//用于表示一对多的关系;表示一个用户有多个订单信息;
订单实体类:Orders
private String oid;
private String oname;
.....订单基本信息;
resultMap标签:
....
...订单c表和订单实体类之间的映射关系
用户的映射元文件:UserMapper.xml-->以用户表为主,返回实体是User类
//多表联合查询:左外/右外/内连接/等值连接。。。
对一
用户实体类:User
private Integer uid;
private String uname;
...用户基本信息
用户实体类:User
private Integer uid;
private String uname;
...用户基本信息
resultMap标签:
....
..用户基本信息的映射
resultMap标签:
....
..用户基本信息的映射
缓存:
从数据库中加载的数据缓存到内存中,是不少应用程序为了提升性能而采起的一向
作法。MyBatis对经过映射的SELECT语句加载的查询结果提供了内建的缓存支持。
默认状况下,启用一级缓存
优点:为下次的同构查询(相同查询)提供查询结果,降低与数据库的交互
缺点:可能因为缓存查询不到自己需要的结果
两次同构查询之间,进行一次提交操作(增删改),也会清空缓存;重新创建SqlSession对象,也会清空缓存;
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
SqlSession sqlSession=factory.openSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user1=userMapper.selectOne(1);//test1
User user1=userMapper.selectOne(1);
两次查询,查看日志只有一次连接数据库,
sqlSession.commit();//清空缓存后会重新连接
是全局缓存,能够被全部SqlSession共享
默认开启为true
在 xxxmapper.xml文件中 配置
开启缓存
开启二级缓存
例:
存在的部分问题:
1.传统web开发,存在硬解码过度耦合,功能较单一,例:在Service层中有一个属性为dao对象
解决:使用工厂模式可以减少硬编码,不用new,spring只需要声明一个接口就行,其它的交给spring
2.javaee 的API较为复杂,使用效率低下,比如jdbc
3.移植性较差,
Spring是个项目管理框架,也是一套JAVAEE解决方案
Spring是众多优秀设计模式的组合(单例,工厂,代理....)
Spring没有替代已有的框架,而是把众多框架进行整合,简化开发,所以它也被称为胶水框架
1.在maven项目中,pom.xml中导入核心依赖:记得要版本适配
org.springframework
spring-context
5.1.6.RELEASE
例:
2.还是存到resources文件夹下
创建配置文件:spring.xml
完成准备阶段后在spring.xml文件夹下配置管理对象
ApplicationContext接口---加载spring.xml文件
将需要由spring管理的对明定义在spring工厂中;
获得spring中的对象:
getBean("id名称");//获得Object
getBean(类对象);//获得的是真实类型;但是要求工厂中不能有相同类型的对象
getBean("id名称",类对象); //获得的是真实类型
例:
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
Users getlogin = ac.getBean("getlogin", Userslmpl.class);
//Userslmpl getlogin2 = ac.getBean("getlogin", Userslmpl.class);
可以声名类接收,也可以声名其接口接收
可以调用其方法了
反转控制IOC
初始化工厂后,spring工厂将管理的对象创建好,用时取出
使用Spring管理mybatis
1.导入依赖
org.mybatis
mybatis-spring
1.3.2
双击Shift查询,成功找到SqlSessionFactoryBean对象
2.Spring文件设置 导入数据源druid依赖
com.alibaba
druid
1.2.8
druid设置
spring管理整合mybatis对象
扫描mapper接口的包
修改业务层:增加set方法
UserMapper userMapper;
public void setMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
{
// try {
// SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
// SqlSession sqlSession = factory.openSession(true);
// userMapper = sqlSession.getMapper(Users.class);
// }catch(Exception e){
// e.printStackTrace();
// }
}