目录
Maven
1.Maven的概念:
2.在具体的使用中意义:
3.与传统项目引入jar包做对比:
传统方式:
在maven项目当中:
4.在创建maven项目后,想要自定义一些maven配置
5.maven项目的结构
6.maven指令的生命周期,其中红色为常用的生命周期
7.当导入的jar包有依赖关系时,会将被依赖的包全部一起导入进来,为了防止版本冲突,我们可以采用以下四种解决办法:
Mybatis
1.Mybatis的概念
2.在具体使用中的意义:
3.与传统项目进行对比:
传统项目:
mybatis的使用:
4.自动映射与手动映射
5.mapper接口中需要传入多个属性
6.Like模糊匹配
7.sql片段
8.动态sql
9.mybatisX插件的使用
10.项目结构总结
Maven
1.Maven的概念:
2.在具体的使用中意义:
3.与传统项目引入jar包做对比:
传统方式:


在maven项目当中:
1.创建maven项目
2.在pom.xml文件进行配置即可
3.在中心仓库或私服当中找想要使用的具体jar包
maven中心仓库

<dependencies>
</dependencies>标签下即可
4.在创建maven项目后,想要自定义一些maven配置
1)找到自己下载的maven安装目录,并打开conf的配置文件夹



5.maven项目的结构

6.maven指令的生命周期,其中红色为常用的生命周期


7.当导入的jar包有依赖关系时,会将被依赖的包全部一起导入进来,为了防止版本冲突,我们可以采用以下四种解决办法:



Mybatis
1.Mybatis的概念
2.在具体使用中的意义:
3.与传统项目进行对比:
传统项目:



