Mapper基础的拓展包括:别名、属性[动态引入]、resultMap[解决列名和属性名不匹配]、Mapper接口[好比DAO层]、参数处理[注解@Param处理多个参数]、myBatis插件[eclipse的插件MyBatipse-编写映射文件有代码提示]
一、typeAlias 类型别名【自定义别名、系统自带别名】
1、类型别名:为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写
2、配置自定义别名:
(1)方式一:为具体某个类配置别名
//在全局配置文件中添加别名的配置:
<configuration>
<typeAliases>
<typeAlias type="com.shan.hello.User" alias="User"/>
</typeAliases>
</configuration>
//在Mapper文件中使用:
<select id="get" parameterType="java.lang.Long" resultType="User">
select * from t_user where id = #{id}
</select>
★(2)方式二:为具体包配置别名【一般包名就写到domain包即可】,然后包下的类 直接类首字母小写 即可使用:
//在全局配置文件中添加别名的配置:
<configuration>
<typeAliases>
<package name="com.shan.hello"/>
</typeAliases>
</configuration>
//在Mapper文件中使用:
<select id="get" parameterType="java.lang.Long" resultType="user">
select * from t_user where id = #{id}
</select>
(3)方式三:使用注解的方式,贴标签到domain类上 @Alias("**")
3、系统自带的别名【基本类型+包装类型,还有map类型】—作用:需要返回值时,设置返回类型 resultType
—就是基本类型加个下划线,包装类型的别名就是基本类型啦。例如int的别名是_int, Integer的别名是int
■ 举例: 查询的返回类型是整型,使用别名int:
<!-- 查询总数 -->
<select id="getCounts" resultType="int">
select count(id) from t_user;
</select>
@Test
public void testGetCounts() throws IOException {
SqlSession session = MyBatisUtil.getSession();
int count = session.selectOne("com.shan.hello.UserMapper.getCounts");
System.out.println(count);
session.close();
}
■ 举例: 查询的返回类型是部分列,使用别名map:
<!-- 查询部分列,每一行记录以map[键值对]形式返回 -->
<select id="getPartCrows" resultType="map">
select id, name from t_user where id = #{id};
</select>
@Test
public void testGetPartCrows() throws IOException {
SqlSession session = MyBatisUtil.getSession();
Map<String, Object> user = session.selectOne("com.shan.hello.UserMapper.getPartCrows", 2L);
System.out.println(user);
session.close();
}
二、properties 属性配置 [动态引入]
1、动态替换:属性在外部进行配置,然后进行动态替换:
(1)建立一个外部的.properties 文件 【key=value形式】:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisdemo
username=root
password=admin
(2)引入和动态替换,通过properties的resource引入,然后动态替换是使用${}:
<configuration>
<properties resource="db.properties"/>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
三、resultMap [解决表的列名 和对象的属性名 不匹配的问题]
? 默认情况下,通过设置返回类型resultType 是要求表的列名和对象的属性名要一致,否则会出错。
1、方式一:使用别名:
<select id="getList" parameterType="java.lang.Long" resultType="user">
select u_id id, u_name name, u_salary salary from t_user;
</select>
★ 2、方式二:使用resultMap:
- resultMap 和 resultType不能同时使用
<resultMap id="BaseResultMap" type="User" >
<id column="u_id" property="id"/>
<result column="u_name" property="name"/>
<result column="u_salary" property="salary"/>
</resultMap>
<select id="getList" parameterType="java.lang.Long" resultMap="BaseResultMap">
select u_id, u_name, u_salary from t_user;
</select>
四、Mapper接口和原理 [好比是DAO层]
1、回顾之前执行sql的方式是:使用namespace.id 的方式找到sql元素,并执行sql语句。
■ 该方式存在几个问题:
public void testGet() throws IOException {
SqlSession session = MyBatisUtil.getSession();
User user = session.selectOne("com.shan.hello.UserMapper.get", 2L);
System.out.println(user);
session.close();
}
(1)第一个参数:因为传入的是String类型的参数,可能会写错,写错检查也是等到运行时才发现
(2)第二个参数:Object类型,不需要被检查,万物皆对象
(3)每个操作【增删改查】的代码模板是相同的,可以抽取
--------解决:使用Mapper 接口,类似DAO接口,在Mapper接口中去定义每一个操作方法。
★ DAO诞生的背景:以前我们是把数据库的操作代码编写到客户端里:
①跟业务代码混杂在一起 ;②而且每次操作数据库时都需要重复书写代码
2、Mapper组件:Mapper接口+Mapper文件
(1)Mapper 文件和Mapper 接口应该放到同一包下
(2)Mapper文件中的namespace 对应 Mapper接口的全限定名称
(3)Mapper文件中的操作元素的**id **对应 Mapper接口的方法名称
public interface UserMapper {
void save(User user);
void delete(Long id);
void update(User user);
void get(Long id);
List<User> getListAll();
}
<mapper namespace="com.shan.hello.mapper.UserMapper">
<insert id="save">
insert into t_user (name, salary) values (#{name}, #{salary});
</insert>
<delete id="delete">
delete from t_user where id = #{id};
</delete>
<update id="update">
update t_user set name = #{name}, salary = #{salary} where id = #{aid};
</update>
<select id="get" parameterType="java.lang.Long" resultType="user">
select * from t_user where id = #{id}
</select>
<select id="getListAll" parameterType="java.lang.Long" resultType="user">
select * from t_user;
</select>
</mapper>
@Test
public void testGetList() throws IOException{
SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.getListAll();
System.out.println(users);
}
五、参数处理【使用注解@Param实现处理多个参数】
—myBatis默认情况下只能处理一个参数,解决查询多个参数的方法:
1、方法一:封装成一个对象 【可以,但是麻烦,需要定义很多的javaBean对象】
2、方法二:封装成Map对象 (Map的key好比时javaBean对象的属性名,Map的value好比时javaBean的属性值)【也有点麻烦,因为每次都需要创建一个Map对象】
public interface ClientMapper {
Client login2(Map<String,Object> map);
}
<!-- Mapper文件 -->
<mapper namespace="com.shan.params.mapper.ClientMapper">
<select id="login2" resultType="Client">
select id, username, password from client where username = #{username} and password = #{password} ;
</select>
</mapper>
@Test
public void testLogin2() throws IOException {
Map<String,Object> paramMap = new HashMap<String, Object>() {
{
this.put("username", "shan");
this.put("password", "1");
}
};
SqlSession session = MyBatisUtil.getSession();
ClientMapper clientMapper = session.getMapper(ClientMapper.class);
Client client = clientMapper.login2(paramMap);
System.out.println(client);
session.close();
}
★ 3、方法三:使用Param注解,底层原理就是方式二,myBatis帮我们使用map来封装。
public interface ClientMapper {
Client login3(@Param("username")String username, @Param("password")String password);
}
<!-- Mapper文件 -->
<mapper namespace="com.shan.params.mapper.ClientMapper">
<select id="login3" resultType="Client">
select id, username, password from client where username = #{username} and password = #{password} ;
</select>
</mapper>
@Test
public void testLogin2() throws IOException {
SqlSession session = MyBatisUtil.getSession();
ClientMapper clientMapper = session.getMapper(ClientMapper.class);
Client client = clientMapper.login3("shan", "1");
System.out.println(client);
session.close();
}
六、myBatis插件 [eclipse的插件MyBatipse]
1、eclipse 安装 插件MyBatispse
■ 方式一(在线安装):看插件官网提供的方式【有的插件会提供拖动安装,重启eclipse即可】
● 通用:Help -> Eclipse Marketplace -> 搜 MyBatipse,然后进行安装即可
■ 验证是否安装成功,在eclipse的window->Preferences-> 搜 MyBatipse,有看到即成功
|