Mybatis学习笔记(一)

所谓的SSM即:

spring+springmvc+mybatis.

MyBatis 简介

1. Mybatis 开源免费框架.原名叫 iBatis,2010 在 google code,2013 年迁 移到 github

2. 作用: 数据访问层框架.

2.1 底层是对 JDBC 的封装.

3. mybatis 优点之一:

3.1 使用 mybatis 时不需要编写实现类,只需要写需要执行的 sql 命令

Mybatis环境的搭建

1.导入mybatis-3.2.7.jar包既可以

20190428224436318

2.. 在 src 下新建全局配置文件:

2.1 没有名称和地址要求 :一般习惯叫mybatis.xml

20190428225943166

2.2 在全局配置文件中引入 DTD 或 schema

2.2.1 如果导入 dtd 后没有提示 Window--> preference --> XML --> XMl catalog --> add 按钮

2019042822491199

20190428225611515

没有dtd的小伙伴可以到下面下载

(1)mybatis-3-config.dtd约束文件下载:

http://mybatis.org/dtd/mybatis-3-config.dtd

(2)mybatis-3-mapper.dtd约束文件下载:

http://mybatis.org/dtd/mybatis-3-mapper.dtd

2.3 全局配置内容

即上面创建的mybatis.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>
	<!-- 这里的default对应id为default值的默认 -->
	<environments default="default">
		<environment id="default">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/test/>
				<property name="username" value="root"/>
				<property name="password" value="123456"/>
			</dataSource>
		</environment>
	</environments>
    <!--mapper即等会创建的xxxmapper.xml-->
	<mappers>
		<mapper resource="mapper/UserMapper.xml"/>
	</mappers>
</configuration>

3. 新建以 mapper 结尾的包,在包下新建:实体类名+Mapper.xml
3.1 文件作用:编写需要执行的 SQL 命令
3.2 把 xml 文件理解成dao层实现类.
3.3 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="pojo.User">
	<select id="getAll" resultType="pojo.User">
		select * from user
	</select>
	<select id="getAllCount" resultType="int"><!-- 这里int指代Integer,属于mybatis内置类型 --> 
		select count(*) from user
	</select>
	<select id="getById" resultType="User" parameterType="int">
		select * from user where id=#{0}
	</select>
	<select id="getMap" resultType="pojo.User">
		select * from user
	</select>
</mapper>

namespace:(这是官方给出的解释)

在之前版本的 MyBatis 中,命名空间(Namespaces)的作用并不大,是可选的。 但现在,随着命名空间越发重要,你必须指定命名空间。

命名空间的作用有两个,一个是利用更长的完全限定名来将不同的语句隔离开来,同时也实现了你上面见到的接口绑定。就算你觉得暂时用不到接口绑定,你也应该遵循这里的规定,以防哪天你改变了主意。 长远来看,只要将命名空间置于合适的 Java 包命名空间之中,你的代码会变得更加整洁,也有利于你更方便地使用 MyBatis。

命名解析:为了减少输入量,MyBatis 对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。

  • 完全限定名(比如 “com.mypackage.MyMapper.selectAllThings)将被直接用于查找及使用。
  • 短名称(比如 “selectAllThings”)如果全局唯一也可以作为一个单独的引用。 如果不唯一,有两个或两个以上的相同名称(比如 “com.foo.selectAllThings” 和 “com.bar.selectAllThings”),那么使用时就会产生“短名称不唯一”的错误,这种情况下就必须使用完全限定名。

4. 测试结果(只有在单独使用 mybatis 时使用,以后 ssm 整合时下面代 码不需要编写.)

  SqlSession session = null;
		try {
			InputStream is = Resources.getResourceAsStream("mybatis.xml");
			// 使用工厂设计模式
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
			// 生产sqlsession
			session = factory.openSession();
			List<User> users = session.selectList("pojo.User.getAll");
			for (User user : users) {
				System.out.println(user.toString());
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			session.close();
		}

测试结果:

20190428231835178

没问题!

如果发生异常的话

报错显示:没有找到映射

说明:mybatis.xml文件里少了映射

<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>

添加上就行

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for pojo.User.getAll
### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for pojo.User.getAll
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:26)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:111)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:102)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)
    at test.Test.main(Test.java:23)
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for pojo.User.getAll
    at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:797)
    at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:631)
    at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:624)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107)
    ... 3 more

全局配置文件中内容

1.1 type 属性可取值

1.1.1 JDBC,事务管理使用 JDBC 原生事务管理方式

1.1.2 MANAGED 把事务管理转交给其他容器.原生 JDBC 事务 setAutoMapping(false);

1.2 type 属性

1.2.1 POOLED 使用数据库连接池

1.2.2 UNPOOLED 不实用数据库连接池,和直接使用 JDBC 一样

1.2.3 JNDI :java 命名目录接口技术.

常见的三种查询方式

1.适用于查询结果都需要遍历的需求

<select id="getAll" resultType="pojo.User">
		select * from user
</select>

List<Flower> list = session.selectList("a.b.selAll");
       for (Flower flower : list) {
       System.out.println(flower.toString());
}

2.selectOne() 返回值 Object,

2.1 适用于返回结果只是变量或一行数据时


<select id="getAllCount" resultType="int"><!-- 这里int指代Integer,属于mybatis内置类型 --> 
		select count(*) from user
	</select>
	<select id="getById" resultType="pojo.User">
		select * from user where id=60001 
	</select>

输出结果:3

	User user=session.selectOne("pojo.User.getById");
	System.out.println(user.toString());

3.selectMap() 返回值 Map

3.1 适用于需要在查询结果中通过某列的值取到这行数据的需求.
3.2 Map<key,resultType 控制>

//此处将username作为map的key,将值作为value
Map<String, User> users=session.selectMap("pojo.User.getMap", "username");
System.out.println(users);

类型映射表:

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

如果有什么不对的地方请指出!!