所谓的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包既可以
2.. 在 src 下新建全局配置文件:
2.1 没有名称和地址要求 :一般习惯叫mybatis.xml
2.2 在全局配置文件中引入 DTD 或 schema
2.2.1 如果导入 dtd 后没有提示 Window--> preference --> XML --> XMl catalog --> add 按钮
没有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();
}
测试结果:
没问题!
如果发生异常的话
报错显示:没有找到映射
说明: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 |
如果有什么不对的地方请指出!!