MyBatis入门
mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的orm框架。
Mybatis让程序员只关注sql本身,而不需要去关注如连接的创建、statement的创建等操作。
Mybatis会将输入参数、输出结果进行映射。
MyBatis是什么?
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
总而言之MyBatis是一个轻量级简化数据库操作的框架。
为什么要使用MyBatis?
为了解决JDBC存在的问题和简化数据库操作,MyBatis提供了较为优秀的解决方案;
例如:
可以通过主配置文件配置连接池解决频繁创建、释放数据库连接造成的性能影响;
动态SQL解决JDBC中硬编码问题:
a) Where条件改变;
b) 占位符位置变化;
可通过包装类方便的获取数据库查询结果集对象;
使Dao层业务逻辑和数据库访问分离更易维护和测试。
MyBatis架构图
1. 导入jar包
2. 配置MyBatis配置文件
src/总配置文件 mybatis.cfg.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>
<typeAliases>
<!--Users类别名uuu-->
<typeAlias alias="uuu" type="com.senchen.entity.Users" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/elm" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 注册usersMapper.xml文件, usersMapper.xml位于com.senchen.mapper这个包下,所以resource写成com/senchen/mapper/UsersMapper.xml -->
<mapper resource="com/senchen/mapper/UsersMapper.xml" />
</mappers>
</configuration>
3. 实体类Users和专属ORM文件UsersMapper.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.senchen.mapper.UsersMapper">
<!--id:方法名 parameterType:参数类型 resultType:返回结果类型
#{}: 类似于? 参数的位置,里面的值任意
-->
<select id="findById" parameterType="String" resultType="com.senchen.entity.Users">
select * from users where userid=#{id}
</select>
<!--在mybatis.cfg.xml中com.senchen.entity.Users的别名为uuu-->
<select id="findAll" resultType="uuu">
select * from users
</select>
<!--100和0是
private String uphone;
private String uemail;这里直接赋值
-->
<insert id="save" parameterType="uuu">
insert into users values(#{userId},#{uname},#{upwd},#{uhead},
#{uphone},#{uemail},100,0)
</insert>
</mapper>
4. 测试类使用
public static void main(String[] args) {
System.out.println("1..."+Test.class.getResource("")); //当前类路径
System.out.println("2..."+Test.class.getResource("/"));//非web项目的 classpath
//web项目classpath reqeust.getSession().getServletContext().getRealPath("/")
InputStream is = Test.class.getResourceAsStream("/mybatis.cfg.xml");
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//获取一个sqlSession
SqlSession session = sessionFactory.openSession();
//执行查询返回一个唯一user对象的sql
Users user = session.selectOne("com.senchen.mapper.UsersMapper.findById","com002");
System.out.println(user);
List<Users> ulist = session.selectList("com.senchen.mapper.UsersMapper.findAll");
System.out.println("---集合 " + (ulist!=null?ulist.size():-1));
Users u = new Users();
u.setUemail("a@b.c");
u.setUhead("u.png");
u.setUname("张三");
u.setUphone("131");
u.setUpwd("000");
u.setUserId("AAA1");
//session.insert("com.senchen.mapper.UsersMapper.save",u);
session.commit();
System.out.println("---ok");
测试SqlSession的方法有
selectOne
selectList
insert +commit
update +commit
delete +commit
resultType和resultMap
mybatis.cfg.xml中加入
<mappers>
<mapper resource="com/senchen/mapper/RsTypeMapper.xml" />
<mapper resource="com/senchen/mapper/RsMapMapper.xml" />
</mappers>
resultType
<!-- 返回 Users对象 适合查单表 -->
<select id="findAll" resultType="uuu">
select * from users
</select>
<!-- 返回 Map对象 适合多表联查 推荐 -->
<select id="findAllMap" resultType="java.util.Map">
select * from users
</select>
测试
Map的键就是列名
List<Users> ulist = session.selectList("com.senchen.mapper.aaa.findAll");
System.out.println("1---集合 " + (ulist!=null?ulist.size():-1));
for (Users users : ulist) {
System.out.println( users.getUserId()+"\t"+users.getUname());
}
List<Map> ulist2 =session.selectList("com.senchen.mapper.aaa.findAllMap");
System.out.println("2---集合 " + (ulist2!=null?ulist2.size():-1));
for (Map mp : ulist2) {
System.out.println( mp.get("userId")+"\t"+ mp.get("uname")) ;
}
reultMap
<resultMap id="my01" type="uuu">
<result property="userId" column="userId"/> 数据绑定:
<result property="uname" column="uname"/> property值为Users对象中的set方法名
<result property="upwd" column="upwd"/> column值为查询结果的列名
<result property="utype" column="utype"/>
</resultMap>
<!-- 返回 Users对象 适合查单表 -->
<select id="findAll" resultMap="my01">
select * from users
</select>
<resultMap id="my02" type="java.util.Map">
<result property="uid" column="userId"/> 使用Map时可以自行设置键名称
<result property="un" column="uname"/>
<result property="up" column="upwd"/>
<result property="ut" column="utype"/>
</resultMap>
<!-- 返回 Map对象 -->
<select id="findAllMap" resultMap="my02">
select * from users
</select>
测试
List<Users> ulist = session.selectList("com.senchen.mapper.bbb.findAll");
System.out.println("1---集合 " + (ulist!=null?ulist.size():-1));
for (Users users : ulist) {
System.out.println( users.getUserId()+"\t"+users.getUname()+"\t"+ users.getUstate());
}
List<Map> ulist2 =session.selectList("com.senchen.mapper.bbb.findAllMap");
System.out.println("2---集合 " + (ulist2!=null?ulist2.size():-1));
for (Map mp : ulist2) {
System.out.println( mp.get("uid")+"\t"+ mp.get("un")+"\t"+ mp.get("ut") ) ;
}
parameterType和parameterMap
parameterType
<!-- 一个参数 接收string -->
<select id="findById" resultType="uuu" parameterType="String">
select * from users where userid=#{xxx}
</select>
<!-- 二个参数 接收 Users类-->
<select id="login" resultType="uuu" parameterType="uuu">
select * from users where uname=#{uname} and upwd=#{upwd}
</select>
<!-- 二个参数 接收 Map-->
<select id="loginFind" resultType="uuu" parameterType="java.util.Map">
select * from users where uname=#{ua} and upwd=#{ub}
</select>
TestType
Users u1 = session.selectOne("com.senchen.mapper.aaa.findById","com001");
System.out.println("1..."+ u1);
Users tu = new Users();
tu.setUname("张三");
tu.setUpwd("000");
Users u2 = session.selectOne("com.senchen.mapper.aaa.login", tu);
System.out.println("2..."+ u2);
Map<String,Object> map = new HashMap<String,Object>();
map.put("ua", "张三");
map.put("ub", "000");
Users u3 = session.selectOne("com.senchen.mapper.aaa.loginFind", map);
System.out.println("3..."+ u3);
parameterMap
<parameterMap id="p01" type="String">
<parameter property="xxx" javaType="String"/>
</parameterMap>
<!-- 一个参数 接收string -->
<select id="findById" resultType="uuu" parameterMap="p01">
select * from users where userid=#{xxx}
</select>
<parameterMap id="p02" type="uuu">
<parameter property="uname" javaType="String"/>
<parameter property="upwd" javaType="String"/>
</parameterMap>
<!-- 二个参数 接收 Users类-->
<select id="login" resultType="uuu" parameterMap="p02">
select * from users where uname=#{uname} and upwd=#{upwd}
</select>
<parameterMap id="p03" type="uuu">
<parameter property="ua" javaType="String"/>
<parameter property="ub" javaType="String"/>
</parameterMap>
<!-- 二个参数 接收 Map-->
<select id="loginFind" resultType="uuu" parameterMap="p03">
select * from users where uname=#{ua} and upwd=#{ub}
</select>
TestMap
Users u1 = session.selectOne("com.senchen.mapper.bbb.findById","com001");
System.out.println("1..."+ u1);
Users tu = new Users();
tu.setUname("张三");
tu.setUpwd("000");
Users u2 = session.selectOne("com.senchen.mapper.bbb.login", tu);
System.out.println("2..."+ u2);
Map<String,Object> map = new HashMap<String,Object>();
map.put("ua", "张三");
map.put("ub", "000");
Users u3 = session.selectOne("com.senchen.mapper.bbb.loginFind", map);
System.out.println("3..."+ u3);