3.MyBatis的映射文件概述
3.1 概述
3.2 在用户的映射配置文件中配置
resultType 属性:
用于指定结果集的类型。
parameterType 属性:
用于指定传入参数的类型。
sql 语句中使用#{}字符:
它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。 具体的数据是由#{}里面的内容决定的。
4.增删改查
1. 添加
user对象的值
参数类型 parameterType
<!-- 插入数据-->
<insert id="save" parameterType="cn.xiaozhi0802.bean.User">
insert into user value (#{wxy_id},#{wxy_username},#{wxy_password})
</insert>
@Test
public void test3() throws IOException {
//模拟User
User user = new User();
user.setWxy_username("tom");
user.setWxy_password("abc");
//获取核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获取session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作
int i = sqlSession.insert("userMapper.save", user);
List<User> userList = sqlSession.selectList("userMapper.findAll");
//mybatis执行更新操作 提交事务
sqlSession.commit();
//打印
System.out.println(i);
System.out.println(userList);
// 释放资源
sqlSession.close();
}
注意事项:
2. 修改
<!-- 修改-->
<update id="update" parameterType="cn.xiaozhi0802.bean.User">
update user set wxy_username=#{wxy_username},wxy_password=#{wxy_password} where wxy_id=#{wxy_id}
</update>
@Test
public void test4() throws IOException {
//模拟User
User user = new User();
user.setWxy_id(4);
user.setWxy_username("tom2");
user.setWxy_password("abc");
//获取核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获取session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作
int i = sqlSession.update("userMapper.update", user);
List<User> userList = sqlSession.selectList("userMapper.findAll");
//mybatis执行更新操作 提交事务
sqlSession.commit();
//打印
System.out.println(i);
System.out.println(userList);
// 释放资源
sqlSession.close();
}
注意问题:
3. 删除
<!-- 删除-->
<delete id="delete" parameterType="java.lang.Integer">
delete from user where wxy_id=#{id}
</delete>
@Test
public void test5() throws IOException {
//获取核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获取session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作
sqlSession.delete("userMapper.delete",4);
List<User> userList = sqlSession.selectList("userMapper.findAll");
//mybatis执行更新操作 提交事务
sqlSession.commit();
//打印
System.out.println(userList);
// 释放资源
sqlSession.close();
}
注意事项:
5. 新增用户 id 的返回值
//IUserDao.xml
<insert id="saveUser" parameterType="cn.xiaozhi0802.bean.Users">
<!--查询保存之后的id值 keyProperty="id"对应Users的属性 keyColumn="id"对应数据库中的属性 order="AFTER"插入后执行-->
<selectKey keyProperty="id" keyColumn="id" resultType="Integer" order="AFTER">
select last_insert_id()
</selectKey>
insert into user (username, password,name) values(#{username},#{password},#{name});
</insert>
@Test
public void test2() throws IOException {
Users user = new Users();
user.setName("王麒");
user.setPassword("root");
user.setUsername("root");
userDao.saveUser(user);
System.out.println(user.getId());
}
//结果
0:16:53,612 DEBUG saveUser:143 - ==> Preparing: insert into user (username, password,name) values(?,?,?);
10:16:53,649 DEBUG saveUser:143 - ==> Parameters: root(String), root(String), 王麒(String)
10:16:53,732 DEBUG saveUser:143 - <== Updates: 1
10:16:53,733 DEBUG saveUser!selectKey:143 - ==> Preparing: select last_insert_id()
10:16:53,733 DEBUG saveUser!selectKey:143 - ==> Parameters:
10:16:53,867 DEBUG saveUser!selectKey:143 - <== Total: 1
15
10:16:53,868 DEBUG JdbcTransaction:69 - Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@776b83cc]
6. 用户模糊查询
//UserDao.java
/**
* 根据姓名模糊查询
* @param name
* @return
*/
List<Users> findByNames(String name);
<!-- UserDao.xml-->
<!--根据姓名模糊查询-->
<select id="findByNames" parameterType="string" resultType="cn.xiaozhi0802.bean.Users">
select * from user where name like #{name}
</select>
// 测试
@Test
public void test6() throws IOException {
List<Users> names = userDao.findByNames("%王%");
for (Users u : names) {
System.out.println(u);
}
}
6. Mybatis 与 JDBC 编程的比较
-
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。 解决: 在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。
-
Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。 解决: 将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。
-
向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数对应。 解决: Mybatis 自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的 类型。
-
对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对 象解析比较方便。 解决: Mybatis 自动将 sql 执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的 类型。
7.MyBatis核心配置文件概述
MyBatis核心配置文件的层级关系
1 environments标签
2 mappers标签
<mapper resource=" " />
使用相对于类路径的资源
如:<mapper resource="cn/xiaozhi/dao/IUserDao.xml" />
<mapper class=" " />
使用 mapper 接口类路径
如:<mapper class="com.itheima.dao.UserDao"/>
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
<package name=""/>
注册指定包下的所有 mapper 接口
如:<package name="cn.itcast.mybatis.mapper"/>
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
3 Properties标签
<!-- 通过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>
4 typeAliases标签
<!-- 定义别名-->
<typeAliases>
<typeAlias type="cn.xiaozhi0802.bean.User" alias="user"></typeAlias>
</typeAliases>
<!--在 SqlMapConfig.xml 中配置:-->
<typeAliases>
<!-- 单个别名定义 -->
<typeAlias alias="user" type="com.itheima.domain.User"/>
<!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) -->
<package name="com.itheima.domain"/>
<package name="其它包"/>
</typeAliases>
总结