经典三层框架初识--一.Mybatis(中),其他案例

本文介绍了Mybatis的经典三层框架应用,通过配置文件展示了查询全部、模糊查询和插入操作的实现。在插入操作中,遇到未保存到数据库的问题,原因是Mybatis在执行SQL前关闭了自动提交。提供了两种解决方案:开启Session的自动提交或手动提交事务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       做到现在,我们已经配置完全局配置文件了,这个配置文件只要第一次配置好,暂时就不必再理它了.我们以后做的增删改查的操作都在映射配置中修改就可以了.现在我们来做三个案例,查询全部,模糊查询,和插入.插入,修改,删除除了关键字不同外,其他的基本一样,所以这里我们就用插入来作为代表了.

下面我将三个操作的配置文件写在下面: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: 既然框架关闭了,那我们就手动提交,如下图.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值