Maven以及Mybatis

Maven

maven的pom文件

  1. 项目坐标(Project Coordinates):包括groupIdartifactIdversion,用于唯一标识项目如以下代码及项目坐标GAV
    <groupId>com.example</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0.0</version>

  2.  项目依赖(Dependencies):定义了项目所依赖的外部库或模块。以下代码及依赖spring

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.2</version>
        </dependency>
        <!-- 其他依赖 -->
    </dependencies>
    
  3.  构建配置(Build Configuration):定义了项目的构建过程,包括编译器版本、源文件目录、输出目录等。
    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <outputDirectory>target/classes</outputDirectory>
        <!-- 其他构建配置 -->
    </build>
    
  4.  插件配置(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>
    

  5. 项目信息(Project Information):包括项目的名称、描述、开发者信息等。
    <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的pom文件的五大模块

maven的继承与maven聚合

  1. 首先父项目的打包方式必须为pom 且在子元素的pom中会有定义其父元素的标签<parent>如图为父元素的pom中的子元素都在<modules>模块中 且打包方式为pom
  2. 结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java、src/test/java等目录
  3. 新的元素:<parent> , 它是被用在子模块中的
  4. 版本:聚合模块的版本和被聚合模块版本一致
  5. 目录名称:为了方便的快速定位内容,模块所处的目录应当与其artifactId一致(Maven约定而不是硬性要求),总之,模块所处的目录必须和<module>模块所处的目录 </module>相一致。

mybatis

mybatis执行流程

  1. 读取MyBatis 配置文件mybatis-config.xml,加载数据源、事务等

  2. 加载映射文件mapper.xml

  3. 定义SQL语句,在上一步的文件中加载。

  4. 创建会话工厂。(SqlSessionFactory)

  5. 创建会话(SqlSession)

  6. 通过Executor 操作数据库

  7. 输入参数和输出结果

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循环一次后添加的符号

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值