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语句如下所示:

create table users (id int primary key auto_increment,name varchar(20),age int
);
insert into users (name, age) values('Tom', 12);
insert into users (name, age) values('Jack', 11);

1.1 定义表对应的实体类

public class User {private int id;private String name;private int age;public User() { }public User(int id, String name, int age) {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;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

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

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

<?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>
<environments default="development"><!-- development:开发环境 work:工作模式 --><environment id="development"><transactionManager type="JDBC" /><!-- 数据库连接方式 --><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://192.168.1.150/test" /><property name="username" value="root" /><property name="password" value="123456" /></dataSource></environment>
</environments><!-- 注册表映射文件 -->
<mappers><mapper resource="com/mybatis/userMapper.xml"/>
</mappers></configuration>

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

<?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.mybatis.userMapper"><!-- 根据id查询一个User对象 --><select id="getUser" parameterType="int" resultType="com.mybatis.User">select * from users where id=#{id}</select><select id="getUserAll" resultType="com.mybatis.User">select * from users</select><!-- 插入一个User对象 --><insert id="insertUser" parameterType="com.mybatis.User">insert into users (name, age) value(#{name}, #{age})</insert><!-- 删除一个User对象 --><delete id="deleteUser" parameterType="int">delete from users where id=#{id}</delete><!-- 更新一个User对象--><update id="updateUser" parameterType="com.mybatis.User">update users set name=#{name}, age=#{age} where id=#{id}</update>
</mapper>

测试代码如下:

public class mybaitstest {SqlSessionFactory sessionFactory = null;SqlSession sqlSession = null;{String resource = "mybatisConfig.xml";// 加载mybatis的配置文件(它也加载关联的映射文件)Reader reader = null;try {reader = Resources.getResourceAsReader(resource);} catch (IOException e) {e.printStackTrace();}// 构建sqlSession的工厂sessionFactory = new SqlSessionFactoryBuilder().build(reader);// 创建能执行映射文件中sql的sqlSession,默认是手动提交事务的,使用自动提交的话加上参数 truesqlSession = sessionFactory.openSession(true);}public void testSelectUser() {// 映射sql的标识字符串String statement = "com.mybatis.userMapper" + ".getUser";// 执行查询返回一个唯一user对象的sqlUser user = sqlSession.selectOne(statement, 1);System.out.println(user);}public void testSelectAll() {List<User> users = sqlSession.selectList("com.mybatis.userMapper.getUserAll");System.out.println(users);}public void testInsertUser(User user) {int insert = sqlSession.insert("com.mybatis.userMapper.insertUser", user);// 如果不是自动提交的话,需要使用 sqlSession。commit()
        System.out.println(insert);}public void testDeleteUser(int id) {int delete = sqlSession.delete("com.mybatis.userMapper.deleteUser", id);System.out.println(delete);}public void testUpdateUser(User user) {int update = sqlSession.update("com.mybatis.userMapper.updateUser", user);System.out.println(update);}public static void main(String[] args) throws IOException {new mybaitstest().testSelectUser();}
}

最后输出结果为:

2 基于注解的方式使用MyBatis

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

public interface IUserMapper {@Insert("insert into users (name, age) value(#{name}, #{age})")public int add(User user);@Delete("delete from users where id=#{id}")public int deleteById(int id);@Update("update users set name=#{name}, age=#{age} where id=#{id}")public int update(User user);@Select("select * from users where id=#{id}")public User getById(int id);@Select("select * from users")public List<User> getAll();
}

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

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

测试示例:

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

3 如何简化配置操作

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

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

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

<properties resource="db.properties"/><environments default="development"><!-- development:开发环境 work:工作模式 --><environment id="development"><transactionManager type="JDBC" /><!-- 数据库连接方式 --><dataSource type="POOLED"><property name="driver" value="${driverClass}" /><property name="url" value="${jdbcUrl}" /><property name="username" value="${user}" /><property name="password" value="${password}" /></dataSource></environment>
</environments>

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

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

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

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

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('aaa', 12);
insert into orders (order_no, order_price) values('bbb', 13);
insert into orders (order_no, order_price) values('ccc', 14);

  创建对应表的类:

public class Order {private int i;private String no;private float price;public Order() { }public Order(int i, String no, float price) {this.i = i;this.no = no;this.price = price;}public int getI() {return i;}public void setI(int i) {this.i = i;}public String getNo() {return no;}public void setNo(String no) {this.no = no;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}
}

View Code

