Mybatis基础
一. mybatis简介
Mybatis:
- 1.基于java的持久层(dao)框架,封装了jdbc,开发者只需关注sql语句本身;
- 2.通过xml或注解方式,将java对象与sql参数映射成最终的sql语句;
- 3.执行sql语句并将结果集以java对象形式返回
二. 开发步骤
1. 添加MyBatis的坐标
- pom.xml:
mysql-connector-java♥
mybatis♥
junit
log4j
2. 创建user数据表
3. 编写User实体类
id,username,password
4. 编写映射文件UserMapper.xml
- 内容:描述sql语句
- 位置:resources/com.itheima.mapper/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>
<!--添加组件-->
</mapper>
- 配置mapper组件:
- resultType:返回结果集类型
- namespace:命名空间
- parameterType:传入参数类型
<mapper namespace="userMapper">
<!--删除操作-->
<delete id="delete" parameterType="int">
delete from user where id=#{abc}
</delete>
<!--修改操作-->
<update id="update" parameterType="com.itheima.domain.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
<!--插入操作-->
<insert id="save" parameterType="com.itheima.domain.User">
insert into user values(#{id},#{username},#{password})
</insert>
<!--根据id进行查询-->
<select id="findById" resultType="user" parameterType="int">
select * from user where id=#{id}
</select>
</mapper>
5. 编写核心文件SqlMapConfig.xml
- 位置:resources/SqlMapConfig.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>
<!--添加组件-->
</configuration>
- 配置组件:
<!--通过properties标签加载外部properties文件-->
<properties resource="jdbc.properties"></properties>
<!--数据源环境:-->
<environments default="developement">
<environment id="developement">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="com/itheima/mapper/UserMapper.xml"></mapper>
</mappers>
- jdbc.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
6. 编写测试类
- 位置:MyBatisTest.class
- 测试方法:test1()
@Test
//查询操作
public void test1() throws IOException {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session回话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace+id
List<User> userList = sqlSession.selectList("userMapper.findAll");
//打印数据
System.out.println(userList);
//释放资源
sqlSession.close();
}
7. 测试:执行test1()
三. 添加增删改功能
1. 插入操作
添加mapper
插入的标签:insert
parameterType:插入的指定类型,测试方法中已封装好的user对象
#{实体属性名}:实体的属性名
<insert id="save" parameterType="com.itheima.domain.User">
insert into user values(#{id},#{username},#{password})
</insert>
添加测试类
插入api:sqlSession.insert(“命名空间”,实体对象)
mybatis若要执行update操作,需要通过会话对象sqlSession对象来提交事务:sqlSession.commit();
public void test2() throws IOException {
//模拟user对象,先将数据封装成user对象,方便传入mapper
User user = new User();
user.setUsername("xxx");
user.setPassword("abc");
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session回话对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//执行操作 参数:namespace+id
sqlSession.insert("userMapper.save",user);
//mybatis执行更新操作 提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
2. 修改操作
添加mapper
插入的标签:update
parameterType:插入的指定类型,测试方法中已封装好的user对象
#{实体属性名}:实体的属性名
<update id="update" parameterType="com.itheima.domain.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
添加测试类
修改api:sqlSession.update(“命名空间”,实体对象)
mybatis若要执行update操作,需要通过会话对象sqlSession对象来提交事务:sqlSession.commit();
@Test
//修改操作
public void test3() throws IOException {
//模拟user对象
User user = new User();
user.setId(7);
user.setUsername("lucy");
user.setPassword("123");
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session回话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace+id
sqlSession.update("userMapper.update",user);
//mybatis执行更新操作 提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
3. 删除操作
添加mapper
删除的标签:delete
parameterType:(根据id删除,故传入的参数为id),即int类型,
#{名称}:只有一个参数时,名称可任意写。方便可读性,故写id
<delete id="delete" parameterType="int">
delete from user where id=#{abc}
</delete>
添加测试类
删除api:sqlSession.delete(“命名空间.id”,参数); 参数为条件
@Test
//删除操作
public void test4() throws IOException {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session回话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace+id
sqlSession.delete("userMapper.delete",8);
//mybatis执行更新操作 提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
四. MyBatis的API(测试方法使用)
如何执行mapper方法:
-
1.获得核心配置文件:
- InputStream resourceAsStream = Resources.getResourceAsStream(“sqlMapConfig.xml”);
- Resources为工具类,在ibatis.io包中,帮助加载资源文件
-
2.获得session工厂对象
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
-
3.获得session会话对象
- SqlSession sqlSession = sqlSessionFactory.openSession();
- 注:创建SqlSession实例,有两个方法
openSession():默认开启一个事务,但不会自动提交。需要手动提交事务:commit()
openSession(boolean autoCommit):参数为true时,自动提交事务
-
4.执行findAll
- sqlSession.select(“userMapper.findAll”);
-
5.关闭sqlSession
- sqlSession.close();
MyBatis的DAO实现
1.传统方式
- UserDao或叫UserMapper
- UserMapperImpl
- 在配置文件添加sql操作标签
- UserService创建main()测试
2.代理开发方式
- 介绍:只需要编写Mapper(Dao)接口,由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体即之前的MapperImpl的方法体。相当于xml文件中的mapper标签即MpperImpl。
- 要求:
- 限定名:Mapper.xml文件中的namespace与mapper接口的全限定名相同
- 方法名:Mapper.xml文件定义的每个statement的id与mapper接口的全方法名相同
- 输入参数:Mapper.xml文件中定义的每个sql的parameterType的类型与mapper接口输入参数类型相同。(User的集合与User也可以对应)
- 返回值:Mapper.xml文件中定义的每个sql的resultType的类型与mapper接口的返回值相同
- 代理测试:
执行操作分为两步:1.获取mapper对象,2.利用mapper执行操作
@Test
//查询操作
public void test1() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//List<User> userList = sqlSession.selectList("userMapper.findAll");
//换成代理方式
//1.获取mapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//2.执行操作
List<User> userList = userMapper.findAll();
System.out.println(userList);
sqlSession.close();
}