最近跟着视频教程练习了一下 mybatis 的用法,感觉还是不太难的,不过还没运用到项目实战,这里只是这个框架的最基本用法,相信在实际项目中用法更加灵活多变。
我把所有的测试方法都放在一个类中了,看起来可能有点乱,见谅!仅供参考!
一、搭建环境
(1)导入 jar 包
先下载 jar 包 如何下载
其实只要加入mybatis-3.4.6.jar 框架包和 mysql-connector-java-5.1.13-bin.jar mysql驱动包就够基本用法了
(2)写 mybatis 的配置文件,这里放在 src 下;下图是我的目录结构:
下面是 mybatis-conf.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>
<properties resource="db.properties" ></properties>
<typeAliases>
<!-- <typeAlias type="com.xiao.test.User" alias="_user"/> -->
<package name="com.xiao.test"/>
</typeAliases>
<!-- development:开发环境 -->
<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="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/xiao/test/userMapper.xml" />
<mapper class="com.xiao.test.UserAnnotation" /> <!-- 基于注解 -->
<mapper resource="com/xiao/test/teacherMapper.xml" /> <!-- 处理字段名与属性名不一致的Demo -->
<mapper resource="com/xiao/test/courseMapper.xml" /> <!-- 一对一 和 一对多 -->
</mappers>
</configuration>
(3)在mysql 数据库中建立一个 user 表,加入两条数据,并创建对应的实体类
实体类 User.java
package com.xiao.test;
public class User {
private int id;
private String name;
private int age;
public User(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
(4)映射文件 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.xiao.test.userMapper">
<!-- 根据 id 查询一个对象
大括号里的 id 是占位符,可以写其他的变量-->
<select id="getUserById" parameterType="int" resultType="com.xiao.test.User">
select * from user where id = #{id}
</select>
<!-- 参数中的 name 和 age 必须与 User 实体类中的属性一样 -->
<insert id="addUser" parameterType="com.xiao.test.User">
insert into user(name, age) values(#{name}, #{age})
</insert>
<delete id="deleteById" parameterType="int">
delete from user where id = #{id}
</delete>
<update id="updateUser" parameterType="com.xiao.test.User">
update user set name = #{name}, age = #{age} where id = #{id}
</update>
<select id="getAll" resultType="com.xiao.test.User">
select * from user
</select>
</mapper>
注意:
<1>实体类中要有 getter setter方法用于取值赋值,有参构造用于插入数据
<2>映射文件中的 sql 语句末尾不要分号
<3>一开始写 curd 测试的时候没有用类型别名,所以写参数类型时都用的全类名
<4>写好的映射文件要在配置文件中注册(见mybatis-conf.xml中的mappers标签)
(5)最后就是写测试类了,我放在了最后面。
另外,映射除了可以通过配置映射文件,还可以基于注解。写一个接口类,写上crud方法,并分别在方法上做好相应的注解,注意测试方法与配置映射文件的测试方法有区别
基于注解
package com.xiao.test;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
/**
* 这是一个接口,不用实现
* 注意:因为该类与userMapper.xml在同一目录位置,该类就别用UserMapper.java命名了,否则会冲突找不到
*/
public interface UserAnnotation {
@Insert("insert into user(name, age) values(#{name}, #{age})")
int addUser(User user);
@Delete("delete from user where id = #{id}")
int deleteById(int id);
@Update("update user set name = #{name}, age = #{age} where id = #{id}")
int updateUser(User user);
@Select("select * from user where id = #{id}")
User getUserById(int id);
@Select("select * from user")
List<User> getAll();
}
二、基本用法
下面把我用的表贴出来参考



(1)表字段与实体类属性名不一致的情况
package com.xiao.test;
//老师类
public class Teacher {
private int tid;
private String tname;
public Teacher() {
super();
// TODO Auto-generated constructor stub
}
public Teacher(int tid, String tname) {
super();
this.tid = tid;
this.tname = tname;
}
//getter、setter、toString方法
映射文件 teacherMapper.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.xiao.test.teacherMapper">
<!-- 表字段与实体类属性名不一致的情况
(1)把查出的表字段取别名为属性名
(2)查询结果映射
-->
<select id="getTeacherById1" parameterType="int" resultType="Teacher">
select t_id tid, t_name tname from teacher where t_id = #{id}
</select>
<select id="getTeacherById2" parameterType="int" resultMap="getTeacherMapper">
select * from teacher where t_id = #{id}
</select>
<resultMap type="Teacher" id="getTeacherMapper">
<id property="tid" column="t_id"/>
<result property="tname" column="t_name"/>
</resultMap>
</mapper>
在配置文件注册、见配置文件,测试类见最后面。
(2)一对一、一对多、模糊查询
假设一门课程对应一个老师,一门课程对应多个学生
实体类(上面的Teacher.java,Course.java,Students.java)记得加上无参构造(重要)
package com.xiao.test;
import java.util.List;
//课程类
public class Course {
private int cid;
private String cname;
private Teacher teacher; //传入老师对象
private List<Students> list; //对应多个学生
public Course() {
super();
}
public Course(int cid, String cname, Teacher teacher, List<Students> list) {
super();
this.cid = cid;
this.cname = cname;
this.teacher = teacher;
this.list = list;
}
//getter、setter、toString方法
package com.xiao.test;
public class Students {
private int sid;
private String sname;
public Students() {
super();
// TODO Auto-generated constructor stub
}
public Students(int sid, String sname) {
super();
this.sid = sid;
this.sname = sname;
}
//getter、setter、toString方法
模糊查询需要一个 条件实体类
package com.xiao.test;
public class Conditions {
private int minTeacherId;
private int maxTeacherId;
private String name;
public Conditions(int minTeacherId, int maxTeacherId, String name) {
super();
this.minTeacherId = minTeacherId;
this.maxTeacherId = maxTeacherId;
this.name = name;
}
//getter、setter方法
映射文件 courseMapper.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.xiao.test.courseMapper">
<!-- 模糊查询:需要一个 条件实体类 -->
<select id="getCourseByLike" parameterType="Conditions" resultType="Course">
select c_id cid, c_name cname from course where
<if test="name != '%null%'">
c_name like #{name} and
</if>
c_teacher_id between #{minTeacherId} and #{maxTeacherId}
<!-- 后面可以加其他条件 -->
</select>
<!-- 一对多: 假设一门课程值对应多个学生 -->
<!-- 根据 id 查询一个 course 对象(附带选择这门课程的多个 students 对象)
(1)select * from course c,students s where c.c_id = s.s_course_id and c.c_id = 1
(2)select * from students where s_course_id = (select c_id from course where c_id = 1)
-->
<select id="getCourseById3" parameterType="int" resultMap="getCourseMapper3">
select * from course c,students s where c.c_id = s.s_course_id and c.c_id = #{id}
</select>
<resultMap type="Course" id="getCourseMapper3">
<id property="cid" column="c_id"/>
<result property="cname" column="c_name"/>
<collection property="list" ofType="Students">
<id property="sid" column="s_id"/>
<result property="sname" column="s_name"/>
</collection>
</resultMap>
<select id="getCourseById4" parameterType="int" resultMap="getCourseMapper4">
select * from course where c_id = #{id}
</select>
<select id="getStudents" parameterType="int" resultType="Students">
select s_id sid, s_name sname from students where s_course_id = #{id}
</select>
<resultMap type="Course" id="getCourseMapper4">
<id property="cid" column="c_id"/>
<result property="cname" column="c_name"/>
<collection property="list" column="c_id" select="getStudents"></collection>
</resultMap>
<!-- 一对一: 假设一门课程值对应一个老师 -->
<!-- 根据 id 查询一个 course 对象(附带一个 teacher 对象)
(1)select * from course c,teacher t where c.c_teacher_id = t.t_id and c_id = 1
(2)select * from teacher where t_id = (select c_teacher_id from course where c_id = 1)
-->
<select id="getCourseById1" parameterType="int" resultMap="getCourseMapper1">
select * from course c,teacher t where c.c_teacher_id = t.t_id and c.c_id = #{id}
</select>
<resultMap type="Course" id="getCourseMapper1">
<id property="cid" column="c_id"/>
<result property="cname" column="c_name"/>
<association property="teacher" javaType="Teacher">
<id property="tid" column="t_id"/>
<result property="tname" column="t_name"/>
</association>
</resultMap>
<select id="getCourseById2" parameterType="int" resultMap="getCourseMapper2">
select * from course where c_id = #{id}
</select>
<select id="getTeacher" parameterType="int" resultType="Teacher">
select t_id tid, t_name tname from teacher where t_id = #{id}
</select>
<resultMap type="Course" id="getCourseMapper2">
<id property="cid" column="c_id"/>
<result property="cname" column="c_name"/>
<association property="teacher" column="c_teacher_id" select="getTeacher"></association>
</resultMap>
</mapper>
下面是所有用法的测试类
package com.xiao.test;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MainTest {
public static void main(String[] args) {
InputStream is = MainTest.class.getClassLoader().getResourceAsStream("mybatis-conf.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// SqlSession session = factory.openSession(true); //自动提交
SqlSession session = factory.openSession();
//模糊查询
String name = "m";
Conditions parameter = new Conditions(1, 2, "%" + name + "%");
String statement = "com.xiao.test.courseMapper.getCourseByLike";
List<Course> list = session.selectList(statement, parameter);
System.out.println(list);
//一对多
// String statement = "com.xiao.test.courseMapper.getCourseById4";
// Course course = session.selectOne(statement, 2);
// System.out.println(course);
//一对一
// String statement = "com.xiao.test.courseMapper.getCourseById2";
// Course course = session.selectOne(statement, 1);
// System.out.println(course);
//处理字段名与属性名不一致的Demo
// String statement = "com.xiao.test.teacherMapper.getTeacherById2";
// Teacher teacher = session.selectOne(statement, 1);
// System.out.println(teacher);
// String statement = "com.xiao.test.userMapper.getUserById";
// User u = session.selectOne(statement, 1);
// System.out.println(u);
// String statement = "com.xiao.test.userMapper.addUser";
// int i = session.insert(statement, new User(-1, "tom", 21)); //id 是自增的
// session.commit(); //需要手动提交才能保存到数据库
// System.out.println(i);
// String statement = "com.xiao.test.userMapper.updateUser";
// int i = session.update(statement, new User(1, "test", 21)); // 把 id=1的 xiao 改成了 test
// session.commit();
// System.out.println(i);
// String statement = "com.xiao.test.userMapper.deleteById";
// int i = session.delete(statement, 2); // 把 id=2的 admin 删除
// session.commit();
// System.out.println(i);
// String statement = "com.xiao.test.userMapper.getAll";
// List<User> allUser = session.selectList(statement);
// System.out.println(allUser);
//基于注解
// UserAnnotation mapper = session.getMapper(UserAnnotation.class);
// List<User> allUser = mapper.getAll();
// System.out.println(allUser);
session.close();
}
}
我把以上的源代码放到了我的百度云,供参考 mybatis练习


被折叠的 条评论
为什么被折叠?