  mybaitsConfig.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"/><typeAliases><typeAlias type="com.mybatis.Order" alias="Order"/></typeAliases><environments default="development"><!-- development:开发环境 work:工作模式 --><environment id="development"><transactionManager type="JDBC" /><!-- 数据库连接方式 --><dataSource type="POOLED"><property name="driver" value="${driverClass}" /><property name="url" value="${jdbcUrl}" /><property name="username" value="${user}" /><property name="password" value="${password}" /></dataSource></environment></environments><!-- 注册表映射文件 --><mappers><mapper resource="com/mybatis/orderMapper.xml"/></mappers></configuration>

  接下来配置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.mybatis.orderMapper"><!-- 根据id查询一个Order对象 --><select id="getOrder" parameterType="int" resultType="Order">SELECT order_id id, order_no no, order_price price FROM orders WHERE order_id=#{id}</select><!-- 这种解决字段与属性冲突方式较常用 --><select id="getOrder2" parameterType="int" resultType="Order" resultMap="getOrder2Map">SELECT * FROM orders WHERE order_id=#{id}</select><!--resultMap 封装映射关系id    专门针对主键result 针对一般字段--><resultMap id="getOrder2Map" type="Order"><id property="id" column="order_id"/><result property="no" column="order_price"/><result property="price" column="order_price"/></resultMap></mapper>

View Code

测试用例:

public class MyBaitsMain {SqlSessionFactory sessionFactory = null;SqlSession sqlSession = null;{String resource = "mybatisConfig.xml";// 加载mybatis的配置文件(它也加载关联的映射文件)Reader reader = null;try {reader = Resources.getResourceAsReader(resource);} catch (IOException e) {e.printStackTrace();}// 构建sqlSession的工厂sessionFactory = new SqlSessionFactoryBuilder().build(reader);// 创建能执行映射文件中sql的sqlSession,默认是手动提交事务的,使用自动提交的话加上参数 truesqlSession = sessionFactory.openSession(true);}public static void main(String[] args) {String statement = "com.mybatis.orderMapper.getOrder";String statement2 = "com.mybatis.orderMapper.getOrder2";Order order = new MyBaitsMain().sqlSession.selectOne(statement, 2);System.out.println(order);order = new MyBaitsMain().sqlSession.selectOne(statement2, 2);System.out.println(order);}
}

输出结果为:

5 实现关联表查询

5.1 一对一关联

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

CREATE TABLE teacher(t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20)
);
CREATE TABLE class(c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VARCHAR(20), teacher_id INT
);
ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);    INSERT INTO teacher(t_name) VALUES('LS1');
INSERT INTO teacher(t_name) VALUES('LS2');INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1);
INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2);

View Code

  定义表对应的实体类:

public class Teacher {private int id;private String name;public Teacher() {}public Teacher(int id, String name) {this.id = id;this.name = name;}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;}@Overridepublic String toString() {return "Teacher{" +"id=" + id +", name='" + name + '\'' +'}';}
}

Teacher类

public class Classes {private int id;private String name;private Teacher teacher;public Classes() {}public Classes(int id, String name, Teacher teacher) {this.id = id;this.name = name;this.teacher = teacher;}public int getId() {return id;}public void setId(int id) {this.id = id;}public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Classes{" +"id=" + id +", name='" + name + '\'' +", teacher=" + teacher +'}';}
}

Classes类

  定义sql映射文件,需要在mybatisConfig.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.mybatis.classesMapper"><!-- 根据班级id查询班级信息(包括老师信息) --><select id="getClasses" parameterType="int" resultMap="ClassesMap">SELECT * FROM class c, teacher t WHERE c.teacher_id = t.t_id and c.c_id = #{id}</select><!-- 联表查询 --><resultMap id="ClassesMap" type="com.mybatis.Classes"><id property="id" column="c_id"/><result property="name" column="c_name"/><association property="teacher" column="teacher_id" javaType="com.mybatis.Teacher"><id property="id" column="t_id"/><result property="name" column="t_name"/></association></resultMap><!-- 嵌套查询 --><select id="getClasses2" parameterType="int" resultMap="ClassesMap2">SELECT * FROM class WHERE c_id=#{id}</select><select id="getTeacher" parameterType="int" resultType="com.mybatis.Teacher">SELECT t_id id, t_name  FROM teacher WHERE t_id=#{id}</select><resultMap id="ClassesMap2" type="com.mybatis.Classes"><id property="id" column="c_id"/><result property="name" column="c_name"/><association property="teacher" column="teacher_id" select="getTeacher"></association></resultMap></mapper>

