4. 核心配置文件
4.1 核心配置文件详解
核心配置文件中的标签必须按照固定的顺序:
properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?
各标签说明
<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
<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
–>map
,List
–>list
<environments default="development">
:设置连接数据库的一个或多个环境,即基本信息,其中default
属性用于设置默认环境的id
,即默认使用id="development"
的信息连接数据库,其有一个子标签<environment id="development">
:设置连接数据库的环境,id表示连接数据库的环境的唯一标识
environment
的子标签<transactionManager type="JDBC|MANAGED">
:设置事务管理方式JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事务的提交或回滚需要手动处理
MANAGED:被管理,例如Spring
<dataSource type="POOLED|UNPOOLED|JNDI">
:配置数据源POOLED:表示使用数据库连接池缓存数据库连接
UNPOOLED:表示不使用数据库连接池
JNDI:表示使用上下文中的数据源
<mappers>
标签:引入映射文件,其有两个子标签<mapper resource=""/>
:根据resource
路径引入映射文件<package name="包名"/>
:以包为单位引入映射文件要求(重点):
mapper接口所在的包
要和映射文件所在的包
一致mapper接口
要和映射文件的名字
一致如下图所示,其实在编译后,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 创建配置文件模板
settings --> Editor --> File and Code Template
点击
+
创建模板,便可完成模板创建创建完模板后,选择new文件时便可以看见模板,注意这是模板名字而不是文件名
MyBatis核心配置文件模板
核心配置文件模板名字一般命名为
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> <!-- 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映射文件模板
映射文件模板一般命名为
mybatis-mapper
,扩展名为.xml
模板代码可根据自己需求更改,模板代码如下:
<?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接口中的方法参数为
单个的字面量类型
,即只有一个参数此时可以使用
${}
和#{}
以任意的名称获取参数的值
,注意${}
需要手动加单引号
UserMapper接口
public interface UserMapper { User getUserByUsername(String username); }
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>
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集合的键就可以获取相对应的值,注意${}需要手动加单引号
UserMapper接口
public interface UserMapper { User checkLogin(String username,String password); }
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>
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集合的键就可以获取相对应的值,注意${}需要手动加单引号
UserMapper接口
public interface UserMapper { User checkLoginByMap(Map<String,Object> map); }
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>
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}
访问其属性值
UserMapper接口
public interface UserMapper { void insertUser(User user); }
UserMapper映射文件
<!--void insertUser(User user);--> <insert id="insertUser"> insert into t_user values (null,#{username},#{password},#{age},#{gender},#{email}) </insert>
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集合的键就可以获取相对应的值,注意${}需要手动加单引号
UserMapper接口
public interface UserMapper { User checkLoginByParam(@Param("username") String username, @Param("password") String password); }
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>
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)