Maven
maven的pom文件
- 项目坐标(Project Coordinates):包括
groupId
、artifactId
和version
,用于唯一标识项目如以下代码及项目坐标GAV<groupId>com.example</groupId> <artifactId>my-project</artifactId> <version>1.0.0</version>
-
项目依赖(Dependencies):定义了项目所依赖的外部库或模块。以下代码及依赖spring
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.2</version> </dependency> <!-- 其他依赖 --> </dependencies>
- 构建配置(Build Configuration):定义了项目的构建过程,包括编译器版本、源文件目录、输出目录等。
<build> <sourceDirectory>src/main/java</sourceDirectory> <outputDirectory>target/classes</outputDirectory> <!-- 其他构建配置 --> </build>
- 插件配置(Plugin Configuration):配置了Maven插件,用于执行项目构建过程中的各种任务,例如编译、测试、打包等
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <!-- 其他插件 --> </plugins> </build>
- 项目信息(Project Information):包括项目的名称、描述、开发者信息等。
以上是maven的pom文件的五大模块<name>My Project</name> <description>This is my project.</description> <developers> <developer> <name>John Doe</name> <email>john.doe@example.com</email> </developer> </developers>
maven的继承与maven聚合
- 首先父项目的打包方式必须为pom 且在子元素的pom中会有定义其父元素的标签<parent>
如图为父元素的pom中的子元素都在<modules>模块中 且打包方式为pom
- 结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java、src/test/java等目录
- 新的元素:
<parent>
, 它是被用在子模块中的 - 版本:聚合模块的版本和被聚合模块版本一致
- 目录名称:为了方便的快速定位内容,模块所处的目录应当与其artifactId一致(Maven约定而不是硬性要求),总之,模块所处的目录必须和<module>模块所处的目录 </module>相一致。
mybatis
mybatis执行流程
-
读取MyBatis 配置文件mybatis-config.xml,加载数据源、事务等
-
加载映射文件mapper.xml
-
定义SQL语句,在上一步的文件中加载。
-
创建会话工厂。(SqlSessionFactory)
-
创建会话(SqlSession)
-
通过Executor 操作数据库
-
输入参数和输出结果
Mybatis的主配置文件 mybatis-config.xml
mybatis-config.xml主要用来配置mybatis的运行环境,数据源、事务等。
在classpath下创建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>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<!-- 可以配置多个environment -->
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/shopdb" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
</configuration>
sql的映射文件
<?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">
<!-- namespace命名空间,作用就是对sql进行分类管理
注意:使用mapper代理方法开发时,namespace需要特殊设置
-->
<mapper namespace="test">
</mapper>
其中为实现crub所以在<mapper>标签下写sql语句
<select id="findUserById" parameterType="int" resultType="org.csmf.mybatis.entity.User">
select * from t_user where id = #{id}
</select>
将sql映射文件添加到MyBatis主配置文件中
mybatis框架需要加载映射文件,将UserMapper.xml添加到mybatis-config.xml中
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
public class UserDaoTest {
@Test
public void testFindUserById(){
InputStream inputStream = null;
try {
//0.加载Mybatis的主配置文件
// Resources.getResourceAsStream()获取classpath下面的资源
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
} catch (IOException e) {
e.printStackTrace();
}
//1.通过Mybatis的主配置文件得到SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.通过SqlSessionFactory得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.通过SqlSession操作数据库
//selectOne():
//第一个参数是Statement的Id也就是sql映射文件中的select,insert,,标签的Id
//第二个参数是输入参数
User user = sqlSession.selectOne("findUserById",2);
//输出
System.out.println(user.getUsername()+"-->"+user.getBrithday());
//4.关闭SqlSession
sqlSession.close();
}
}
写一个util工具类方便使用sql映射
这个过程因为测试每一次就需要调用sqlsession所以我们可以写一个工具类来方便这些操作如下
package util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
private static ThreadLocal<SqlSession> tl = new ThreadLocal<>();
static{
InputStream in = null;
try {
in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession openSqlSession(){
SqlSession sqlSession = tl.get();
if(sqlSession == null){
sqlSession = sqlSessionFactory.openSession();
tl.set(sqlSession);
}
return sqlSession;
}
public static void close(){
SqlSession sqlSession = tl.get();
if(sqlSession != null){
sqlSession.commit();
sqlSession.close();
tl.remove();//防止内存泄漏
}
}
public static <T> T getMapper(Class<T> clazz){
SqlSession sqlSession = tl.get();
if(sqlSession == null){
sqlSession = openSqlSession();
}
return sqlSession.getMapper(clazz);
}
}
正使用工具类后代码可以简写成
public class UserServiceImpl implements UserService {
private UserMapper userMapper = MybatisUtil.getMapper(UserMapper.class) ;
@Override
public User queryById(Integer id) {
//非空判断
if(id == null){
throw new RuntimeException("id不能为空,id:"+id);
}
User user = userMapper.selectById(id);
// MybatisUtil.close();
return user;
}
Mybatis的Dao开发--Mapper代理模式
创建接口
package UserMapper;
import Bean.User;
import java.sql.SQLException;
import java.util.List;
public interface UserMapper {
public User queryById(int id) throws SQLException;
public List<User> queryAll() throws SQLException;
public boolean add(User user) throws SQLException;
public boolean updata(int id) throws SQLException;
public boolean deleteByid(int id) throws SQLException;
List<User> list(int pageIndex, int pageSize) throws SQLException;
long count() throws SQLException;
Boolean SelectDeletUser(int[] arr);
}
之后创建的mapper文件中的namespace中的值就是接口的全限定名且sql的id必须为接口中方法的方法名如下
<mapper namespace="UserMapper.UserMapper">
<select id="queryById" parameterType="int" resultType="Bean.User">
select * from tb_userinfo where id=#{id}
</select>
<select id="queryAll" resultType="Bean.User">
select * from tb_userinfo
</select>
<mappers>
<!-- 加载某个包下所有的mapper映射文件 sql映射文件必须与Mapper位于同一个包 -->
<package name="com.fs.dao"/>
</mappers>
如若不同一个包内则写为mapper文件的名字
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
动态sql
if
<!-- 传递pojo综合查询用户信息 -->
<select id="findUserList" parameterType="user" resultType="user">
select * from user
where 1=1
<if test="id!=null and id!=''">
and id=#{id}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</select>
where
<select id="findUserList" parameterType="user" resultType="user">
select * from user
<where>
<if test="id!=null and id!=''">
and id=#{id}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</where>
</select>
foreach*
<!-- 根据一组Id查询用户 -->
<select id="findUserByIds" resultType="User" parameterType="QueryVo">
select * from t_user
<where>
<!--select * from t_user where id in (? ,?, ?...) -->
<foreach collection="list" item="id" open="and id in ( " close=")" separator=" , ">
#{id}
</foreach>
</where>
</select>
其中
collection表示要遍历数组的名称
item为迭代中的当前项赋值给id
open=为在循环之前输出
close循环结束后输出
separator循环一次后添加的符号