MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。

  MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

1 第一个MyBatis程序

  首先需要加入需要的jar包,构建Spring环境请参考:Spring学习之第一个hello world程序。这里我们需要加入mybatis包和MySQL驱动包,使用IDEA环境来开发程序,最后工程加入的包如下图所示:

  然后需要在test数据库中新建测试表user,sql语句如下所示:

  1. create table users (
  2. id int primary key auto_increment,
  3. name varchar(20),
  4. age int
  5. );
  6. insert into users (name, age) values('Tom', 12);
  7. insert into users (name, age) values('Jack', 11);

1.1 定义表对应的实体类

  1. public class User {
  2.  
  3. private int id;
  4. private String name;
  5. private int age;
  6.  
  7. public User() { }
  8.  
  9. public User(int id, String name, int age) {
  10. this.id = id;
  11. this.name = name;
  12. this.age = age;
  13. }
  14.  
  15. public int getId() {
  16. return id;
  17. }
  18.  
  19. public void setId(int id) {
  20. this.id = id;
  21. }
  22.  
  23. public String getName() {
  24. return name;
  25. }
  26.  
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30.  
  31. public int getAge() {
  32. return age;
  33. }
  34.  
  35. public void setAge(int age) {
  36. this.age = age;
  37. }
  38.  
  39. @Override
  40. public String toString() {
  41. return "User{" +
  42. "id=" + id +
  43. ", name='" + name + '\'' +
  44. ", age=" + age +
  45. '}';
  46. }
  47. }

1.2 定义MyBatista的mybatisConfig.xml配置文件和user表的sql映射文件userMapper.xml

mybatisConfig.xml文件,该文件是在src目录下新建的。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3.  
  4. <configuration>
  5. <environments default="development">
  6. <!-- development:开发环境 work:工作模式 -->
  7. <environment id="development">
  8. <transactionManager type="JDBC" />
  9. <!-- 数据库连接方式 -->
  10. <dataSource type="POOLED">
  11. <property name="driver" value="com.mysql.jdbc.Driver" />
  12. <property name="url" value="jdbc:mysql://192.168.1.150/test" />
  13. <property name="username" value="root" />
  14. <property name="password" value="123456" />
  15. </dataSource>
  16. </environment>
  17. </environments>
  18.  
  19. <!-- 注册表映射文件 -->
  20. <mappers>
  21. <mapper resource="com/mybatis/userMapper.xml"/>
  22. </mappers>
  23.  
  24. </configuration>

