JavaSSM框架-MyBatis 框架(二)

发布于:2025-09-11 ⋅ 阅读:(18) ⋅ 点赞:(0)

4. 核心配置文件

4.1 核心配置文件详解

核心配置文件中的标签必须按照固定的顺序:

properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?

各标签说明

  1. <properties resource="jdbc.properties" />:通过该标签可以引入resource路径下的properties配置文件,引入配置文件后,便可以使用${key}的形式访问value,如在配置连接数据库的相关信息时使用${jdbc.url}即可得到properties配置文件中的jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC,jdbc.properties配置文件内容如下:

    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
    jdbc.username=root
    jdbc.password=123456
    
  2. <typeAliases>:该标签是用来起别名的,有两个子标签

    • <typeAlias type="全类名" alias="别名" />:设置某个类型的别名,不写alias属性的情况下,别名默认为类名,且不区分大小写,例如:<typeAlias type="com.atguigu.mybatis.pojo.User" />,其别名User
    • <package name="包名"/>:以包为单位,将包下所有的类型设置默认的类型别名,即类名

    在MyBatis中,对于Java中常用的类型都设置了类型别名

    • java.lang.Integer --> int/integer

    • int --> _int/_integer

    • Map–>mapList–>list

  3. <environments default="development">:设置连接数据库的一个或多个环境,即基本信息,其中default属性用于设置默认环境的id,即默认使用id="development"的信息连接数据库,其有一个子标签

    • <environment id="development">:设置连接数据库的环境,id表示连接数据库的环境的唯一标识
  4. environment的子标签

    • <transactionManager type="JDBC|MANAGED">:设置事务管理方式

      JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事务的提交或回滚需要手动处理

      MANAGED:被管理,例如Spring

    • <dataSource type="POOLED|UNPOOLED|JNDI">:配置数据源

      POOLED:表示使用数据库连接池缓存数据库连接

      UNPOOLED:表示不使用数据库连接池

      JNDI:表示使用上下文中的数据源

  5. <mappers>标签:引入映射文件,其有两个子标签

    • <mapper resource=""/>:根据resource路径引入映射文件

    • <package name="包名"/>:以包为单位引入映射文件

      要求(重点):

      1. mapper接口所在的包要和映射文件所在的包一致

      2. mapper接口要和映射文件的名字一致

      3. 如下图所示,其实在编译后,java目录文件与resources目录文件是在同一个文件夹下,可在生成的target目录下窗口

        在这里插入图片描述
        在这里插入图片描述

      注意:在创建包时,使用点.分隔可以创建出层级,但是对于目录,如果这样创建com.qingtian,只会创建出一个名为com.qingtian的文件夹,要使用反斜杠进行创建,如com/qingtian,才能创建出层级

配置文件代码如下:

<?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>
	<!--
         MyBatis核心配置文件中,标签的顺序:
         properties?,settings?,typeAliases?,typeHandlers?,
         objectFactory?,objectWrapperFactory?,reflectorFactory?,
         plugins?,environments?,databaseIdProvider?,mappers?
	-->
	<!--引入properties文件-->
	<properties resource="jdbc.properties" />
	<!--设置类型别名-->
	<typeAliases>
	<!--
		typeAlias:设置某个类型的别名
		属性:
			type:设置需要设置别名的类型
			alias:设置某个类型的别名,若不设置该属性,那么该类型拥有默认的别名,即类名且不区分大小写
	-->
		<!--<typeAlias type="com.atguigu.mybatis.pojo.User"></typeAlias>-->
		<!--以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
		<package name="com.atguigu.mybatis.pojo"/>
	</typeAliases>
	<!--
		environments:配置多个连接数据库的环境
		属性:
			default:设置默认使用的环境的id
	-->
	<environments default="development">
 <!--
		environment:配置某个具体的环境
		属性:
			id:表示连接数据库的环境的唯一标识,不能重复
	-->
	<environment id="development">
		<!--
			transactionManager:设置事务管理方式
			属性:
				type="JDBC|MANAGED"
				JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事务的提交或回滚需要手动处理
				MANAGED:被管理,例如Spring
		-->
			<transactionManager type="JDBC"/>
			<!--
				dataSource:配置数据源
				属性:
              type:设置数据源的类型
              type="POOLED|UNPOOLED|JNDI"
                 POOLED:表示使用数据库连接池缓存数据库连接
                 UNPOOLED:表示不使用数据库连接池
                 JNDI:表示使用上下文中的数据源
			-->
				<dataSource type="POOLED">
              <!--设置连接数据库的驱动-->
              <property name="driver" value="${jdbc.driver}"/>
                 <!--设置连接数据库的连接地址-->
                 <property name="url" value="${jdbc.url}"/>
                 <!--设置连接数据库的用户名-->
                 <property name="username" value="${jdbc.username}"/>
                 <!--设置连接数据库的密码-->
                 <property name="password" value="${jdbc.password}"/>
				</dataSource>
			</environment>
			<environment id="test">
          <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
             <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
             <property name="url"value="jdbc:mysql://localhost:3306/ssmserverTimezone=UTC"/>
             <property name="username" value="root"/>
             <property name="password" value="123456"/>
			</dataSource>
		</environment>
	</environments>
	<!--引入映射文件-->
	<mappers>
	<!--<mapper resource="mappers/UserMapper.xml"/>-->
	<!--
      以包为单位引入映射文件
         要求:
         1、mapper接口所在的包要和映射文件所在的包一致
         2、mapper接口要和映射文件的名字一致
	-->
		<package name="com.atguigu.mybatis.mapper"/>
	</mappers>
</configuration>

4.2 IDEA 创建配置文件模板

  1. settings --> Editor --> File and Code Template

    在这里插入图片描述

  2. 点击 + 创建模板,便可完成模板创建

    在这里插入图片描述

  3. 创建完模板后,选择new文件时便可以看见模板,注意这是模板名字而不是文件名

    在这里插入图片描述

MyBatis核心配置文件模板

  1. 核心配置文件模板名字一般命名为mybatis-config,扩展名为.xml

  2. 模板代码可根据自己需求更改,模板代码如下:

    <?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>
        <!--
             MyBatis核心配置文件中,标签的顺序:
             properties?,settings?,typeAliases?,typeHandlers?,
             objectFactory?,objectWrapperFactory?,reflectorFactory?,
             plugins?,environments?,databaseIdProvider?,mappers?
    	-->
    
        <!--引入配置文件-->
        <properties resource="jdbc.properties" />
    
        <typeAliases>
            <typeAlias type="" alias="" />
            <package name=""/>
        </typeAliases>
    
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                </dataSource>
            </environment>
    
        </environments>
    
        <mappers>
            <!--引入映射文件-->
            <mapper resource=""/>
            <package name=""/>
        </mappers>
    
    </configuration>
    

MyBatis映射文件模板

  1. 映射文件模板一般命名为mybatis-mapper,扩展名为.xml

  2. 模板代码可根据自己需求更改,模板代码如下:

    <?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="">
    
    </mapper>
    

5. MyBatis 获取参数值

MyBatis获取参数值的两种方式:${}#{}

  • ${}的本质就是字符串拼接,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号
  • #{}的本质就是占位符赋值,即?形式,对字符串类型或日期类型的字段进行赋值时,可以自动添加单引号

5.1 单个字面量类型的参数

若mapper接口中的方法参数为单个的字面量类型,即只有一个参数

此时可以使用${}#{}任意的名称获取参数的值,注意${}需要手动加单引号

  1. UserMapper接口

    public interface UserMapper {
    
        User getUserByUsername(String username);
    }
    
  2. UserMapper.xml映射文件

    <mapper namespace="com.qingtian.mybatis.mapper.UserMapper">
        <!--User getUserByUsername();-->
        <select id="getUserByUsername" resultType="User">
            <!-- 注意下面的 username 可以换成任意名称均可 -->
            <!-- select * from t_user where username = #{username} -->
            select * from t_user where username = '${username}'
        </select>
    </mapper>
    
  3. Junit测试代码

    @Test
    public void testGetUserByUsername() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User users = mapper.getUserByUsername("admin");
        System.out.println(users);
    }
    