classesMapper.xml文件

测试类:

public class MyBaitsMain {SqlSessionFactory sessionFactory = null;SqlSession sqlSession = null;{String resource = "mybatisConfig.xml";// 加载mybatis的配置文件(它也加载关联的映射文件)Reader reader = null;try {reader = Resources.getResourceAsReader(resource);} catch (IOException e) {e.printStackTrace();}// 构建sqlSession的工厂sessionFactory = new SqlSessionFactoryBuilder().build(reader);// 创建能执行映射文件中sql的sqlSession,默认是手动提交事务的,使用自动提交的话加上参数 truesqlSession = sessionFactory.openSession(true);}public static void main(String[] args) {String statement = "com.mybatis.classesMapper.getClasses";String statement2 = "com.mybatis.classesMapper.getClasses2";Classes classes = new MyBaitsMain().sqlSession.selectOne(statement, 1);System.out.println(classes);classes = new MyBaitsMain().sqlSession.selectOne(statement2, 1);System.out.println(classes);}
}

MyBatisMain测试类

输出结果:

5.2 一对多关联

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

CREATE TABLE student(s_id INT PRIMARY KEY AUTO_INCREMENT, s_name VARCHAR(20), class_id INT
);
INSERT INTO student(s_name, class_id) VALUES('xs_A', 1);
INSERT INTO student(s_name, class_id) VALUES('xs_B', 1);
INSERT INTO student(s_name, class_id) VALUES('xs_C', 1);
INSERT INTO student(s_name, class_id) VALUES('xs_D', 2);
INSERT INTO student(s_name, class_id) VALUES('xs_E', 2);
INSERT INTO student(s_name, class_id) VALUES('xs_F', 2);

  定义表对应的实体类:

public class Student {private int id;private String name;public Student(int id, String name) {this.id = id;this.name = name;}public Student() {}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;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +'}';}
}

Student类

  定义sql映射文件,需要在mybatisConfig.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.mybatis.classesMapper2"><select id="getClasses" parameterType="int" resultMap="ClassesMap">SELECT * FROM class c, student s, teacher t WHERE c.c_id=s.class_id AND c.c_id=#{id}</select><resultMap id="ClassesMap" type="com.mybatis.Classes"><id property="id" column="c_id"/><result property="name" column="c_name"/><association property="teacher" javaType="com.mybatis.Teacher"><id property="id" column="t_id"/><result property="name" column="t_name"/></association><!--collection: 做一对多关联查询的ofType: 指定集合中元素对象的类型--><collection property="students" ofType="com.mybatis.Student"><id property="id" column="s_id"/><result property="name" column="s_name"/></collection></resultMap><!-- 第二种方式 --><select id="getClasses2" resultMap="ClassesMap2">SELECT * FROM class WHERE c_id=#{id}</select><select id="getTeacher" resultType="com.mybatis.Teacher">SELECT t_id id, t_name name FROM teacher WHERE  t_id=#{id}</select><select id="getStudent" resultType="com.mybatis.Student">SELECT s_id id, s_name name FROM student WHERE  class_id=#{id}</select><resultMap id="ClassesMap2" type="com.mybatis.Classes"><id property="id" column="c_id"/><result property="name" column="c_name"/><association property="teacher" column="teacher_id" select="getTeacher"></association><collection property="students" column="c_id" select="getStudent"></collection></resultMap></mapper>

classesMapper2.xml文件

  测试类:

public class MyBaitsMain {SqlSessionFactory sessionFactory = null;SqlSession sqlSession = null;{String resource = "mybatisConfig.xml";// 加载mybatis的配置文件(它也加载关联的映射文件)Reader reader = null;try {reader = Resources.getResourceAsReader(resource);} catch (IOException e) {e.printStackTrace();}// 构建sqlSession的工厂sessionFactory = new SqlSessionFactoryBuilder().build(reader);// 创建能执行映射文件中sql的sqlSession,默认是手动提交事务的,使用自动提交的话加上参数 truesqlSession = sessionFactory.openSession(true);}public static void main(String[] args) {String statement = "com.mybatis.classesMapper2.getClasses";String statement2 = "com.mybatis.classesMapper2.getClasses2";Classes classes = new MyBaitsMain().sqlSession.selectOne(statement, 1);System.out.println(classes);classes = new MyBaitsMain().sqlSession.selectOne(statement2, 1);System.out.println(classes);}
}

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语句如下所示:

create table users (id int primary key auto_increment,name varchar(20),age int
);
insert into users (name, age) values('Tom', 12);
insert into users (name, age) values('Jack', 11);

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

package com.luoxn28.test;public class User {private int id;private String name;private int age;public User() {}public User(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}public User(String name, int age) {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;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

package com.luoxn28.test;import java.util.List;public interface UserDao {public int insert(User user);public int update(User user);public int delete(int id);public User getById(int id);public List<User> getAll();
}

4、定义表映射配置文件userDao.xml和MyBatis配置文件mybatisConfig.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.luoxn28.test.UserDao"><insert id="insert" parameterType="com.luoxn28.test.User">INSERT users (name, age) VALUES (#{name}, #{age})</insert><update id="update" parameterType="com.luoxn28.test.User">UPDATE users set name=#{name}, age=#{age} where id=#{id}</update><delete id="delete" parameterType="int">DELETE FROM users where id=#{id}</delete><select id="getById" parameterType="int" resultType="com.luoxn28.test.User">SELECT * FROM users WHERE id=#{id}</select><select id="getAll" resultType="com.luoxn28.test.User">SELECT * FROM users</select></mapper>

<?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><mappers><mapper resource="com/luoxn28/test/userMapper.xml"/></mappers>
</configuration>

5、配置Spring的applicationContext.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"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"><!-- 0.导入外部配置文件 --><context:property-placeholder location="classpath:db.properties"/><!-- 1.配置数据源 DriverManagerDataSource --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="username" value="${user}"/><property name="password" value="${password}"/><property name="driverClassName" value="${driverClass}"/><property name="url" value="${jdbcUrl}"/></bean><!-- 2.mybatis的SqlSession工厂  SqlSessionFactoryBean --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="typeAliasesPackage" value="com.luoxn28.test"/> <!-- 实体类包名,自动将实体类的简单类名映射成为别名 --><property name="configLocation" value="classpath:mybatisConfig.xml"/></bean><!-- 3.mybatis自动扫描加载sql映射文件 MapperScannerConfigurer<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.luoxn28.test"/><property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean> --><!-- 4.事务管理<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean> --><!-- 5.声明式事务 transaction-manager引用定义的事务管理器<tx:annotation-driven transaction-manager="transactionManager"/> --><bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="com.luoxn28.test.UserDao"/><property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean></beans>

6、编写测试类SMTest

package com.luoxn28.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;public class SMTest {private ApplicationContext context = null;private UserDao userDao = null;@BeforeTestpublic void init() {context = new ClassPathXmlApplicationContext("applicationContext.xml");userDao = (UserDao) context.getBean("userDao");}@Testpublic void testInsert() {System.out.println(userDao.insert(new User("luoxn28", 23)));}@Testpublic void testUpdate() {System.out.println(userDao.update(new User(10, "luoxn28", 22)));}@Testpublic void testDelete() {System.out.println(userDao.delete(10));}@Testpublic void testGetById() {System.out.println(userDao.getById(10));}@Testpublic void getGetAll() {System.out.println(userDao.getAll());}
}

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

参考资料:

  1、尚硅谷-MyBatis学习视频

  2、Spring学习之AOP总结帖

转载于:https://www.cnblogs.com/luoxn28/p/5572663.html

MyBatis使用总结+整合Spring相关推荐

  1. 【Mybatis+spring整合源码探秘】--- mybatis整合spring事务原理

    文章目录 1 mybatis整合spring事务原理 1 mybatis整合spring事务原理 本篇文章不再对源码进行具体的解读了,仅仅做了下面一张图: 该图整理了spring+mybatis整合后 ...

  2. springboot templates读取不到_整合spring mvc + mybatis,其实很简单,spring boot实践(5)

    01 spring boot读取配置信息 02 多环境配置 03 处理全局异常 04 spring boot admin 主要通过spring boot整合spring mvc 以及mybatis实现 ...

  3. 史上最详细的SSM框架整合(Spring、SpringMVC、Mybatis)

    毫无疑问我们肯定是使用Spring去整合SpringMVC和Mybatis,在整合过程中我们首先要让各自的模块实现,然后再去使用Spring整合:比如我先实现Mybatis框架的配置,然后再通过测试看 ...

  4. MyBatis整合Spring的实现(2)

    2019独角兽企业重金招聘Python工程师标准>>> 分析 MyBatis整合Spring的实现(1)中代码实现的4.1可以知道,XMLConfigBuilder类读取MyBati ...

  5. MyBatis整合Spring原理分析

    目录 MyBatis整合Spring原理分析 MapperScan的秘密 简单总结 假如不结合Spring框架,我们使用MyBatis时的一个典型使用方式如下: public class UserDa ...

  6. (转)MyBatis框架的学习(六)——MyBatis整合Spring

    http://blog.csdn.net/yerenyuan_pku/article/details/71904315 本文将手把手教你如何使用MyBatis整合Spring,这儿,我本人使用的MyB ...

  7. Spring+SpringMVC+MyBatis+Maven框架整合

    本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点  一.Maven需要引入的jar包  二.Spring与SpringMVC的配置分离  三.Sp ...

  8. SSM框架实现用户查询、注册、登录——IDEA整合Spring、Spring MVC、Mybatis 框架

    目录 零.前言 一.说明 1.整合说明 2.最终目标 3.数据库准备 二.搭建整合环境 1.创建 maven 工程 2.导入依赖坐标 3.创建java和resources文件夹 4.创建类和接口文件 ...

  9. 【编程不良人】快速入门Spring学习笔记08---事务属性、Spring整合Structs2框架(SM)、Spring整合Mybatis+Struts2(SSM)、Spring注解、SSM注解式开发

    1. 事务属性 1.1 事务传播属性 配套视频:[编程不良人]快速入门Spring,SpringBoot.SpringCloud学不好完全是因为Spring没有掌握!_哔哩哔哩_bilibili # ...

  10. 源码通透-mybatis源码分析以及整合spring过程

    源码通透-mybatis源码分析以及整合spring过程 mybatis源码分析版本:mybaits3 (3.5.0-SNAPSHOT) mybatis源码下载地址:https://github.co ...

最新文章

  1. .NET 4.0有一个新的GAC,为什么?
  2. DataFrame表样式设置(一)
  3. MySQL的mysql_insert_id和LAST_INSERT_ID
  4. java httppost wsdl_Java使用HttpUrlConnection调用webService(wsdl)
  5. 面试官是如何发掘有潜力的产品经理的?
  6. android动态波浪效果,android贝塞尔曲线实现波浪效果
  7. 项目方案-标书-文档等等编写规范
  8. Java:基于LinkedList实现栈和队列
  9. 使用XLog、Spring-Boot、And-Design-Pro搭建日志系统
  10. Git(6)-- 记录每次更新到仓库图文版(git clone、status、add、diff、commit、rm、mv命令详解)
  11. 如何在Win7 x64上的配置32位的PostgreSQL ODBC数据源
  12. 【图像融合】基于matlab PCA图像融合【含Matlab源码 723期】
  13. 【JS】WPS宏编辑器
  14. linux gz的如何解压缩,linux gz 解压缩
  15. mybatis-plus异常, org.apache.ibatis.builder.BuilderException: Error evaluating expression AND
  16. 全渠道客户体验是什么?如何创建全渠道营销平台?
  17. 什么是SEM竞价推广,竞价排名有何特征?
  18. 冰羚-README.md翻译
  19. 产品经理的六大工作职责
  20. 活动创意来源和感想思考

热门文章

  1. Go 并发 多线程 goroutine channel 实例
  2. 【Django 2021年最新版教程11】数据库删除操作
  3. 区块链 以太坊 入门知识
  4. 区块链应用 项目开发步骤
  5. HTTPSConnectionPool(host=‘api.github.com‘, port=443): Max retries exceeded with url
  6. 计算机网络第三版周舸答案,计算机网络技术基础第3版周舸第一章节计算机网络基础知识课件教学.ppt...
  7. python语法学习第十天--类与对象相关的BIF、魔法方法
  8. linux中config文件怎么打开,linux-如何使用CoreOS的cloud-config文件启动Dock...
  9. 谷歌手势插件--crxMouse Chrome™ 手势
  10. mysql覆盖索引和回表