在往常连接数据库中,我使用工具类封装数据库的连接工具,在db.properties中配置数据库的相关参数,在工具类中用properties流来读取配置,那么在MyBatis中是否有相同的方法来解耦xml中的配置信息呢
properties标签
1 功能
用于加载外部的 properties 文件
2 使用方式
获取 properties 文件中数据时, 要通过${}的方式获取.
db.properties:
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=servlet
password=servlet
applicationContext-dao.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>
<environments default="development"> <!--默认使用的环境-->
<environment id="development">
<transactionManager type="JDBC"/> <!--使用事务管理沿用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>
<!--扫描mybatis的sql语句所在的文件-->
<mappers>
<mapper resource="com/batis/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
值得一提的是,在获取 properties 文件中数据时, 要通过EL表达式的方式获取.
t_user表的数据库设计结构:
create table t_user(
tid number primary key,
uname varchar2(20),
pwd
);
alter table t_user add sex number check (sex in('1','0'))
通过接口绑定解决多参数的传递(开发中推荐使用)
在mapper目录下创建UserMapper接口,使用动态代理来实现参数传递
UserMapper:
package com.batis.mapper;
import com.batis.pojo.User;
public interface UserMapper {
public User selByName(String name);
public User selByNP(String name,String pwd);
}
在UserMapper.xml中用namespace指向UserMapper接口,select的id要和接口中定义的方法名称一致
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.batis.mapper.UserMapper"> <!--这是名称空间的值写当前配置文件所在的包的包名-->
<select id="selOne" resultType="com.batis.pojo.User">
select * from t_user where uname = '李四'
</select>
<select id="selAll" resultType="com.batis.pojo.User"><!--返回值是集合,则返回集合的泛型即可-->
select * from t_user
</select>
<select id="selByName" resultType="User">
select * from t_user where uname = #{arg0}
</select>
<select id="selByNP" resultType="User">
select * from t_user where uname = #{arg0} and pwd = #{arg1}
</select>
</mapper>
<select id="selByName" resultType="User">
select * from t_user where uname = #{arg0}
</select>
在这个代码中,返回值类型,我在applicatContext-dao.xml中对com.batis.pojo.User做了重新命名
测试类
Test02():
package com.batis.test;
import com.batis.mapper.UserMapper;
import com.batis.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.Reader;
public class Test02 {
private UserMapper mapper;
private SqlSession Session
public Test02() throws IOException {
Reader in = Resources.getResourceAsReader("applicationContext-dao.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
Session = factory.openSession();
mapper = Session.getMapper(UserMapper.class);//使用反射,参数为UserMapper的class对象
//通过反射创建接口的动态代理
}
@Test
public void selByName(){
User user = mapper.selByName("李四");
System.out.println(user);
}
@Test
public void selByNP(){
User user = mapper.selByNP("李四","123456");
System.out.println(user);
}
}
结果:
D:\Java\jdk-14.0.1_windows-x64_bin\jdk-14.0.1\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=56629:D:\JAVA\IntelliJ IDEA 2019.3.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit5-rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit-rt.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\out\production\firstmybatis;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\asm-3.3.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\cglib-2.2.2.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\commons-logging-1.1.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\javassist-3.17.1-GA.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\junit-4.9.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-1.2.17.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-api-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-core-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mybatis-3.5.3.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mysql-connector-java-5.1.48.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\ojdbc6.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-api-1.7.5.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-log4j12-1.7.5.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.batis.test.Test02,selByNP
- Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter. org.apache.ibatis.logging.LogFactory org.apache.ibatis.logging.LogFactory.setImplementation(LogFactory.java:105) 2020-07-18 16:00:17
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:00:17
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:00:17
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:00:17
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:00:17
- Opening JDBC Connection org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:136) 2020-07-18 16:00:18
- Created connection 1846501247. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:424) 2020-07-18 16:00:18
- Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@6e0f5f7f] org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.setDesiredAutoCommit(JdbcTransaction.java:100) 2020-07-18 16:00:18
- ==> Preparing: select * from t_user where uname = ? and pwd = ? com.batis.mapper.UserMapper.selByNP org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:00:18
- ==> Parameters: 李四(String), 123456(String) com.batis.mapper.UserMapper.selByNP org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:00:18
- <== Total: 1 com.batis.mapper.UserMapper.selByNP org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:00:18
User{tid=12, uname='李四', pwd='123456', sex=1}
Process finished with exit code 0
参数中使用@Param 注解设定参数名用于在 SQL 语句中使用.@Param后面是sql中使用的别名映射文件中提供对应的标签. 此时, SQL 语句中获取方有两种, 通过#{参数名称}或#{param+数字}的方式.第一个参数是param1,第二个是param2
在传递参数时传递对象
多个参数传递时, 由于 sqlSession 中提供的查询方法只允许传入一个参数, 因此可以对多个参数进行封装. 可以使用对象或 Map 集合.
UserMapper.xml:
<select id="selByUser" resultType="User">
select * from t_user where uname = #{uname} and pwd = #{pwd}
</select>
UserMapper:
public User selByUser(User user);
Test02:
@Test
public void selByUser(){
User u = new User();
u.setUname("李四");
u.setPwd("123456");
User user = mapper.selByUser(u);
System.out.println(user);
}
结果:
D:\Java\jdk-14.0.1_windows-x64_bin\jdk-14.0.1\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=56755:D:\JAVA\IntelliJ IDEA 2019.3.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit5-rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit-rt.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\out\production\firstmybatis;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\asm-3.3.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\cglib-2.2.2.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\commons-logging-1.1.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\javassist-3.17.1-GA.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\junit-4.9.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-1.2.17.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-api-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-core-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mybatis-3.5.3.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mysql-connector-java-5.1.48.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\ojdbc6.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-api-1.7.5.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-log4j12-1.7.5.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.batis.test.Test02,selByNP
- Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter. org.apache.ibatis.logging.LogFactory org.apache.ibatis.logging.LogFactory.setImplementation(LogFactory.java:105) 2020-07-18 16:13:19
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:13:19
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:13:19
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:13:19
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:13:19
- Opening JDBC Connection org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:136) 2020-07-18 16:13:19
- Created connection 671471369. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:424) 2020-07-18 16:13:19
- Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@2805d709] org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.setDesiredAutoCommit(JdbcTransaction.java:100) 2020-07-18 16:13:19
- ==> Preparing: select * from t_user where uname = ? and pwd = ? com.batis.mapper.UserMapper.selByNP org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:13:19
- ==> Parameters: 李四(String), 123456(String) com.batis.mapper.UserMapper.selByNP org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:13:19
- <== Total: 1 com.batis.mapper.UserMapper.selByNP org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:13:19
User{tid=12, uname='李四', pwd='123456', sex=1}
Process finished with exit code 0
可以看到,在传递参数时可以传入一个对象,而在xml中获取对象属性时则直接使用#{属性名}来获取,这种方法可以做到,传入一个对象,在获取的时候调用不同的值,传入的参数不限制个数,在开发者中有较大的方便性,较为常用。
事务(Transaction)
a) 事务是数据库操作的最小单元, 有 ACID(原子性、一致性、合理性、持久性) 的特性. 应该保证一个事务的的 SQL 语句要么同时成功, 要么都不成功.
b) MyBatis 中配置了事务管理器, type 属性设置为 JDBC.表示 MyBatis 采用和原生 JDBC 相同的事务管理机制.
c) 在 MyBatis 执行的开始时, 将自动提交功能关闭了. 所以,在执行 DML 操作时, 需要手动提交事务.
在前面我们用MyBatis对数据库的查询操作有所了解,接下来对增删改操作逐一进行练习和操作
Insert(插入操作)
和查询操作一样,先在UserMapper.xml中加入insert标签
UserMapper.xml:
<insert id="insert">
insert into t_user values(null,#{uname},#{pwd},#{sex})
</insert>
值得一提的是,我在tid插入的为空值,是因为我在数据库中写了触发器,当数据插入时触发器自动将tid替换为自定义自增序列的nextval
触发器:
--写触发器,实现插入tid自增
create sequence user_tid_seq;
select user_tid_seq.nextval from dual;
create or replace trigger tri1
before
insert
on t_user
for each row--行级触发器,不写就是表级触发器
declare
begin
select user_tid_seq.nextval into :new.tid from dual;
end;
UserMapper接口:
public int insert(User user);
Test02:
@Test
public void insert(){
User u = new User();
u.setUname("小白");
u.setPwd("123");
u.setSex(1);
int n = mapper.insert(u);
if(n==1){
System.out.println("插入成功");
session.commit();
}else{
System.out.println("插入失败");
session.rollback();
}
}
结果:
D:\Java\jdk-14.0.1_windows-x64_bin\jdk-14.0.1\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=56878:D:\JAVA\IntelliJ IDEA 2019.3.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit5-rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit-rt.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\out\production\firstmybatis;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\asm-3.3.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\cglib-2.2.2.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\commons-logging-1.1.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\javassist-3.17.1-GA.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\junit-4.9.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-1.2.17.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-api-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-core-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mybatis-3.5.3.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mysql-connector-java-5.1.48.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\ojdbc6.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-api-1.7.5.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-log4j12-1.7.5.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.batis.test.Test02,insert
- Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter. org.apache.ibatis.logging.LogFactory org.apache.ibatis.logging.LogFactory.setImplementation(LogFactory.java:105) 2020-07-18 16:25:56
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:25:56
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:25:56
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:25:56
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:25:56
- Opening JDBC Connection org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:136) 2020-07-18 16:25:56
- Created connection 1560940633. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:424) 2020-07-18 16:25:56
- Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@5d0a1059] org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.setDesiredAutoCommit(JdbcTransaction.java:100) 2020-07-18 16:25:56
- ==> Preparing: insert into t_user values(null,?,?,?) com.batis.mapper.UserMapper.insert org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:25:56
- ==> Parameters: 小白(String), 123(String), 1(Integer) com.batis.mapper.UserMapper.insert org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:25:56
- <== Updates: 1 com.batis.mapper.UserMapper.insert org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:25:56
插入成功
- Committing JDBC Connection [oracle.jdbc.driver.T4CConnection@5d0a1059] org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.commit(JdbcTransaction.java:69) 2020-07-18 16:25:56
Process finished with exit code 0
Delete(删除操作)
和插入操作一样,先在UserMapper.xml中加入delete标签
UserMapper.xml:
<delete id="delete">
delete from t_user where uname = #{uname}
</delete>
UserMapper接口:
public int delete(User user);
Test02测试类:
@Test
public void dalete(){
User u = new User();
u.setUname("小白");
int n = mapper.delete(u);
if(n==1){
System.out.println("删除成功");
session.commit();
}else{
System.out.println("删除失败");
session.rollback();
}
}
结果:
D:\Java\jdk-14.0.1_windows-x64_bin\jdk-14.0.1\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=57000:D:\JAVA\IntelliJ IDEA 2019.3.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit5-rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit-rt.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\out\production\firstmybatis;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\asm-3.3.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\cglib-2.2.2.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\commons-logging-1.1.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\javassist-3.17.1-GA.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\junit-4.9.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-1.2.17.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-api-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-core-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mybatis-3.5.3.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mysql-connector-java-5.1.48.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\ojdbc6.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-api-1.7.5.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-log4j12-1.7.5.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.batis.test.Test02,dalete
- Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter. org.apache.ibatis.logging.LogFactory org.apache.ibatis.logging.LogFactory.setImplementation(LogFactory.java:105) 2020-07-18 16:39:09
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:39:09
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:39:09
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:39:09
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:39:09
- Opening JDBC Connection org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:136) 2020-07-18 16:39:09
- Created connection 1213818572. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:424) 2020-07-18 16:39:10
- Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@485966cc] org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.setDesiredAutoCommit(JdbcTransaction.java:100) 2020-07-18 16:39:10
- ==> Preparing: delete from t_user where uname = ? com.batis.mapper.UserMapper.delete org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:39:10
- ==> Parameters: 小白(String) com.batis.mapper.UserMapper.delete org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:39:10
- <== Updates: 1 com.batis.mapper.UserMapper.delete org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:39:10
删除成功
- Committing JDBC Connection [oracle.jdbc.driver.T4CConnection@485966cc] org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.commit(JdbcTransaction.java:69) 2020-07-18 16:39:10
Process finished with exit code 0
Update(插入操作)
和查询操作一样,先在UserMapper.xml中加入update标签
UserMapper.xml:
<update id="update">
update t_user set uname = #{uname},pwd = #{pwd},sex = #{sex} where tid = #{tid}
</update>
UserMapper接口:
public int update(User user);
Test02测试类:
@Test
public void update(){
User u = new User();
u.setTid(5);
u.setUname("hj");
u.setPwd("123");
u.setSex(1);
int n = mapper.update(u);
if(n==1){
System.out.println("更新成功");
session.commit();
}else {
System.out.println("更新失败");
session.rollback();
}
}
结果:
D:\Java\jdk-14.0.1_windows-x64_bin\jdk-14.0.1\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=57189:D:\JAVA\IntelliJ IDEA 2019.3.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit5-rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit-rt.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\out\production\firstmybatis;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\asm-3.3.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\cglib-2.2.2.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\commons-logging-1.1.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\javassist-3.17.1-GA.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\junit-4.9.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-1.2.17.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-api-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-core-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mybatis-3.5.3.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mysql-connector-java-5.1.48.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\ojdbc6.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-api-1.7.5.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-log4j12-1.7.5.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.batis.test.Test02,update
- Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter. org.apache.ibatis.logging.LogFactory org.apache.ibatis.logging.LogFactory.setImplementation(LogFactory.java:105) 2020-07-18 16:56:16
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:56:16
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:56:16
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:56:16
- PooledDataSource forcefully closed/removed all connections. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:353) 2020-07-18 16:56:16
- Opening JDBC Connection org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:136) 2020-07-18 16:56:16
- Created connection 501705927. org.apache.ibatis.datasource.pooled.PooledDataSource org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:424) 2020-07-18 16:56:16
- Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@1de76cc7] org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.setDesiredAutoCommit(JdbcTransaction.java:100) 2020-07-18 16:56:16
- ==> Preparing: update t_user set uname = ?,pwd = ?,sex = ? where tid = ? com.batis.mapper.UserMapper.update org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:56:16
- ==> Parameters: hj(String), 123(String), 1(Integer), 5(Integer) com.batis.mapper.UserMapper.update org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:56:16
- <== Updates: 1 com.batis.mapper.UserMapper.update org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2020-07-18 16:56:16
更新成功
- Committing JDBC Connection [oracle.jdbc.driver.T4CConnection@1de76cc7] org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.jdbc.JdbcTransaction.commit(JdbcTransaction.java:69) 2020-07-18 16:56:16
Process finished with exit code 0
总结:
- mapper.xml 文件中, 通过insert,delete,update定义新增语句. 注意, 由于 DML 操作的返回值都是 int 类型 , 所以 , 不需要定义 resultType 属性.
- mapper.xml文件中,当传入的值是普通数据类型时,通过#{arg0},#{arg1}或者#{param1},#{param2}来获得参数
- mapper.xml中,当传入的值是自定义数据类型,通过#{属性名}获取属性值