5.2 多个字面量类型的参数

若mapper接口中的方法参数为多个时,此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;以param1,param2...为键,以参数为值;因此只需要通过${}#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号

  1. UserMapper接口

    public interface UserMapper {
    
        User checkLogin(String username,String password);
    }
    
  2. UserMapper映射文件

    <!--User checkLogin(String username,String password);-->
    <select id="checkLogin" resultType="User">
        <!-- select * from t_user where username = #{arg0} and password = #{arg1} -->
        select * from t_user where username = #{param1} and password = #{param2}
    </select>
    
  3. Junit测试代码

    @Test
    public void testCheckLogin() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.checkLogin("admin","12345");
        System.out.println(user);
        sqlSession.close();
    }
    

5.3 map集合类型的参数

若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合将这些数据放在map中,只需要通过${}#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号

  1. UserMapper接口

    public interface UserMapper {
    
        User checkLoginByMap(Map<String,Object> map);
    }
    
  2. UserMapper映射文件

    <!--User checkLoginByMap(Map<String,Object> map);-->
    <select id="checkLoginByMap" resultType="User">
        <!-- select * from t_user where username = #{arg0} and password = #{arg1} -->
        select * from t_user where username = #{username} and password = #{password}
    </select>
    
  3. Junit测试代码

    @Test
    public void testCheckLoginByMap() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap<String, Object> map = new HashMap<>();
        map.put("username","admin");
        map.put("password","12345");
        User user = mapper.checkLoginByMap(map);
        System.out.println(user);
        sqlSession.close();
    }
    

5.4 实体类类型的参数

若mapper接口中的方法参数为实体类对象时,此时可以使用${}#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号

注意:这里的属性名不是指private Integer id成员变量的id,而是相应的getter,setter方法去掉get和set,第一个首字母小写的名称,例如:getId(),则可通过#{id}访问其属性值

  1. UserMapper接口

    public interface UserMapper {
    
        void insertUser(User user);
    }
    
  2. UserMapper映射文件

    <!--void insertUser(User user);-->
    <insert id="insertUser">
        insert into t_user values (null,#{username},#{password},#{age},#{gender},#{email})
    </insert>
    
  3. Junit测试代码

    @Test
    public void testInsertUser() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User(null, "Bob", "123456", 18, "男", "1234@qq.com");
        mapper.insertUser(user);
        sqlSession.close();
    }
    

5.5 Param标识参数

可以通过@Param注解标识mapper接口中的方法参数,此时会将这些参数放在map集合中,以@Param注解的value属性值为键以参数为值;以param1,param2...为键,以参数为值,相当于将arg0,arg2覆盖掉了,只需要通过${}#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号

  1. UserMapper接口

    public interface UserMapper {
        
        User checkLoginByParam(@Param("username") String username, @Param("password") String password);
    
    }
    
  2. UserMapper映射文件

    <!--User checkLoginByParam(@Param("username") String username, @Param("password") String password);-->
    <select id="checkLoginByParam" resultType="User">
        select * from t_user where username = #{username} and password = #{password}
    </select>
    
  3. Junit测试代码

    @Test
    public void testCheckLoginByParam() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.checkLoginByParam("Bob","123456");
        System.out.println(user);
        sqlSession.close();
    }
    

注意:

  • MyBatis中,获取参数时,MyBatis一般都会将其放在Map集合中,其key就是MyBatis规定的(在没使用@Param注解以及将实体类作为参数时),其值就是参数值,例如:

    MyBatis会以list参数,以emps为值构成一个Map,所以最好写一个@Param,这样就不用查MyBatis对这些参数默认会以一个什么样在值为键,例如对于List集合,其默认会用list为键,以其内容为值。

    insertMoreEmp(List<Emp> emps)
    

网站公告

今日签到

点亮在社区的每一天
去签到