userMapper.xml文件,该配置文件在com.mybatis包下,user表对应的实体类User也在com.mybatis包下。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3.  
  4. <mapper namespace="com.mybatis.userMapper">
  5. <!-- 根据id查询一个User对象 -->
  6. <select id="getUser" parameterType="int" resultType="com.mybatis.User">
  7. select * from users where id=#{id}
  8. </select>
  9. <select id="getUserAll" resultType="com.mybatis.User">
  10. select * from users
  11. </select>
  12.  
  13. <!-- 插入一个User对象 -->
  14. <insert id="insertUser" parameterType="com.mybatis.User">
  15. insert into users (name, age) value(#{name}, #{age})
  16. </insert>
  17.  
  18. <!-- 删除一个User对象 -->
  19. <delete id="deleteUser" parameterType="int">
  20. delete from users where id=#{id}
  21. </delete>
  22.  
  23. <!-- 更新一个User对象-->
  24. <update id="updateUser" parameterType="com.mybatis.User">
  25. update users set name=#{name}, age=#{age} where id=#{id}
  26. </update>
  27. </mapper>

测试代码如下:

  1. public class mybaitstest {
  2.  
  3. SqlSessionFactory sessionFactory = null;
  4. SqlSession sqlSession = null;
  5.  
  6. {
  7. String resource = "mybatisConfig.xml";
  8. // 加载mybatis的配置文件(它也加载关联的映射文件)
  9. Reader reader = null;
  10. try {
  11. reader = Resources.getResourceAsReader(resource);
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. }
  15. // 构建sqlSession的工厂
  16. sessionFactory = new SqlSessionFactoryBuilder().build(reader);
  17. // 创建能执行映射文件中sql的sqlSession,默认是手动提交事务的,使用自动提交的话加上参数 true
  18. sqlSession = sessionFactory.openSession(true);
  19. }
  20.  
  21. public void testSelectUser() {
  22. // 映射sql的标识字符串
  23. String statement = "com.mybatis.userMapper" + ".getUser";
  24. // 执行查询返回一个唯一user对象的sql
  25. User user = sqlSession.selectOne(statement, 1);
  26. System.out.println(user);
  27. }
  28.  
  29. public void testSelectAll() {
  30. List<User> users = sqlSession.selectList("com.mybatis.userMapper.getUserAll");
  31. System.out.println(users);
  32. }
  33.  
  34. public void testInsertUser(User user) {
  35. int insert = sqlSession.insert("com.mybatis.userMapper.insertUser", user);
  36. // 如果不是自动提交的话,需要使用 sqlSession。commit()
  37. System.out.println(insert);
  38. }
  39.  
  40. public void testDeleteUser(int id) {
  41. int delete = sqlSession.delete("com.mybatis.userMapper.deleteUser", id);
  42. System.out.println(delete);
  43. }
  44.  
  45. public void testUpdateUser(User user) {
  46. int update = sqlSession.update("com.mybatis.userMapper.updateUser", user);
  47. System.out.println(update);
  48. }
  49.  
  50. public static void main(String[] args) throws IOException {
  51.  
  52. new mybaitstest().testSelectUser();
  53. }
  54. }

最后输出结果为:

2 基于注解的方式使用MyBatis

  基于注解的方式使用MyBatis,首先定义对应表的sql映射接口。

  1. public interface IUserMapper {
  2.  
  3. @Insert("insert into users (name, age) value(#{name}, #{age})")
  4. public int add(User user);
  5.  
  6. @Delete("delete from users where id=#{id}")
  7. public int deleteById(int id);
  8.  
  9. @Update("update users set name=#{name}, age=#{age} where id=#{id}")
  10. public int update(User user);
  11.  
  12. @Select("select * from users where id=#{id}")
  13. public User getById(int id);
  14.  
  15. @Select("select * from users")
  16. public List<User> getAll();
  17. }

  然后在mybatisConfig.xml配置文件中注册该接口:

  1. <!-- 注册表映射文件 -->
  2. <mappers>
  3. <mapper class="com.mybatis.IUserMapper"/>
  4. </mappers>

测试示例:

  1. /**
  2. * 使用注解测试的方法
  3. */
  4. public void test() {
  5. IUserMapper userMapper = sqlSession.getMapper(IUserMapper.class);
  6.  
  7. User user = userMapper.getById(1);
  8. System.out.println(user);
  9. }

3 如何简化配置操作

  以上两个程序示例都是直接在配置文件中写连接数据库的信息,其实还可以专门把数据库连接信息写到一个db.proteries文件中,然后由配置文件来读取该db.properies文件信息。db.proteries文件内容如下:

  1. user=root
  2. password=123456
  3. driverClass=com.mysql.jdbc.Driver
  4. jdbcUrl=jdbc:mysql://192.168.1.150/test

  然后在mybatisConfig.xml配置文件中将数据库环境信息更改为如下所示:

  1. <properties resource="db.properties"/>
  2.  
  3. <environments default="development">
  4. <!-- development:开发环境 work:工作模式 -->
  5. <environment id="development">
  6. <transactionManager type="JDBC" />
  7. <!-- 数据库连接方式 -->
  8. <dataSource type="POOLED">
  9. <property name="driver" value="${driverClass}" />
  10. <property name="url" value="${jdbcUrl}" />
  11. <property name="username" value="${user}" />
  12. <property name="password" value="${password}" />
  13. </dataSource>
  14. </environment>
  15. </environments>

  配置表对应的sql映射文件时,可以使用别名来简化配置,在mybatisConfig.xml中添加如下配置,在userMapper中parameterType就可以配置为"_User"。

  1. <typeAliases>
  2. <typeAlias type="com.mybatis.User" alias="_User"/>
  3. </typeAliases>

4 字段名与实体类属性名不匹配的冲突

  新建表和数据,在test数据库中执行以下SQL语句:

  1. create table orders (
  2. order_id int primary key auto_increment,
  3. order_no varchar(20),
  4. order_price float
  5. );
  6. insert into orders (order_no, order_price) values('aaa', 12);
  7. insert into orders (order_no, order_price) values('bbb', 13);
  8. insert into orders (order_no, order_price) values('ccc', 14);

  创建对应表的类:

  1. public class Order {
  2.  
  3. private int i;
  4. private String no;
  5. private float price;
  6.  
  7. public Order() { }
  8.  
  9. public Order(int i, String no, float price) {
  10. this.i = i;
  11. this.no = no;
  12. this.price = price;
  13. }
  14.  
  15. public int getI() {
  16. return i;
  17. }
  18.  
  19. public void setI(int i) {
  20. this.i = i;
  21. }
  22.  
  23. public String getNo() {
  24. return no;
  25. }
  26.  
  27. public void setNo(String no) {
  28. this.no = no;
  29. }
  30.  
  31. public float getPrice() {
  32. return price;
  33. }
  34.  
  35. public void setPrice(float price) {
  36. this.price = price;
  37. }
  38. }

  mybaitsConfig.xml配置如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3.  
  4. <configuration>
  5.  
  6. <properties resource="db.properties"/>
  7.  
  8. <typeAliases>
  9. <typeAlias type="com.mybatis.Order" alias="Order"/>
  10. </typeAliases>
  11.  
  12. <environments default="development">
  13. <!-- development:开发环境 work:工作模式 -->
  14. <environment id="development">
  15. <transactionManager type="JDBC" />
  16. <!-- 数据库连接方式 -->
  17. <dataSource type="POOLED">
  18. <property name="driver" value="${driverClass}" />
  19. <property name="url" value="${jdbcUrl}" />
  20. <property name="username" value="${user}" />
  21. <property name="password" value="${password}" />
  22. </dataSource>
  23. </environment>
  24. </environments>
  25.  
  26. <!-- 注册表映射文件 -->
  27. <mappers>
  28. <mapper resource="com/mybatis/orderMapper.xml"/>
  29. </mappers>
  30.  
  31. </configuration>

  接下来配置orderMapper.xml:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3.  
  4. <mapper namespace="com.mybatis.orderMapper">
  5.  
  6. <!-- 根据id查询一个Order对象 -->
  7. <select id="getOrder" parameterType="int" resultType="Order">
  8. SELECT order_id id, order_no no, order_price price FROM orders WHERE order_id=#{id}
  9. </select>
  10.  
  11. <!-- 这种解决字段与属性冲突方式较常用 -->
  12. <select id="getOrder2" parameterType="int" resultType="Order" resultMap="getOrder2Map">
  13. SELECT * FROM orders WHERE order_id=#{id}
  14. </select>
  15. <!--
  16. resultMap 封装映射关系
  17. id 专门针对主键
  18. result 针对一般字段
  19. -->
  20. <resultMap id="getOrder2Map" type="Order">
  21. <id property="id" column="order_id"/>
  22. <result property="no" column="order_price"/>
  23. <result property="price" column="order_price"/>
  24. </resultMap>
  25.  
  26. </mapper>

测试用例:

  1. public class MyBaitsMain {
  2. SqlSessionFactory sessionFactory = null;
  3. SqlSession sqlSession = null;
  4.  
  5. {
  6. String resource = "mybatisConfig.xml";
  7. // 加载mybatis的配置文件(它也加载关联的映射文件)
  8. Reader reader = null;
  9. try {
  10. reader = Resources.getResourceAsReader(resource);
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. // 构建sqlSession的工厂
  15. sessionFactory = new SqlSessionFactoryBuilder().build(reader);
  16. // 创建能执行映射文件中sql的sqlSession,默认是手动提交事务的,使用自动提交的话加上参数 true
  17. sqlSession = sessionFactory.openSession(true);
  18. }
  19.  
  20. public static void main(String[] args) {
  21. String statement = "com.mybatis.orderMapper.getOrder";
  22. String statement2 = "com.mybatis.orderMapper.getOrder2";
  23.  
  24. Order order = new MyBaitsMain().sqlSession.selectOne(statement, 2);
  25. System.out.println(order);
  26. order = new MyBaitsMain().sqlSession.selectOne(statement2, 2);
  27. System.out.println(order);
  28. }
  29. }

输出结果为:

5 实现关联表查询

5.1 一对一关联

  这里实现班级id查询班级信息,班级信息中包括老师信息。首先创建表结构:

  1. CREATE TABLE teacher(
  2. t_id INT PRIMARY KEY AUTO_INCREMENT,
  3. t_name VARCHAR(20)
  4. );
  5. CREATE TABLE class(
  6. c_id INT PRIMARY KEY AUTO_INCREMENT,
  7. c_name VARCHAR(20),
  8. teacher_id INT
  9. );
  10. ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);
  11.  
  12. INSERT INTO teacher(t_name) VALUES('LS1');
  13. INSERT INTO teacher(t_name) VALUES('LS2');
  14.  
  15. INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1);
  16. INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2);

  定义表对应的实体类:

  1. public class Teacher {
  2.  
  3. private int id;
  4. private String name;
  5.  
  6. public Teacher() {
  7. }
  8.  
  9. public Teacher(int id, String name) {
  10. this.id = id;
  11. this.name = name;
  12. }
  13.  
  14. public int getId() {
  15. return id;
  16. }
  17.  
  18. public void setId(int id) {
  19. this.id = id;
  20. }
  21.  
  22. public String getName() {
  23. return name;
  24. }
  25.  
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29.  
  30. @Override
  31. public String toString() {
  32. return "Teacher{" +
  33. "id=" + id +
  34. ", name='" + name + '\'' +
  35. '}';
  36. }
  37. }

