今天学习一下mybatis,做一下整理,把自己遇到的错误和一些经验写下来,以后可以快速复习。如果对别人有帮助那就更好了。
- 在pom.xml加入相关包
<dependencies>
<!--加载mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<!--导入mybatis包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!--导入测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--导入日志包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
- 创建bean和mapper文件(mapper_interface放在main目录下,idea中xml文件放在resources(resources里用/分割建包,包名与接口的报名相同相同的)目录下(否则会出现找不到的情况)),相同的包名编译后两个文件就会处于一个文件夹。详情见target\classes。
eg:为下文的mapper.xml文件做参考
Order类 (省去getter和setter) //为下文参考
private int id;
private Date ordertime;
private double total;
//当前订单属于哪一个用户
private User user;
User类
private int id;
private String username;
private String password;
private Date birthday;
//描述的是当前用户存在哪些订单
private List<Order> orderList;
//描述的是当前用户具备哪些角色
private List<Role> roleList;
Role类:
private int id;
private String roleName;
private String roleDesc;
核心配置文件
<?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>
<!--通过properties标签加载外部properties文件-->
<properties resource="jdbc.properties"></properties>
<typeAliases>
<!--批量取别名-->
<!--<package name="com.bienan.domain"></package>-->
<!--一个一个取别名(用Order代替com.bienan.domain.Order)-->
<typeAlias type="com.bienan.domain.Order" alias="Order"></typeAlias>
<typeAlias type="com.bienan.domain.User" alias="User"></typeAlias>
<typeAlias type="com.bienan.domain.Role" alias="Role"></typeAlias>
</typeAliases>
<!--default选取默认的环境-->
<!--数据源环境-->
<environments default="developement">
<environment id="developement">
<transactionManager type="JDBC"></transactionManager>
<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>
<!--没有写内容的xml不要加载,不然会出现Error parsing Mapper XML. Cause: java.lang.NullPointerException错误-->
<mapper resource="com/bienan/mapper/UserMapper.xml"></mapper>
<mapper resource="com/bienan/mapper/OrderMapper.xml"></mapper>
<!--批量加载-->
<!--<package name="com.bienan.mapper"></package>-->
<!--根据接口加载-->
<!--<mapper class="com.bienan.mapper.OrderMapper"></mapper>-->
</mappers>
</configuration>
3.数据库操作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="com.bienan.mapper.OrderMapper">
<!--一对一 一个Order对应一个User-->
<resultMap id="orderMap" type="Order">
<!--手动指定字段与实体属性的映射关系
column: 数据表的字段名称
property:实体的属性名称
-->
<id column="oid" property="id"></id>
<result column="ordertime" property="ordertime"></result>
<result column="total" property="total"></result>
<!--<result column="uid" property="user.id"></result>-->
<!--<result column="username" property="username"></result>-->
<!--<result column="password" property="password"></result>-->
<!--<result column="birthday" property="birthday"></result>-->
<!-- 第二种写法
property: 当前实体(order)中的属性名称(private User user)
javaType: 当前实体(order)中的属性的类型(User)
-->
<association property="user" javaType="User">
<id column="uid" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
</association>
</resultMap>
<select id="findAll" resultMap="orderMap">
SELECT *,u.id uid,o.`id` oid FROM `orders` AS o ,`user` AS u WHERE u.id=o.`uid`
</select>
</mapper>
UserMapper.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="com.bienan.mapper.UserMapper"> <-- 命名空间要为接口全类名-->
<!--一对多-->
<resultMap id="userMap" type="User">
<id column="uid" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
<!--配置集合信息
property:集合名称
ofType:当前集合中的数据类型-->
<!--JavaType和ofType都是用来指定对象类型的,
但是JavaType是用来指定pojo中属性的类型,
而ofType指定的是 映射到list集合属性中pojo的类型 。-->
<collection property="orderList" ofType="Order">
<!--封装order的数据-->
<id column="oid" property="id"></id>
<result column="ordertime" property="ordertime"></result>
<result column="total" property="total"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="userMap">
SELECT *,o.id oid FROM USER u,orders o WHERE u.id=o.uid
</select>
<!--多对多-->
<resultMap id="UserAndRoleMap" type="User">
<id column="userid" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
<collection property="roleList" ofType="Role">
<id column="roleid" property="id"></id>
<result column="roleName" property="roleName"></result>
<result column="roleDesc" property="roleDesc"></result>
</collection>
</resultMap>
<select id="findUserAndRoleAll" resultMap="UserAndRoleMap">
SELECT * FROM (USER AS u LEFT JOIN sys_user_role AS ur ON u.`id`=ur.`userid`)LEFT JOIN sys_role AS r ON ur.`roleid`= r.`id`
</select>
</mapper>
其他的增删改模板
<!--删除操作 基本数据类型mybatis已经配置别名 java.lang.Integer -->int java.lang.String-->string .....-->
<--parameterType传递的参数类型->
<!--resultType结果类型
resultMap结果为集合类型-->
<delete id="delete" parameterType="int">
delete from user where id=#{abc}
</delete>
<!--修改操作-->
<update id="update" parameterType="com.itheima.domain.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
<!--插入操作-->
<insert id="save" parameterType="com.itheima.domain.User">
insert into user values(#{id},#{username},#{password})
</insert>
4.测试文件
@Test
public void test3() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.findUserAndRoleAll();
for (User user : users) {
System.out.println(user);
}
}