做到现在,我们已经配置完全局配置文件了,这个配置文件只要第一次配置好,暂时就不必再理它了.我们以后做的增删改查的操作都在映射配置中修改就可以了.现在我们来做三个案例,查询全部,模糊查询,和插入.插入,修改,删除除了关键字不同外,其他的基本一样,所以这里我们就用插入来作为代表了.
下面我将三个操作的配置文件写在下面: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="adhs">
<select id="selectUser" resultType="userinfo">
select * from userinfo where uid = #{uid}
</select>
<!-- 查询所有 -->
<!-- 前面我们提过,映射这部门我们只关注三点就够了,sql语句,输入参数和输出结果,其他东西框架都处理好了
这里格外注意下输出结果___resulType:封装到哪个对象中去
-->
<select id="selectAll" resultType="userinfo">
select * from userinfo
<!-- 这里我们发现,这里和以前不同,这里查询的是一个结果集,不是单一记录了.
但是resultType写的就是单个结果类型,无论你查询出来的是一个还是多个.那我们怎么得到多个结果呢?
在调用的时候用查询多个的方法来解决这个问题
-->
</select>
<!-- 模糊查询 -->
<!--
这里导入了一个log4j的jar包,能够支持日志输出
log4j.properties 控制哪些日志可以输出,日志输出的格式
-->
<!--
${}:和#{}表示占位不同,这个符号表示连接
里面的关键字:同样和输入参数有关
简单类型:value
引用:对象属性名
-->
<select id="selectLikeName" resultType="userinfo">
select * from userinfo where username like '%${value}%'
</select>
<!-- 插入 -->
<insert id="insert" >
insert into userinfo(username,password) values(#{username},#{password})
</insert>
</mapper>
测试的代码我写在下面:test
①.查询全部
public class Test {
public static void main(String[] args) throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = ssf.openSession();
//查询全部
List<UserInfo> list = session.selectList("adhs.selectAll");
System.out.println(list);
//归还连接
session.close();
}
}
因为我们导入了和日志输出有关的jar包,这里我就简单将控制台输出的结果贴在下面
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG [main] - Class not found: org.jboss.vfs.VFS
DEBUG [main] - JBoss 6 VFS API is not available in this environment.
DEBUG [main] - Class not found: org.jboss.vfs.VirtualFile
DEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFS
DEBUG [main] - Find JAR URL: file:/D:/workspaceofEE/Zmybatis01/bin/pojo
DEBUG [main] - Not a JAR: file:/D:/workspaceofEE/Zmybatis01/bin/pojo
DEBUG [main] - Reader entry: UserInfo.class
DEBUG [main] - Listing file:/D:/workspaceofEE/Zmybatis01/bin/pojo
DEBUG [main] - Find JAR URL: file:/D:/workspaceofEE/Zmybatis01/bin/pojo/UserInfo.class
DEBUG [main] - Not a JAR: file:/D:/workspaceofEE/Zmybatis01/bin/pojo/UserInfo.class
DEBUG [main] - Reader entry: 这里有些乱码
DEBUG [main] - Checking to see if class pojo.UserInfo matches criteria [is assignable to Object]
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1007653873.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3c0f93f1]
DEBUG [main] - ==> Preparing: select * from userinfo
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 3
[UserInfo [uid=1, username=litao, password=123], UserInfo [uid=2, username=li, password=234], UserInfo [uid=8, username=ww, password=123]]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3c0f93f1]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@3c0f93f1]
DEBUG [main] - Returned connection 1007653873 to pool.
这里我们可以通过日志了解到程序运行的每个步骤.还是蛮方便的.
②.模糊查询
这里主要看上面的映射配置,有一个${}作为连接的需要我们熟悉掌握.其他的就很容易理解了.代码我就直接放在下面.
public class Test {
public static void main(String[] args) throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = ssf.openSession();
List<UserInfo> list = session.selectList("adhs.selectLikeName","i");
System.out.println(list);
//归还连接
session.close();
}
}
③.下面注意说一下第三个,插入.先看一下插入的代码
public class Test {
public static void main(String[] args) throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = ssf.openSession();
//插入
//我们这里传入的是一个对象.
UserInfo info = new UserInfo();
info.setPassword("123");
info.setUsername("lele");
int rows = session.insert("adhs.insert",info);
System.out.println(rows);
//归还连接
session.close();
//归还连接
session.close();
}
}
运行结果看下面:
我们发现,日志并没有报错,而且和我们以前sql返回的一样,影响了一条记录.从这里看貌似是成功了,但是我们打开数据发现,表中并没有新的记录产生.这是为什么呢?
我们仔细看日志,红色框上面我们发现有一句setting autocommit to false...而红框下面resetting autocommit to true ..翻译过来就是,在我们sql语句执行前,框架把自动提交关了,等我们执行完sql,它又重新打开了自动提交,这不是相当于我们的SQL指令根本没有提交吗?搞笑呢?
所以这里我们有两种解决办法:
方案1:按照下图的,在创建session的时候传入一个true,以为这开启自动提交..多打了一个归还连接..失误 ..失误..
方案2: 既然框架关闭了,那我们就手动提交,如下图.