Teacher类

  1. public class Classes {
  2.  
  3. private int id;
  4. private String name;
  5. private Teacher teacher;
  6.  
  7. public Classes() {
  8. }
  9.  
  10. public Classes(int id, String name, Teacher teacher) {
  11. this.id = id;
  12. this.name = name;
  13. this.teacher = teacher;
  14. }
  15.  
  16. public int getId() {
  17. return id;
  18. }
  19.  
  20. public void setId(int id) {
  21. this.id = id;
  22. }
  23.  
  24. public Teacher getTeacher() {
  25. return teacher;
  26. }
  27.  
  28. public void setTeacher(Teacher teacher) {
  29. this.teacher = teacher;
  30. }
  31.  
  32. public String getName() {
  33. return name;
  34. }
  35.  
  36. public void setName(String name) {
  37. this.name = name;
  38. }
  39.  
  40. @Override
  41. public String toString() {
  42. return "Classes{" +
  43. "id=" + id +
  44. ", name='" + name + '\'' +
  45. ", teacher=" + teacher +
  46. '}';
  47. }
  48. }

Classes类

  定义sql映射文件,需要在mybatisConfig.xml中注册该表映射文件。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3.  
  4. <mapper namespace="com.mybatis.classesMapper">
  5.  
  6. <!-- 根据班级id查询班级信息(包括老师信息) -->
  7. <select id="getClasses" parameterType="int" resultMap="ClassesMap">
  8. SELECT * FROM class c, teacher t WHERE c.teacher_id = t.t_id and c.c_id = #{id}
  9. </select>
  10. <!-- 联表查询 -->
  11. <resultMap id="ClassesMap" type="com.mybatis.Classes">
  12. <id property="id" column="c_id"/>
  13. <result property="name" column="c_name"/>
  14. <association property="teacher" column="teacher_id" javaType="com.mybatis.Teacher">
  15. <id property="id" column="t_id"/>
  16. <result property="name" column="t_name"/>
  17. </association>
  18. </resultMap>
  19.  
  20. <!-- 嵌套查询 -->
  21. <select id="getClasses2" parameterType="int" resultMap="ClassesMap2">
  22. SELECT * FROM class WHERE c_id=#{id}
  23. </select>
  24. <select id="getTeacher" parameterType="int" resultType="com.mybatis.Teacher">
  25. SELECT t_id id, t_name FROM teacher WHERE t_id=#{id}
  26. </select>
  27. <resultMap id="ClassesMap2" type="com.mybatis.Classes">
  28. <id property="id" column="c_id"/>
  29. <result property="name" column="c_name"/>
  30. <association property="teacher" column="teacher_id" select="getTeacher">
  31. </association>
  32. </resultMap>
  33.  
  34. </mapper>

