目标: 利用Mybatis实现增删改查
Mybatis官方文档: http://www.mybatis.org/mybatis-3/zh/index.html
一、动态代理方式—proxy
1.1 编写核心配置文件–SqlMapConfig.xml
<!-- 配置所有的sql映射文件 -->
<mappers>
<mapper resource="UserMapper.xml"></mapper>
</mappers>
1.2 接口 UserDao
这里定义所有实现增删改查的方法。
1.3 编写 XxxMap.xml 文件
- 此为映射文件, 需要在这个文件中编写sql的增删改查。
-
- 命名空间:命名空间的值为dao层接口的全限定名。
- id:id的值为dao层接口内的方法名称。
<mapper namespace="">
</mapper>
1.4 测试类–TestMybatis
- 解析核心配置文件-- SqlMapConfig.xml
- 实现接口UserDao中的方法
private SqlSessionFactory sessionFactory;
@Before
public void init() throws IOException {
//创建 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//解析核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
sessionFactory = sqlSessionFactoryBuilder.build(is);
}
SqlSession sqlSession = sessionFactory.openSession();
//创建dap接口的实现类
UserDao dao = sqlSession.getMapper(UserDao.class);
1.5 查询–select
1.5.1 UserMapper.xml文件中编写sql语句
- resultType: 设置返回值的类型(与UserDao接口中的方法对应)
- pojo对象(java对象): 全限定名
查询表中的所有数据
<--查询表中的所有数据-->
<select id="findAll" resultType="com.domain.User">
SELECT * FROM USER ;
</select>
根据id查询用户信息
<!--根据id查询用户信息-->
<select id="findUserById" parameterType="int" resultType="com.domain.User">
SELECT * from user WHERE id = #{id} ;
</select>
模糊查询
- 拼接符:${}
-
- pojo对象(java对象):#{pojo对象中的属性名}
-
- 基本数据类型和String:
-
-
- ${value} - value为固定值
-
<select id="findUserByName" parameterType="com.domain.User"
resultType="com.domain.User">
SELECT * FROM USER WHERE username LIKE '%${username}%' ;
</select>
1.5.2 测试类–TestMybatis
- 创建 SqlSessionFactoryBuilder
- 解析核心配置文件
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//解析核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sessionFactory.openSession();
//创建dap接口的实现
UserDao dao = sqlSession.getMapper(UserDao.class);
- 查询所有用户信息
//调用方法
List<User> list=dao.findAll();
for (User user : list) {
System.out.println(user);
}
- 根据id查询用户信息
//调用方法
User userById = dao.findUserById(13);
//提交事务
sqlSession.commit();
sqlSession.close();
System.out.println(userById);
- 模糊查询
//调用方法
User user = new User();
user.setUsername("王");
List<User> userByName = dao.findUserByName(user);
//提交事务
sqlSession.commit();
sqlSession.close();
System.out.println(userByName);
1.6 添加用户–insert
1.6.1 UserMapper.xml
- parameterType:请求参数的类型
- ognl表达式 :
-
- 占位符:#{}
-
-
- pojo对象(java对象):#{pojo对象中的属性名}
-
- keyProperty:将返回值赋值给实体中id属性
- 添加完信息后,返回添加的id
-
- useGeneratedKeys: 获得最新生成的id(设置为true)
<insert id="addUser" parameterType="com.domain.User" keyProperty="id" useGeneratedKeys="true">
insert into user (username,sex,birthday,address)
values (#{username},#{sex},#{birthday},#{address}) ;
</insert>
1.6.2 测试类
- 创建 SqlSessionFactoryBuilder
- 解析核心配置文件
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//解析核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
sessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sessionFactory.openSession();
//创建dap接口的实现
UserDao dao = sqlSession.getMapper(UserDao.class);
因为上面的语句每次都会使用,所以将他们提取出来,到 1.4 中,下面的语句不再写。
- 方法testaddUser()实现添加
//调用方法
User user= new User();
user.setUsername("Saber");
user.setSex("女");
user.setBirthday(new Date());
user.setAddress("英灵之战");
//将信息封装到user实体中
dao.addUser(user);
//提交事务
sqlSession.commit();
sqlSession.close();
System.out.println("最新添加的id:"+user.getId());
}
-
注意:
-
- 将 提交事务 注掉,会出现下面这种状况,控制台显示添加成功
- 将 提交事务 注掉,会出现下面这种状况,控制台显示添加成功
-
- 但数据库却没有添加成功
- 但数据库却没有添加成功
1.7更新用户信息-update
1.7.1 xml文件
<update id="updateUser" parameterType="com.domain.User">
UPDATE user set sex = #{sex} WHERE id = #{id};
</update>
1.7.2 测试类
- testupdateUser()方法
//调用方法
User user = new User();
user.setSex("女");
user.setId(11);
int count = dao.updateUser(user);
//提交事务
sqlSession.commit();
sqlSession.close();
System.out.println("影响了:"+count);
1.8 删除–delete
1.8.1 xml文件
- parameterType:请求参数的类型
-
- pojo对象(java对象):全限定名
-
-
- 基本数据类型和string:包装类的全限定名或基本类型(不区分大小写)
-
<delete id="deleteUser" parameterType="com.domain.User">
DELETE FROM USER WHERE id= #{id};
</delete>
ps:可以将com.domain.User改成int
1.8.2 测试
- 调用testfindUserById()方法
//调用方法
User userById = dao.findUserById(13);
//提交事务
sqlSession.commit();
sqlSession.close();
System.out.println(userById);
二、用传统方式实现增删改查
2.1 UserMapper.xml
与上面的一样。
2.2 修改位置–UserDaoImpl,java
在dao层,新建UserDaoImpl.java 文件,实现User接口中的方法。
- 提取所有方法的共同点
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory factory){
this.sqlSessionFactory=factory;
}
//参数1:请求标识 namespace
//参数2:请求时的参数信息 (接口UserDao中的方法参数)
2.2.1 查询
查询所有用户信息
public List<User> findAll() {
//完成查询的所有信息,并将查询结果返回
SqlSession sqlSession = sqlSessionFactory.openSession();
//调用框架提供的方法完成查询所有用户信息
//参数1:请求标识 namespace
//参数2:请求时的参数信息
List<User> list = sqlSession.selectList("UserDaoImpl.findAll");
sqlSession.commit();
sqlSession.close();
return list;
}
查找指定id
- findUserById()方法
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession.selectOne("UserDaoImpl.findUserById", id);
模糊查询
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession.selectList("UserDaoImpl.findUserByName", user);
2.2.2 添加用户信息
sqlSession.insert("UserDaoImpl.addUser",user);
2.2.3 更新用户信息
SqlSession sqlSession = sqlSessionFactory.openSession();
int update = sqlSession.update("UserDaoImpl.updateUser",user);
事务提交
return update;
2.2.4 删除指定id
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("UserDaoImpl.deleteUser",id);
事务提交
2.3 测试类
与动态代理的测试类差不多,只是略有不同而已。
private SqlSessionFactory sessionFactory;
@Before
public void init() throws IOException {
//创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//解析核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
sessionFactory = sqlSessionFactoryBuilder.build(is);
}
- 以查询所有用户信息为例
UserDaoImpl userDao = new UserDaoImpl(sessionFactory);
//调用方法
List<User> list=userDao.findAll();
for (User user : list) {
System.out.println(user);
}
只需要实现UserDaoImpl对象,并将sessionFactory传入即可。
四、Sql映射文件的参数深入
4.1 parameterType
- 配置请求参数:
-
- Pojo对象:对象的全限定类名
基本数据类型或String:包装类型的全限定类名|基本数据类型名称,不区分大小写(int)
- Pojo对象:对象的全限定类名
4.2 resultType
- 描述返回值类型:
-
- Pojo对象:对象的全限定类名
-
- 基本数据类型或String :包装类型的全限定类名 | 基本数据类型的名称(int)
4.3 resultMap配置映射关系
- id:唯一标识
- type: 封装对象的 全限定类名
<resultMap id="userResultMap" type="cn.domain.User">
<id property="对象中的属性" column="字段名称">
<result property=”对象中的属性” column=”字段名称”>
</resultMap>
4.3 核心配置文件的配置方式
4.3.1 properties
- 引入外部的properties配置文件
-
- Resouce:properties文件的路径(相对路径)
- 使用properties文件中的内容
-
- ${properties文件中的key}
4.3.2 typeAliases
- < typeAlias > 设置别名
-
- Type:实体类的全限定名
-
- Alias:别名
- < package>: 统一对包下所有的实体类设置别名
-
- Name:包名
-
- 别名:当前类名(不区分大小写)
4.4 Mappers:
- 引入sql映射文件
- < mapper>: 引入sql映射文件
-
- Resource:sql映射文件的路径
- Class:dao接口的全限定类名(约定sql映射文件的位置和命名)
- < package> : 统一引入包下的所有映射文件
-
- Name:包名
<mappers>
<!-- 配置sql映射文件的路径 -->
<!--
mapper:
resource: sql映射文件的路径(相对路径)
-->
<!--<mapper resource="UserMapper.xml"></mapper>-->
<!--
约定:
sql映射文件的名称必须和接口名保持一致
sql映射文件的路径要和接口的路径保持一致
-->
<!--<mapper class="com.dao.UserDao"></mapper>-->
<package name="com.dao"></package>
</mappers>