先做个科普吧,MyBatis是其3.0以后的叫法,之前的版本都叫iBatis,这个名字肯定听过吧,也是大名鼎鼎的Apache旗下的产品,后来易主谷歌,正式改名为MyBatis,代码迁到github上。它是一种持久化框架,和Hibernate一样都是ORM(Object Relation Mapping,对象关系映射)框架,他们需要完成的任务都是将JavaBean映射成数据库中的一条记录。
不管是什么框架,Java和数据库交互,内部肯定少不了jdbc的支持(所有的框架都是对原生JDBC方式的封装),但是之前接触的都是jdbc的小工具,而不是框架。jdbc本身sql语句都是写在java代码中的,逻辑很混乱,耦合度也很高,所以不好,这里先回顾一下jdbc操作数据的流程:
Hibernate是我学习的第一个ORM框架,觉得挺好用,后来接触到了MyBatis,由于追星的原因,我从来原来的SSH转成了SSM架构开发,网上很多大牛都说Hibernate不如MyBtais好用,不够灵活,我也不懂为什么这么说,但是那么多比我厉害的人都说它好用,那就用呗,反正我是不知道哪里好,今天终于好像有点懂了_。首先看一下Hibernate,它是一个全自动的ORM框架,它的工作流程如下:
Hibernate把jdbc的工作都做完了,连编写SQL这活儿都包了,其实挺好的,我就只要面向对象去撸代码就好了,而且Hibernate框架是全映射的ORM(啥意思,就是如果JavaBean有多少属性,它查询时候就直接将对应表中的属性字段全部查询出来,这里我想问一下懒加载这一块有没有反驳的理由),但是这样就带来一个问题,它的SQL的控制权没有留给开发人员带来方便(针对小项目)的同时也带来了麻烦。因为在写大的工程时,不可能不涉及SQL的优化问题,我们需要去自己写SQL,但是Hibernate的本质目的就是为了消除SQL语句,让不懂SQL的人员也可以实现增删改查,那怎么办,当然在Hibernate中也提供了HQL语言,通过HQL我们可以定制SQL语句,但是这个过程还是比较麻烦的,所以说Hibernate不灵活。
基于上述Hibernate的全封装弊端,我们希望SQL由我们自己写,所以MyBatis出现了,它和Hibernate最大的不同就是将SQL的控制权交给了我们自己(单独放到配置文件中),因为作为一个框架要是要有点逼格的,不能啥都不做吧(所以说MyBatis是一个半自动化框架),它的工作流程如下:
1. Hello,MyBatis!
同理,首先给出MyBatis官网教程,这个是最好的老师,同时,在MyBatis的压缩包中有一个pdf文件也是文档教程。好了,开始搞第一个Demo吧,本文中所有Mybatis的栗子默认都是基于当前最新版本MyBatis-3.4.6。
- 导入mybatis-3.4.6.jar、mysql-connector-java-5.1.7-bin.jar和log4j-1.2.17.jar,创建一个JavaBean为Employee:
public class Employee {
private int id;
private String lastName;
private String gender;
private String email;
//getter and setter as well as toString
}
对应的MySQL的表结构如下
- 创建MyBatis的核心配置文件(全局配置文件):
mybatis-config.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>
<!--
MyBatis的配置文件中子标签必须按照一定的顺序去写
不按顺序有的配置将不生效或者直接报错;
正确的子标签顺序应该依次为:
properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,
reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?
-->
<!--配置MyBatis在控制台打印sql语句,需要配置log4j使用-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_mybatis"/>
<property name="username" value="root"/>
<property name="password" value="921228jack"/>
</dataSource>
</environment>
</environments>
<!--sql映射文件是在写完mapper文件后再加入这里面的-->
<mappers>
<mapper resource="conf/EmployeeMapper.xml"/>
</mappers>
</configuration>
因为配置了log4j日志,所以这里需要额外写一个log4j的配置文件log4j.xml
:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration debug="true">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n"/>
</layout>
</appender>
<logger name="java.sql">
<level value="debug"/>
</logger>
<logger name="org.apache.ibatis">
<level value="info"/>
</logger>
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>
- 配置sql映射文件
EmployeeMapper.xml
,里面封装了每一条SQL语句,并将其配置到全局配置文件中:
<?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">
<!--namespace:名称空间,写全类名-->
<mapper namespace="com.hhu.entity.Employee">
<!--id:唯一标识,就是方法名
resultType:返回值类型,即执行sql后的返回值想要怎么处理,封装成什么对象
#{
id}:从方法传入的参数“id”获取传入sql语句的参数
-->
<select id="selectEmp" resultType="com.hhu.entity.Employee">
<!--这里是查不到lastName属性的,MyBatis默认根据JavaBean中的属性名的方式去查找
数据库,如果属性和字段名对不上,那么就查不到;
解决方法:在mapper文件属性名和字段名不一样地方,用JavaBean中的属性名做该字段的别名,
不用通配符*,即可
-->
select id, last_name lastName, gender,email from tbl_employee where id = #{
id}
</select>
</mapper>
- 测试MyBatis的操作流程:
/**
* 1. 根据xml配置文件创建一个SqlSessionFactory,再由此创建sqlSession,通过它可以实现MyBatis对数据库的增删改查,每一次用完后一定要将其关闭;
* 2. sql映射文件(即mapper文件),配置每一条sql语句和其封装规则
* 3. 将sql映射文件配置到全局配置文件mybatis-config.xml
*/
@Test
public void testSqlSession() throws IOException {
//读取配配置文件(这是一MyBatis的核心配置文件,也是一个全局配置文件)
String resource = "conf/mybatis-config.xml";
//注意这里的Resources是apach包下面的类
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlSession,它可以执行已经映射的SQL语句(即mapper中的文件)
SqlSession sqlSession = sqlSessionFactory.openSession();
//注意这里使用try-finally,不管如何,最后一定要将sqlSession关闭
try{
//第一个参数是唯一标识,第二个参数是执行SQL传入的参数
Employee employee = sqlSession.selectOne("selectEmp", 2);
System.out.println(employee);
} finally {
//关闭Session
sqlSession.close();
}
}
2. 面向接口编程的MyBatis(推荐)
在前一小节,使用MyBatis的方式有些古老,正常情况我们都是通过在Dao层的接口直接去关联的mapper的sql映射文件,而不是通过想selectOne
类似指定唯一标识符的方式去执行sql,而且这个接口我们不需要有实现类,下面看下MyBatis更为常见的接口使用方式。
- 创建接口EmployeeDao:
public interface EmployeeDao {
public Employee getEmployeeById(int id);
}
- 将接口与sql映射文件动态绑定:
<?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">
<!--namespace:名称空间,写绑定接口的全类名-->
<mapper namespace="com.hhu.dao.EmployeeDao">
<!--id:唯一标识,就不是随意写了,需要写成绑定接口中对应的方法名
resultType:返回值类型,即执行sql后的返回值想要怎么处理,封装成什么对象
#{
id}:从方法传入的参数“id”获取传入sql语句的参数
-->
<select id="getEmployeeById" resultType="com.hhu.entity.Employee">
<!--这里是查不到lastName属性的,MyBatis默认根据JavaBean中的属性名的方式去查找
数据库,如果属性和字段名对不上,那么就查不到;
解决方法:在mapper文件属性名和字段名不一样地方,用JavaBean中的属性名做该字段的别名,
不用通配符*,即可
-->
select id, last_name lastName, gender,email from tbl_employee where id = #{
id}
</select>
</mapper>
- 调用:
@Test
public void testInterface() throws IOException {
//从配置文件的输入流读取配置创建SessionFactory
InputStream is = Resources.getResourceAsStream("conf/mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//打开一个会话
SqlSession sqlSession = sessionFactory.openSession();
try {
//这里虽然是获取的是接口类型的类,但是一旦将接口和sql映射文件动态绑定后
//MyBatis会自动为接口创建代理对象
EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);
//查看获取对象的类型,可以发现是一个代理对象,可以通过这个代理对象实现增删改查
System.out.println(employeeDao.getClass());
Employee e = employeeDao.getEmployeeById(1);
System.out.println(e);
} finally {
sqlSession.close();
}
}
经过上述的工作就完成了,在学习过Hibernate和MyBatis之后发现两者都有SqlSession,并且都是通过它来操作数据库,也就是说通过这个对象可以获取Connection对象。
【注意】SqlSession和Connection一样都是非线程安全的,在多线程环境下不能将它们作为成员变量放在外面!比如:
public class TestSqlSessionFactory {
private SqlSession sqlSession = null;
@Test
public void test1() {
...}
@Test
public void test1() {
...}
@Test
public void test1() {
...}
}
上面的写法就是有问题的,如果多线程都获取了这个SqlSession,A线程操作完直接关闭了,那其他线程怎么办,对吧,所以每次都要去获取显得实例。
3. MyBatis的全局配置文件(mybatis-config.xml
)
mybatis-config.xml
是MyBatis的全局配置文件,也是其核心配置文件,上面是以xml的形式来搞的,当然我们也可以不去搞这个文件,而是通过其他的方式,具体参见官方文档。关于MyBatis的全局配置文件需要写的东西基本都涵盖在了<configuration>
和</configuration>
标签中,下面着重对这个标签中的各个子标签做说明。
这里重要的地方再说一遍,被坑过啊,MyBatis的配置文件中标签必须按照指定的顺序去写,不按顺序写将直接报错!!
正确的标签顺序应该依次为:properties
,settings
,typeAliases
,typeHandlers
,objectFactory
,objectWrapperFactory
,reflectorFactory
,plugins
,environments
,databaseIdProvider
,mappers
,下面看一下关于其中一些常用标签的用法
3.1 properties
标签
这个标签见名知意,很明显是用于配置文件的,在MyBatis这个标签是用来引入外部资源文件的,通常会将数据库的连接配置单独拎出来写一个db.properties
文件,下面的是一个小栗子:
<properties resource="db.properties"></properties>
在properties
除了resource
标签外,还有一个url
标签,两者作用:
- resource:用来引入类路径下的资源
- url:用来引入网络路径或者磁盘路径下的资源
这里在写的时候还要注意,我是将所有的配置文件单独放在了src一个文件下,在IDEA需要将这个文件夹标记成Resources
才能这么写,否则前面要加上路径
3.2 settings
标签
这个标签很重要,它可以直接影响MyBatis运行时的行为,里面也有很子标签,具体参见文档,下面是一个关于下划线驼峰命名的设置栗子:
<settings>
<!--下划线驼峰命名规则,默认关闭;
若数据库中的字段为A_COUNT,而JavaBean中的属性名为aCount,即满足下划线后的
第一个字母大写,其他小写MyBatis即可自动映射成功,如果不满足这个规则将不能做映射,
像之前的Demo中lastName就是这个原因无法获取,只能通过别名获取,这里配置一下就可以了
-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
3.3 typeAliases
标签
这个标签是用来给JavaBean
起别名(在mapper
文件中的别名),在mapper
映射文件中,对于返回实体类的SQL语句,之前是写JavaBean
的全类名,现在就可以直接写在此标签的中别名,用法如下:
<typeAliases>
<!--
type为JavaBean的全类名,alias为该实体类的别名,其中alias属性可以缺省
(默认为首字母小写的类名)
-->
<typeAlias type="com.hhu.entitieses.Employee" alias="employee"/>
</typeAliases>
上述是对单个JavaBean
起别名,如果数量比较多的话,这样的方式倒也是很麻烦,对某个包中以及子包中的JavaBean起别名可以使用package
标签进行配置,如下:
<typeAliases>
<!--
name是包名,它会为该包下的所有类和子包的类起默认别名
(默认为首字母小写的类名)
-->
<package name="com.hhu.entities" />
</typeAliases>
在使用package
批量起别名的时候可能遇见这样的情况,父类包和子类包中含有同名的JavaBean,这就比较尴尬了,MyBatis中提供使用注解的方式来解决这个这个问题,只要在有冲突的JavaBean的类上使用@Alias("别名")
注解为该JavaBean
重新起一个没有冲突的别名即可。
3.4 typeHandlers
标签
它是类型处理器标签,是架起Java类型和数据库数据类型的桥梁,比如将java中String类型如何保存到数据库兼容的varchar或者char,又比如将数据库中查出的int类型转成java的Integer或者int类型。
3.5 objectFactory
标签
这个标签我们一般不动,使用MyBatis默认的就挺好。
3.6 plugins
标签
插件标签也是其中比较重要的标签,MyBatis可以通过插件对SQL语句进行拦截。
3.7 environments
标签
用于配置MyBatis的运行环境(我理解下来就是数据连接的配置),通过default
属性指定使用的环境(值为环境的唯一标识符id
),总体结构如下:
<environments default="dev_mysql">
<!--环境1-->
<environment id="dev_mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--引用外部配置文件的属性进行赋值-->
<property name="driver" value="${jdbc.driver}"/>
.
.
.
</dataSource>
</environment>
<!--环境2、环境3等等-->
</environments>
在environments
标签中的environment
标签可以配置多种MyBatis的运行环境,每个environment
标签中必须配置事务管理器transactionManager
和数据源dataSource
才算完整:
transactionManager
:事务管理器,通过type
属性指定事务管理器(正常为JDBC
),在MyBatis中主要有三种:JDBC和MANAGED以及自定义事务管理器- JDBC:就是使用JdbcTransactionFactory作为事务管理器
- MANAGED:就是使用ManagedTransactionFactory作为事务管理器
- 自定义事务管理器:可以通过实现org.apache.ibatis.transaction.TransactionFactory接口即可,type指定为自定义事务管理器的全类名
- dataSource:数据源同样,可以通过其中的type指定数据源的类型,MyBatis默认支持UNPOOLED和POOLED以及JNDI,也可以自定义。
- UNPOOLED:即不使用连接池,每次对数据库的操作都会创建新的连接去操作
- POOLED:就是使用连接池技术,这个比较好
- 自定义数据源:实现org.apache.ibatis.datasource.DataSourceFactory接口即可。
3.8 databaseIdProvider
标签
MyBatis可以根据不同的底层数据库的类型执行不同的SQL语句,其实就是MyBatis对于移植性的考虑,Hibernate在这一块做的特别好,因为SQL语句不需要我们自己写,都是由Hibernate自动帮我们发送SQL语句的,但是MyBatis可以根据这个标签指定我们在SQL映射文件使用的SQL语句是基于哪种数据库去写的,从而达到MaBatis根据不同的数据库动态的发送SQL。通过这个标签可以配置不同数据库底层的标识符,MyBatis根据这个标识符执行不同的SQL语句,主要体现MyBatis和数据库底层的解耦,一般的配置如下:
<!--这里面的type属性就是DB_VENDOR,不要写其他的-->
<databaseIdProvider type="DB_VENDOR">
<!--为不同的数据库厂商起别名,前面name属性是死的,value可以自己指定
下面的配置就是想让MyBatis同时支持MySQL和MySQL和SQL Server三种数据库,
在实际开发中主要看的想搞几种数据库类型
然后在mapper.xml文件中进行SQL语句查询时可以在select标签中用databaseId="别名"的方式
告诉MyBatis这个SQL语句是发送到哪种数据库的
-->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sql server"/>
</databaseIdProvider>
由于是不同的数据库,所以很容易就能想到需要配置其他的数据的环境吧,也就是说这个标签需要和前面的environments
标签结合使用,另外mapper文件中在写SQL语句的时候需要使用databaseId
属性指定使用的是哪种数据库厂商(它的值就是这里配置的各个数据库厂商和别名,比如MySQL
我们自定义的别名为mysql
),同时SQL映射文件中也要为不同的数据库的查询方式写不同的SQL语句的实现,下面以MySQL和Microsoft SQL Server两种数据库为例,看一下这个标签的用法:
- 导入额外的MMSQL的jar包:
mssql-jdbc-6.4.0.jre8.jar
- 在MSSQL中创建一张
employees
表,也有Employee
对象的属性,然后在db.properties
配置文件中加入MSSQL的连接配置:
# MySQL Configuration--db_mybatis
jdbc.userName=root
jdbc.password=9j
jdbc.url=jdbc:mysql://localhost:3306/db_mybatis
jdbc.driver=com.mysql.jdbc.Driver
# MicroSoft SQL Server--SchoolServer
mssqlserver.userName=sa
mssqlserver.password=9
mssqlserver.url=jdbc:sqlserver://localhost:1433;DatabaseName=SchoolServer
mssqlserver.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
- 在mybatis-config.xml配置文件中配置
environments
和databaseIdProvider
标签:
<environments default="dev_mysql">
<!---配置MySQL的环境-->
<environment id="dev_mysql">
<transactionManager type="JDBC"/>
<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>
<!--配置SQLServer的运行环境-->
<environment id="dev_mssql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${mssqlserver.driver}"/>
<property name="url" value="${mssqlserver.url}"/>
<property name="username" value="${mssqlserver.userName}"/>
<property name="password" value="${mssqlserver.password}"/>
</dataSource>
</environment>
</environments>
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="SQL Server" value="sql server"/>
</databaseIdProvider>
- SQL映射文件增加MSSQL的SQL语句,并用
databaseId
指定数据库厂商的别名:
<!--MySQL的查询语句-->
<select id="getEmployeeById" resultType="employee" databaseId="mysql">
select * from tbl_employee where id = #{id}
</select>
<!--同一SQL在不同数据库查询,这里指定去SQL Server中查询-->
<select id="getEmployeeById" resultType="employee" databaseId="sql server">
select * from employees where id = #{id}
</select>
然后运行面向接口的测试代码,通过控制台发现MyBatis发送的是mysql
的SQL语句,然后通过更改environments
标签的default
属性值为default="dev_mssql"
,再次运行,控制台打印的是MSSQL的语句。
【注意】这里除了在select
标签中使用databaseId
属性来指定SQL映射的哪种版本的数据库以外,还可以使用MyBatis内置参数_databaseId
和结合if
标签完成上面的工作,因为上述的方式必须要写两个select
标签,并不符合程序员偷懒的好习惯,改造一下如下:
<!--注意去掉原来标签中的databaseId属性-->
<select id="getEmployeeById" resultType="employee">
<!--注意在数据库上厂商别名上加单引号,否则MyBatis不能识别-->
<if test="_databaseId=='mysql'">
select * from tbl_employee where id = #{id}
</if>
<if test="_databaseId=='sql server'">
select * from employees where id = #{id}
</if>
</select>
<!--在MyBatis中必须配置数据库厂商的别名-->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="SQL Server" value="sql server"/>
</databaseIdProvider>
3.9 mappers
标签
通过该标签可以将SQL映射文件注册到全局配置文件中,用法如下:
<mappers>
<mapper resource="EmployeeMapper.xml"/>
</mappers>
当然在其子标签mapper
是注册各个SQL映射文件的,这个子标签下主要有3个属性:
resource
:引用类路径下的SQL映射文件;url
:引用网络路径或者磁盘路径下的SQL映射文件;class
:直接引用接口。
前两种不作太多说明,主要关于第三种class
属性做说明,如果直接引用接口,需要将接口和接口绑定的SQL映射文件必须在同一路径下并且两者的同名;但是更常规的做法是利用注解直接将SQL写在接口中的方法身上而不写mapper文件了,然后引用接口的类,比如:
@Select("select * from tbl_employee where id=#{id}")
Employee getEmployeeById(int id);
但是又不太推荐这么去写,因为MyBatis好不容易将java代码和SQL语句分离开来,现在又给他搞进去,确实不太好,而且不利于复杂SQL语句后期的优化,但是又因为用注解的方式实在太方便了,所以可以将简单的、不太重要的SQL直接用注解去搞,复杂的SQL写在xml中。
上面是单个SQL映射文件的注入,同时MyBatis也提供了批量映射文件的注册,只用如下的方式:
<mappers>
<!--会注册该包下所有类-->
<package name="包名"/>
</mappers>
但是这种适用于注解的方式,如果在xml的形式,就需要将SQL的映射文件和绑定的接口类放到同一包路径下并且同名。
4. SQL映射文件xxmapper.xml
SQL映射文件是MyBatis的核心文件之一,主要用于SQL语句的存放和接口的绑定。在一开始的Demo中就涉及到了关于mapper
文件的一些写法,该文件中的主体是<mapper>
标签,里面还有其他的一些常用的标签:
cache
:配置接口的缓存cache-ref
:引用其他接口的缓存resultMap
:描述从数据库中加载出来的结果集parameterMap
:已废弃sql
:一个可重用的SQL语句,可以被其他语句引用;insert
:插入操作的SQL映射;update
:更新操作的SQL映射;delete
:删除操作的SQL映射;select
:查询操作的SQL映射;
下面先对其中用的最多的增删改查标签搞一个小栗子:
<?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">
<!--namespace:名称空间,写绑定接口的全类名-->
<mapper namespace="com.hhu.dao.EmployeeDao">
<!--id:唯一标识,就写成绑定接口中对应的方法名
resultType:返回值类型,即执行sql后的返回值想要怎么处理,封装成什么对象
#{id}:从方法传入的参数“id”获取传入sql语句的参数
-->
<select id="getEmployeeById" resultType="com.hhu.entities.Employee">
<!--这里是查不到lastName属性的,MyBatis默认根据JavaBean中的属性名的方式去查找
数据库,如果属性和字段名对不上,那么就查不到;
解决方法:在mapper文件属性名和字段名不一样地方,用JavaBean中的属性名做该字段的别名,
不用通配符*,即可
-->
select id, last_namemm lastName, gender,email from tbl_employee where id = #{id}
</select>
<!--这里更新的时候,使用parameterType指明传入参数类型是Employee对象,
但是在SQL语句中我们需要的是这个对象中一些属性的时候,可以直接写
这个对象中的属性名即可,#{id}就是表示employee.id的意思-->
<update id="upDateById" parameterType="employee">
UPDATE tbl_employee SET last_NameMM=#{lastName}, gender=#{gender},email=#{email}
WHERE id = #{id}
</update>
<delete id="deleteById">
DELETE FROM tbl_employee WHERE id = #{id}
</delete>
<!--
有时候用户在做数据的写操作的时候,希望得到一个结果的反馈,
写入成功返回true,写入失败返回false;
MyBatis在涉及到写操作的删、除、改三种操作是允许返回true或者false的,
直接在接口中将这些方法的返回值定义为boolean即可,但是在mapper文件
中标签中不需要指定返回值类型。原理是根据SQL语句影响的行数来
封装返回值的,如果影响的行数为0则返回false,如果影响的行数大于0则返回true
-->
<insert id="saveEmp" parameterType