此处使用到的静态代码块,原因在于静态代码块尽在编译时运行一次,而我们需要操作的数据库连接始终不变,因此不必频繁建立连接,写在静态代码块中即可。
这一部分封装的是具体给外部调用的方法,此处使用到了接口
SelectQuery<T> query
,而接口的实现采用匿名内部类的方式由调用者实现,同时使用到了泛型类,使得内部方法都可以使用到该泛型,由于返回值类型是不确定的,所以该方法的返回值为泛型T,由调用者自行定义。
该executselect方法的主要功能为执行查找操作,首先建立连接,然后将sql语句包装为preparedstatement类,以便使用其中的方法,params传来需要补充的参数,这样做是为了防止sql注入,因为where后如果条件被更改为恒对,则所有信息将被泄露,所以传来的sql语句多为String sql="SELECT * from student where account=?";这样的形式。而...params以剩余参数的方式,接收了所有需要额外填充在?处值。并通过statement.setObject来填充到对应位置,注意:需要填充的位置的下标从1开始,而对应的元素位置为0开始。
执行statement.executeQuery();操作之后我们获取到的是ResultSet 对象,也就是结果集,结果集交给调用该方法者来处理。其中set是最初指向该结果集的第一行数据的指针,相当于依次将每一行数据传给调用者,由调用者来处理
try(
DruidPooledConnection conn=dataSource.getConnection();
PreparedStatement statement = conn.prepareStatement(sql);
) {
for (int i=1;i<=params.length;i++){
statement.setObject(i,params[i-1]);
}
ResultSet set=statement.executeQuery();
ArrayList<T> datas = new ArrayList<>();
while (set.next()){
//获取一行数据,该操作需要交给外界使用该工具的开发人员实现
T data=query.selectQuery(set);
datas.add(data);
}
return datas;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
executeall封装的则是增删改操作
public static Integer executeAll(String sql,Object ...parmas){
try(
DruidPooledConnection conn=dataSource.getConnection();
PreparedStatement statement = conn.prepareStatement(sql)
) {
for (int i=1;i<=parmas.length;i++){
statement.setObject(i,parmas[i-1]);
}
Integer i=statement.executeUpdate();
return i;
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
}
}
以下是调用的实例,由前端传入的账号,来查询对应数据库中存放的密码
String sql="SELECT * from student where account=?";
ArrayList<String> passwordList=DBUtils.excuteSelect(sql,(ResultSet resultset)->{
String password1= null;
try {
password1 = resultset.getString("password");
} catch (SQLException e) {
throw new RuntimeException(e);
}
return password1;
},account);
接下来根据passwordlist当中存放的password与用户输入的password进行比对,同时如果密码正确检查token,如果没过期,则直接登录,过期了需要重新生成token
if (!passwordList.isEmpty()){
if(passwordList.get(0).equals(password)){
//查找对应token是否存在
String sql1="select * from token where account=?";
ArrayList<HashMap<String , Object>> results=DBUtils.excuteSelect(sql1,(ResultSet set)->{
HashMap<String, Object> data = new HashMap<>();
data.put("token", set.getString("token"));
//获取数据库中dateTime类型的数据
data.put("time", set.getTimestamp("date"));
return data;
},account);
if(!results.isEmpty()){
//有token需要检测是否过期,如果过期需要更新
Timestamp oldTime =(Timestamp)results.get(0).get("time");
Date newTime = new Date();
if(newTime.getTime() - oldTime.getTime() > 60000){
//设置有效期1分钟,过期
String token = TokenUtil.getToken(10);
sql = "update token set token=?, date=? where account=?";
Integer num = DBUtils.executeAll(sql, token, newTime, account);
if(num > 0){
HttpSession session = req.getSession();
session.setAttribute("token", token);
session.setAttribute("time", newTime);
RespUtil.success(200, "success", resp,token);
}else{
RespUtil.success(200, "success", resp);
}
}else{
String token = (String) results.get(0).get("token");
HttpSession session = req.getSession();
session.setAttribute("token", token);
session.setAttribute("time", oldTime);
RespUtil.success(200, "success", resp,token);
}
}else {
//没有token需要添加token
sql="INSERT INTO token (account,date,token) VALUES (?,?,?)";
String token= TokenUtil.getToken(10);
Date date = new Date();
Integer i = DBUtils.executeAll(sql, account, date, token);
HttpSession session = req.getSession();
session.setAttribute("token", token);
session.setAttribute("time", date);
if(i > 0){
RespUtil.success(200, "success", resp,token);
}else{
RespUtil.success(200, "success", resp);
}
}
}
else {
RespUtil.fail(500,"密码错误",resp);
}
mybatis的使用:
此处并没有结合springboot和spring的使用,而是单独的使用mybatis
mybatis则无需这么麻烦的自己写函数,以下是具体步骤
1)首先创建maven项目
2)引入mybatis的jar包和mysql的jar包
3)创建并开始配置mybatis-config.xml文件(该文件为mybatis总配置文件,后续引入的映射也均需要在该文件当中声明)
3.配置数据源
以下是2,3步后对应的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>
<settings>
<!-- 启用驼峰命名转换 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 给类和包起别名-->
<typeAliases>
<typeAlias type="com.mybatis.entity.Pinpai" alias="pinpai"/>
<package name="com.mybatis.entity"/>
</typeAliases>
<plugins>
<!-- 配置 PageHelper 分页插件 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 参数配置(可选) -->
<property name="helperDialect" value="mysql"/> <!-- 指定数据库类型 -->
<property name="reasonable" value="true"/> <!-- 分页合理化(页码越界时自动调整) -->
<property name="supportMethodsArguments" value="true"/> <!-- 支持接口参数传递分页 -->
<property name="params" value="count=countSql"/> <!-- 优化 COUNT 查询 -->
</plugin>
</plugins>
<!--环境:指定要连接的数据库-->
<environments default="mysql8">
<environment id="mysql8">
<!-- 事务管理器-->
<transactionManager type="JDBC"/>
<!-- datasource的type有三种取值:POOLED,UNPOOLED,JNDI-->
<!-- mybatis提供数据库链接池技术,type=pooled代表使用数据库链接池-->
<dataSource type="POOLED">
<!-- 数据源:数据库的连接信息,配置好以下四个信息-->
<!--配置驱动方式--> <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/yoyoshop?serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<environment id="mysql9">
<!-- 事务管理器-->
<transactionManager type="JDBC"/>
<!-- datasource的type有三种取值:POOLED,UNPOOLED,JNDI-->
<!-- mybatis提供数据库链接池技术,type=pooled代表使用数据库链接池-->
<dataSource type="POOLED">
<!-- 数据源:数据库的连接信息,配置好以下四个信息-->
<!--配置驱动方式--> <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/yoyoshop?serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--映射器:指定要操作的映射文件-->
<mappers>
<mapper resource="mapper/PinpaiMapper.xml"/>
<mapper resource="mapper/BookMapper.xml"/>
</mappers>
</configuration>
以上就完成了数据库连接操作
接着是执行具体sql语句:
1.根据数据库表生成对应的实体类文件
2.创建该类所对应的mapper接口,一定要主意好返回值类型和参数名和类型,否则报错不好找
3.创建映射文件
<?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">
<mapper namespace="com.mybatis.mapper.PinpaiMapper">
</mapper>
插入操作为insert,查询select,更新为update,删除为delete,id绑定具体的实现方法,比如insert当中id绑定为被映射接口的add方法,select其中一个绑定对应被映射接口的selectById方法。parametertype为输入参数类型,resulttype为输出参数类型,为完整的实体类地址。sql语句当中通过#{}即可实现对应形参对sql语句的绑定,当输入的类型为一个类时,同样可以通过#{类中属性名}对应属性的绑定。
4.在总配置文件文件mybatis-config.xml中进行声明
<mappers>
<mapper resource="mapper/PinpaiMapper.xml"/>
<mapper resource="mapper/BookMapper.xml"/>
</mappers>
接着便可被调用,调用时分为以下几步:
// 1、读取mybatis的主配置文件mybatis-config.xml
Reader reader= null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
} catch (IOException e) {
throw new RuntimeException(e);
}
// 2、创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
// 3、创建SqlSessionFactory对象
factory = factoryBuilder.build(reader);
// 4、创建SqlSession会话对象(获取链接)
SqlSession sqlSession = factory.openSession();
//5.获取对应接口实现类
PinpaiMapper mapper=sqlSession.getMapper(PinpaiMapper.class);
//6.调用方法
int result=mapper.add(pinpai);
System.out.println(result);
// 7、提交事务
sqlSession.commit();
// 8、关闭资源
sqlSession.close();
由于1,2,3,4,6,7,8步骤为固定的,因此我们还可以封装为一个工具类来调用。
4.自动映射与手动映射
传统使用自动映射,在实体类的属性名和数据库当中的列名一致时可以使用。当实体类定义的属性名和数据库不一致时,我们需要引入手动映射
右侧column为数据库中的名称,左侧为实体类属性名
<!-- 自动映射-->
<select id="selectAll" resultType="com.mybatis.entity.Book">
select * from book
</select>
<!-- 手动映射-->
<select id="selectAll" resultMap="bookMap">
select * from book
</select>
<resultMap id="bookMap" type="com.mybatis.entity.Book">
<id property="bookid" column="book_id"/>
<result property="bookname" column="book_name"/>
<result property="price" column="price"/>
<result property="deleted" column="deleted"/>
</resultMap>
5.mapper接口中需要传入多个属性
mapper接口默认只能传入一个属性值,当需要传入多个属性值时,由以下几种方法
1.转为单属性值
HashMap<String,Object> map = new HashMap<>();
map.put("bookName","红楼梦");
map.put("pageNum",1);
map.put("pageSize",2);
final SqlSession sqlSession = MybatisUtil.getSqlSession();
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
List<Book> books2 = mapper.selectBookByNameAndPage2(map);
List<Book> selectBookByNameAndPage2(Map<String,Object> map);
<select id="selectBookByNameAndPage2" parameterType="Map" resultType="Book">
select * from book where book_name=#{bookName} limit #{pageNum},#{pageSize}
</select>
2.使用param1,param2等来访问对应位置
List<Book> selectBookByNameAndPage(String bookName, int pageNum, int pageSize);
List<Book> books = mapper.selectBookByNameAndPage("红楼梦", 1, 2);
<select id="selectBookByNameAndPage" resultType="com.mybatis.entity.Book">
select * from book where book_name=#{param1} limit #{param2},#{param3}
</select>
6.Like模糊匹配
7.sql片段
8.动态sql
where标签的主要作用是去除掉对应位置的and关键字,搭配if来使用,而if判断的是如果前端没有传入对应属性值,则对应属性值没有被赋值,为初始值,所以判断是否为初始值即可实现对应是否动态增加判断条件。
set标签也搭配if标签使用,去除后面多余的“,”逗号。
9.mybatisX插件的使用
一键完成所有的配置。