classesMapper.xml文件

测试类:

  1. public class MyBaitsMain {
  2. SqlSessionFactory sessionFactory = null;
  3. SqlSession sqlSession = null;
  4.  
  5. {
  6. String resource = "mybatisConfig.xml";
  7. // 加载mybatis的配置文件(它也加载关联的映射文件)
  8. Reader reader = null;
  9. try {
  10. reader = Resources.getResourceAsReader(resource);
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. // 构建sqlSession的工厂
  15. sessionFactory = new SqlSessionFactoryBuilder().build(reader);
  16. // 创建能执行映射文件中sql的sqlSession,默认是手动提交事务的,使用自动提交的话加上参数 true
  17. sqlSession = sessionFactory.openSession(true);
  18. }
  19.  
  20. public static void main(String[] args) {
  21.  
  22. String statement = "com.mybatis.classesMapper.getClasses";
  23. String statement2 = "com.mybatis.classesMapper.getClasses2";
  24.  
  25. Classes classes = new MyBaitsMain().sqlSession.selectOne(statement, 1);
  26. System.out.println(classes);
  27. classes = new MyBaitsMain().sqlSession.selectOne(statement2, 1);
  28. System.out.println(classes);
  29. }
  30. }

MyBatisMain测试类

输出结果:

5.2 一对多关联

  这里实现班级id查询班级信息,班级信息中包括老师信息和学生信息。首先创建表结构:

  1. CREATE TABLE student(
  2. s_id INT PRIMARY KEY AUTO_INCREMENT,
  3. s_name VARCHAR(20),
  4. class_id INT
  5. );
  6. INSERT INTO student(s_name, class_id) VALUES('xs_A', 1);
  7. INSERT INTO student(s_name, class_id) VALUES('xs_B', 1);
  8. INSERT INTO student(s_name, class_id) VALUES('xs_C', 1);
  9. INSERT INTO student(s_name, class_id) VALUES('xs_D', 2);
  10. INSERT INTO student(s_name, class_id) VALUES('xs_E', 2);
  11. INSERT INTO student(s_name, class_id) VALUES('xs_F', 2);

  定义表对应的实体类:

  1. public class Student {
  2.  
  3. private int id;
  4. private String name;
  5.  
  6. public Student(int id, String name) {
  7. this.id = id;
  8. this.name = name;
  9. }
  10.  
  11. public Student() {
  12. }
  13.  
  14. public int getId() {
  15.  
  16. return id;
  17. }
  18.  
  19. public void setId(int id) {
  20. this.id = id;
  21. }
  22.  
  23. public String getName() {
  24. return name;
  25. }
  26.  
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30.  
  31. @Override
  32. public String toString() {
  33. return "Student{" +
  34. "id=" + id +
  35. ", name='" + name + '\'' +
  36. '}';
  37. }
  38. }

Student类

  定义sql映射文件,需要在mybatisConfig.xml中注册该表映射文件。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3.  
  4. <mapper namespace="com.mybatis.classesMapper2">
  5.  
  6. <select id="getClasses" parameterType="int" resultMap="ClassesMap">
  7. SELECT * FROM class c, student s, teacher t WHERE c.c_id=s.class_id AND c.c_id=#{id}
  8. </select>
  9. <resultMap id="ClassesMap" type="com.mybatis.Classes">
  10. <id property="id" column="c_id"/>
  11. <result property="name" column="c_name"/>
  12. <association property="teacher" javaType="com.mybatis.Teacher">
  13. <id property="id" column="t_id"/>
  14. <result property="name" column="t_name"/>
  15. </association>
  16. <!--
  17. collection: 做一对多关联查询的
  18. ofType: 指定集合中元素对象的类型
  19. -->
  20. <collection property="students" ofType="com.mybatis.Student">
  21. <id property="id" column="s_id"/>
  22. <result property="name" column="s_name"/>
  23. </collection>
  24. </resultMap>
  25.  
  26. <!-- 第二种方式 -->
  27. <select id="getClasses2" resultMap="ClassesMap2">
  28. SELECT * FROM class WHERE c_id=#{id}
  29. </select>
  30. <select id="getTeacher" resultType="com.mybatis.Teacher">
  31. SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
  32. </select>
  33. <select id="getStudent" resultType="com.mybatis.Student">
  34. SELECT s_id id, s_name name FROM student WHERE class_id=#{id}
  35. </select>
  36. <resultMap id="ClassesMap2" type="com.mybatis.Classes">
  37. <id property="id" column="c_id"/>
  38. <result property="name" column="c_name"/>
  39. <association property="teacher" column="teacher_id" select="getTeacher">
  40. </association>
  41. <collection property="students" column="c_id" select="getStudent">
  42. </collection>
  43. </resultMap>
  44.  
  45. </mapper>

classesMapper2.xml文件

  测试类:

  1. public class MyBaitsMain {
  2. SqlSessionFactory sessionFactory = null;
  3. SqlSession sqlSession = null;
  4.  
  5. {
  6. String resource = "mybatisConfig.xml";
  7. // 加载mybatis的配置文件(它也加载关联的映射文件)
  8. Reader reader = null;
  9. try {
  10. reader = Resources.getResourceAsReader(resource);
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. // 构建sqlSession的工厂
  15. sessionFactory = new SqlSessionFactoryBuilder().build(reader);
  16. // 创建能执行映射文件中sql的sqlSession,默认是手动提交事务的,使用自动提交的话加上参数 true
  17. sqlSession = sessionFactory.openSession(true);
  18. }
  19.  
  20. public static void main(String[] args) {
  21.  
  22. String statement = "com.mybatis.classesMapper2.getClasses";
  23. String statement2 = "com.mybatis.classesMapper2.getClasses2";
  24.  
  25. Classes classes = new MyBaitsMain().sqlSession.selectOne(statement, 1);
  26. System.out.println(classes);
  27. classes = new MyBaitsMain().sqlSession.selectOne(statement2, 1);
  28. System.out.println(classes);
  29. }
  30. }

MyBaitsMain测试类

输出结果:

6 MyBatis的缓存

正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持

  • 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
  • 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
  • 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。

7 Spring集成MyBatis

  Spring集成MyBatis,开发环境为IDEA,打开IDEA,新建工程,工程名为spring-mybatis。注意,这里我选择的是带有Web功能的工程,其实在Spring集成MyBatis示例中并没有用到Web功能,这个可选可不选。

1、添加工程所需的jar包,比如MySQL驱动包、Spring包、commons-logging包等,最后添加的包结构图如下:

  最后整个工程文件如下所示:

2、然后需要在test数据库中新建测试表user,sql语句如下所示:

  1. create table users (
  2. id int primary key auto_increment,
  3. name varchar(20),
  4. age int
  5. );
  6. insert into users (name, age) values('Tom', 12);
  7. insert into users (name, age) values('Jack', 11);

3、定义表对应的实体类和表操作接口。

  1. package com.luoxn28.test;
  2.  
  3. public class User {
  4.  
  5. private int id;
  6. private String name;
  7. private int age;
  8.  
  9. public User() {
  10. }
  11.  
  12. public User(int id, String name, int age) {
  13. this.id = id;
  14. this.name = name;
  15. this.age = age;
  16. }
  17.  
  18. public User(String name, int age) {
  19. this.name = name;
  20. this.age = age;
  21. }
  22.  
  23. public int getId() {
  24. return id;
  25. }
  26.  
  27. public void setId(int id) {
  28. this.id = id;
  29. }
  30.  
  31. public String getName() {
  32. return name;
  33. }
  34.  
  35. public void setName(String name) {
  36. this.name = name;
  37. }
  38.  
  39. public int getAge() {
  40. return age;
  41. }
  42.  
  43. public void setAge(int age) {
  44. this.age = age;
  45. }
  46.  
  47. @Override
  48. public String toString() {
  49. return "User{" +
  50. "id=" + id +
  51. ", name='" + name + '\'' +
  52. ", age=" + age +
  53. '}';
  54. }
  55. }
  1. package com.luoxn28.test;
  2.  
  3. import java.util.List;
  4.  
  5. public interface UserDao {
  6.  
  7. public int insert(User user);
  8.  
  9. public int update(User user);
  10.  
  11. public int delete(int id);
  12.  
  13. public User getById(int id);
  14.  
  15. public List<User> getAll();
  16. }

4、定义表映射配置文件userDao.xml和MyBatis配置文件mybatisConfig.xml。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3.  
  4. <mapper namespace="com.luoxn28.test.UserDao">
  5.  
  6. <insert id="insert" parameterType="com.luoxn28.test.User">
  7. INSERT users (name, age) VALUES (#{name}, #{age})
  8. </insert>
  9.  
  10. <update id="update" parameterType="com.luoxn28.test.User">
  11. UPDATE users set name=#{name}, age=#{age} where id=#{id}
  12. </update>
  13.  
  14. <delete id="delete" parameterType="int">
  15. DELETE FROM users where id=#{id}
  16. </delete>
  17.  
  18. <select id="getById" parameterType="int" resultType="com.luoxn28.test.User">
  19. SELECT * FROM users WHERE id=#{id}
  20. </select>
  21.  
  22. <select id="getAll" resultType="com.luoxn28.test.User">
  23. SELECT * FROM users
  24. </select>
  25.  
  26. </mapper>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3.  
  4. <configuration>
  5. <mappers>
  6. <mapper resource="com/luoxn28/test/userMapper.xml"/>
  7. </mappers>
  8. </configuration>

5、配置Spring的applicationContext.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
  6.  
  7. <!-- 0.导入外部配置文件 -->
  8. <context:property-placeholder location="classpath:db.properties"/>
  9.  
  10. <!-- 1.配置数据源 DriverManagerDataSource -->
  11. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  12. <property name="username" value="${user}"/>
  13. <property name="password" value="${password}"/>
  14. <property name="driverClassName" value="${driverClass}"/>
  15. <property name="url" value="${jdbcUrl}"/>
  16. </bean>
  17.  
  18. <!-- 2.mybatis的SqlSession工厂 SqlSessionFactoryBean -->
  19. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  20. <property name="dataSource" ref="dataSource"/>
  21. <property name="typeAliasesPackage" value="com.luoxn28.test"/> <!-- 实体类包名,自动将实体类的简单类名映射成为别名 -->
  22. <property name="configLocation" value="classpath:mybatisConfig.xml"/>
  23. </bean>
  24.  
  25. <!-- 3.mybatis自动扫描加载sql映射文件 MapperScannerConfigurer
  26. <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  27. <property name="basePackage" value="com.luoxn28.test"/>
  28. <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
  29. </bean> -->
  30.  
  31. <!-- 4.事务管理
  32. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  33. <property name="dataSource" ref="dataSource"/>
  34. </bean> -->
  35.  
  36. <!-- 5.声明式事务 transaction-manager引用定义的事务管理器
  37. <tx:annotation-driven transaction-manager="transactionManager"/> -->
  38.  
  39. <bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
  40. <property name="mapperInterface" value="com.luoxn28.test.UserDao"/>
  41. <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
  42. </bean>
  43.  
  44. </beans>

6、编写测试类SMTest

  1. package com.luoxn28.test;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. import org.testng.annotations.BeforeTest;
  6. import org.testng.annotations.Test;
  7.  
  8. public class SMTest {
  9.  
  10. private ApplicationContext context = null;
  11. private UserDao userDao = null;
  12.  
  13. @BeforeTest
  14. public void init() {
  15. context = new ClassPathXmlApplicationContext("applicationContext.xml");
  16. userDao = (UserDao) context.getBean("userDao");
  17. }
  18.  
  19. @Test
  20. public void testInsert() {
  21. System.out.println(userDao.insert(new User("luoxn28", 23)));
  22. }
  23.  
  24. @Test
  25. public void testUpdate() {
  26. System.out.println(userDao.update(new User(10, "luoxn28", 22)));
  27. }
  28.  
  29. @Test
  30. public void testDelete() {
  31. System.out.println(userDao.delete(10));
  32. }
  33.  
  34. @Test
  35. public void testGetById() {
  36. System.out.println(userDao.getById(10));
  37. }
  38.  
  39. @Test
  40. public void getGetAll() {
  41. System.out.println(userDao.getAll());
  42. }
  43. }

输出结果(这是测试的是getGetAll方法):

参考资料:

  1、尚硅谷-MyBatis学习视频

  2、Spring学习之AOP总结帖

MyBatis使用总结+整合Spring的更多相关文章

  1. java框架之MyBatis(2)-进阶&整合Spring&逆向工程

    进阶内容 准备 jdbc.url=jdbc:mysql://192.168.208.192:3306/test?characterEncoding=utf-8 jdbc.driver=com.mysq ...

  2. mybatis笔记<二> 整合spring

    mybatis与spring整合需要添加几个jar包,mybatis-spring, spring-context, spring-jdbc 1. spring ioc只要一个jar包就ok 2. 我 ...

  3. spring + Mybatis + pageHelper + druid 整合源码分享

    springMvc + spring + Mybatis + pageHelper + druid 整合 spring 和druid整合,spring 整合druid spring 和Mybatis  ...

  4. spring+mybatis+oracle/mysql整合开发需要的jar包详解

    导入spring,mybatis,c3p0,oracle和mybatis提供的与spring整合的插件包   mysql的jar:         mysql-connector-java-5.1.7 ...

  5. Mybatis整合Spring

    根据官方的说法,在ibatis3,也就是Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对Mybatis3的支持.因此由Mybatis社区自己开发了一个My ...

  6. mybatis入门_一对多,多对多映射以及整合spring框架

    一.一对多映射. 1.1 一对多映射之根据多的一方关联查询一的一方 示例:查询出具体的订单信息,同时也查询出来订单的用户信息. 引入的订单表如下所示: 框选出来的为具体的外键. 订单的Pojo类如下所 ...

  7. spring与mybatis三种整合方法

    spring与mybatis三种整合方法 本文主要介绍Spring与Mybatis三种常用整合方法,需要的整合架包是mybatis-spring.jar,可通过链接 http://code.googl ...

  8. 整合spring,springmvc和mybatis

    我创建的是maven项目,使用到的依赖架包有下面这些: <dependencies> <dependency> <groupId>org.springframewo ...

  9. mybatis整合spring 之 基于接口映射的多对一关系

    转载自:http://my.oschina.net/huangcongmin12/blog/83731 mybatis整合spring 之  基于接口映射的多对一关系. 项目用到俩个表,即studen ...

随机推荐

  1. jQuery Wheel Menu:实现漂亮的 Path 风格旋转菜单

    相信很多用过 Path 的都对它的独特的旋转导航菜单有深刻的印象,这个功能也被很多的 Web 开发者模仿.今天分享的这款插件可以方便的在你的网站中加入和 Path 一样的旋转菜单,可以自定义效果. 您 ...

  2. array's filter

    var arr = [ { id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }, { }, { id: null }, { id: NaN ...

  3. HTML <select> 标签 创建单选或多选菜单

    所有主流浏览器都支持 <select> 标签. select 元素可创建单选或多选菜单. <select&> 元素中的 <option> 标签用于定义列表中 ...

  4. SharePoint 2013 Error - File names can't contain the following characters: & " ? < > # {} % ~ / \.

    错误截图: 错误信息: --------------------------- Message from webpage --------------------------- File names ...

  5. Autodesk 产品开发培训开始报名-8月26~28-武汉– Revit, Vault, Autodesk Viewer, Navisworks

    为了帮助Autodesk中国地区的二次开发人员有机会系统地了解与学习Autodesk 在BIM解决方案中的旗舰产品 Revit以及Navisworks等产品的最新开发技术,并有机会与Autodesk ...

  6. The specified file or folder name is too long

    You receive a "The specified file or folder name is too long" error message when you creat ...

  7. WCF服务配置编辑器使用

    学习wcf,特别是初学者,配置文件很难搞懂,有点复杂,自己手动配置哪有这么多精力啊,这不是吃的太饱了吗,所以学会使用配置编辑器是必须的,下面是学习的流程图. 打开工具的wcf服务配置编辑器,点击文件= ...

  8. UINavigationController和UIScrollView一起使用时导致UIScrollView位置偏移

    iOS7之后,当UIViewController成为UINavigationController的控制视图,UIViewController的控制视图上的第一个子视图是UIScrollView,UIS ...

  9. iOS自动布局进阶用法

    本文主要介绍几个我遇到并总结的相对高级的用法(当然啦牛人会觉得这也不算什么). 简单的storyboard中上下左右约束,固定宽高啥的用法在这里就不做赘述了. autolayout自动布局是iOS6以 ...

  10. Android消息机制入门

    接着处理<Android 网络图片查看器>中出现的问题 使用添加子线程,修改原程序: package com.wuyudong.imagesviewer; import java.io.I ...