优化MyBatis配置文件中的配置
1.连接数据库的配置单独放在一个properties文件中
在conf.xml文件中引用此文件:
<?xml version="1.0" encoding="UTF-8?>
<!DOCTYPE configuration PUBLIC "-//mybitis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引用db.properties配置文件-->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver"
value="${driver}" />
<property name="url"
value="${url}" />
<property name="username"
value="${name}" />
<property name="password"
value="${password}" />
</environment>
</environments>
</configuration>
创建db.properties文件,在文件中编写链接数据库需要使用到的数据库驱动,如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
name=root
password=123456
2.为实体类定义别名,简化sql映射xml的引用
①单个实体类示例:
在conf.xml文件中
<configuration></configuration>
标签中添加如下配置:
<typeAliases>
<typeAlias type="me.gacl.domain.User" alias="_User"/>
</typeAliases>
alias所指名字即是type路径下类的别名。
同包下多个实体类示例:
在conf.xml文件中
<configuration></configuration>
标签中添加如下配置:
<typeAliases>
<package name="me.gacl.domain"/>
</typeAliases>
name所指包名下的所有类均设置别名,名称设置方式为去除类所在的包后的简单类名。
解决字段名与实体类属性名不相同的冲突
假设定义了一个实体类Order和数据库表orders,Order实体类中属性名和orders表中的字段是不一样的
数据库:
CREATE TABLE orders(
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(20),
order_price FLOAT
);
INSERT INTO orders(order_no, order_price) VALUES('aaaa', 23);
INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33);
INSERT INTO orders(order_no, order_price) VALUES('cccc', 22);
实体类Order:
private int id; //id===>order_id
private String orderNo; //orderNo===>order_no
private float price; //price===>order_price
//...省略部分代码
创建一个orderMapper.xml文件,orderMapper.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="me.gacl.mapping.orderMapper">
<!--根据id查询得到一个order对象,使用这个查询是查询不到我们想要的结果的,这主要是因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录-->
<select id="getOrderById" parameterType="int"
resultType="me.gacl.domain.Order">
select * from orders where order_id=#{id}
</select>
</mapper>
我们可以通过设置给查询的字段名称设置和实体类属性名字相同的别名的方式,来使查询的结果和实体类属性一一对应,如下所示:
<select id="selectOrder" parameterType="int"
resultType="me.gacl.domain.Order">
select order_id id, order_no orderNo,order_price price from orders where order_id=#{id}
</select>
亦或者可以通过< resultMap >映射实体类属性名和表的字段名一一对应,如下所示:
<select id="selectOrderResultMap" parameterType="int"
resultMap="orderResultMap">
select * from orders where order_id=#{id}
</select>
<!--通过<resultMap>映射实体类属性名和表的字段名对应关系-->
<resultMap type="me.gacl.domain.Order" id="orderResultMap">
<!--用id属性来映射主键字段-->
<id property="id" column="order_id"/>
<!--用result属性来映射非主键字段-->
<result property="orderNo" column="order_price"/>
<result property="price" column="order_price"/>
</resultMap>
最后,在conf.xml文件中注册orderMapper.xml映射文件。
<mappers>
<mapper resource="me/gacl/mapping/orderMapper.xml"/>
</mappers>
实现关联表查询
一对一关联:
Mybatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下:
- property:对象属性的名称
- javaType:对象属性的类型
- column:所对应的外间字段名称
- select:使用另一个查询封装的结果