文章目录
1 为什么学Mybatis?
2 JDBC编程回顾与存在的问题分析
2.1 开发步骤
2.2 Jdbc访问数据库的过程
2.3 Jdbc存在的问题
3 Mybatis介绍
4 Mybatis入门
4.1 需求列表
4.2 工程搭建
4.3 完成需求
4.3.1 完成需求步骤
4.3.2 根据用户ID查询用户信息
4.3.2.1 映射文件与sql
4.3.2.2 MyBatis访问数据库代码
4.3.3 抽取SqlSessionFactoryUtils工具类,共享SqlSessionFactory创建过程
4.3.4 根据用户名查找用户列表
4.3.4.1 映射文件与sql
4.3.4.2 MyBatis访问数据库代码
4.3.5 添加用户
4.3.5.1 映射文件与sql
4.3.5.2 MyBatis访问数据库代码
4.3.5.3 Mysql自增返回
4.3.6 修改用户
4.3.7 删除用户
4.4 Mybatis入门小结与Mybatis架构图
1.为什么学Mybatis?
- 目前最主流的持久层框架为hibernate与mybatis,而且国内目前情况使用Mybatis的公司比hibernate要多。
- Hibernate学习门槛不低,要精通门槛更高。门槛高在怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate缓存与数据加载策略方面需要你的经验和能力都很强才行。国内目前前的情况精通hibernate技术大牛非常少。
- sql优化方面,Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。当然了,Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。说得更深入一些,如果有个查询要关联多张表,比如5张表,10张表时,而且,我们要取的字段只是其中几张表的部分字段。这时用hibernate时就会显得非常力不从心。就算用hibernate的sqlquery,后续的维护工作也会让人发狂。
2.JDBC编程回顾与存在的问题分析
2.1 开发步骤
- 导入数据脚本
- 创建工程,导入mysql的jar包
- 编写代码
2.2 JDBC访问数据库过程
- 加载数据库驱动
- 创建数据库连接
- 创建statement
- 设置sql语句
- 设置查询参数
- 执行查询,得到ResultSet
- 解析结果集ResultSet
- 释放资源
2.3 JDBC存在的问题
- 多次创建和打开、关闭数据库连接、消耗大量资源
- SQL语句存在硬编码,不利于维护
- SQL参数设置硬编码,不利于维护
- 结果集获取与遍历复杂,存在硬编码,不利于维护
3.Mybatis 介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
Mybatis是面向sql的持久层框架,他封装了jdbc访问数据库的过程,我们开发,只需专注于sql语句本身的拼装,其它复杂的过程全部可以交给mybatis去完成。
4.Mybatis 入门
4.1 Mybatis 需求列表
- 根据用户ID查询用户信息
- 根据用户名查找用户列表
- 添加用户
- 修改用户
- 删除用户
4.2 Mybatis 工程搭建
-
导入依赖jar包
-
配置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>
<!--环境配置-->
<!--默认环境-->
<environments default="development">
<!--mysql环境-->
<environment id="development">
<!--JDBC事务-->
<!-- 使用JDBC管理事务-->
<transactionManager type="JDBC"/>
<!--POOLED连接池-->
<!--数据库连接池 -->
<dataSource type="POOLED">
<!--四大参数-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_01?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
- 配置log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
- 复制pojo到工程目录下(pojo下有两个java类。User和Order类)这里就直接把写好的类复制进去了,资源链接
链接:https://pan.baidu.com/s/1_d3sateMC92c2qTIyIdwEQ
提取码:hpwm
-
配置sql查询的映射文件
-
加载映射文件,在SqlMapConfig.xml中添加
<!-- 加载映射文件-->
<mappers>
<mapper resource="user.xml"/>
</mappers>
4.3 完成需求
4.3.1 需求完成步骤
- 编写SQL语句
- 配置user映射文件
- 编写测试程序
4.3.2 根据用户ID查询用户信息
4.3.2.1 映射文件与SQL
user.xml里添加
<!-- id:statementId
resultType:查询结果集的数据类型
parameterType:查询的入参
-->
<select id="getUserById" parameterType="int" resultType="com.lpp.mybatis.pojo.User" >
SELECT * FROM USER WHERE id = #{id1}
</select>
4.3.2.2 MyBatis访问数据库代码
测试
@Test
public void testGetUserById() throws IOException {
// 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
// 查找配置文件创建输入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 加载配置文件,创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sfb.build(inputStream);
// 创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询,参数一:要查询的statementId ,参数二:sql语句入参
User user = sqlSession.selectOne("user.getUserById", 2);
// 输出查询结果
System.out.println(user);
// 释放资源
sqlSession.close();
}
4.3.3 抽取SqlSessionFactoryUtils工具类,共享SqlSessionFactory创建过程
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
// 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
try {
// 查找配置文件创建输入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 加载配置文件,创建SqlSessionFactory对象
sqlSessionFactory = sfb.build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
4.3.4 根据用户名查找用户列表
4.3.4.1 映射文件与sql
user.xml里添加
<!-- resultType:如果要返回数据集合,只需设定为每一个元素的数据类型 -->
<select id="getUserByName" parameterType="string" resultType="com.lpp.mybatis.pojo.User">
SELECT * FROM USER WHERE username LIKE #{name}
</select>
4.3.4.2 MyBatis访问数据库代码
测试
@Test
public void getUserByName() {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
List<User> users = sqlSession.selectList("user.getUserByName", "%张%");
for (User user : users) {
System.out.println(user);
}
// 释放资源
sqlSession.close();
}
4.3.5 添加用户
4.3.5.1 映射文件与sql
user.xml里添加
<!-- 插入用户-->
<!-- useGeneratedKeys:使用自增,keyProperty与之配套使用,这里是user的主键-->
<insert id="insertUser" parameterType="pojo.User" useGeneratedKeys="true" keyProperty="id">
insert into user(username,birthday,sex,address)values ( #{username},#{birthday},#{sex},#{address});
</insert>
4.3.5.2 MyBatis访问数据库代码
测试
@Test
public void testInsertUser(){
SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
User user=new User();
user.setUsername("Linda");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("浙江宁波");
sqlSession.insert("User.insertUser",user);
//提交事务
sqlSession.commit();
sqlSession.close();
}
4.3.5.3 Mysql自增返回
<!-- useGeneratedKeys:标识插入使用自增id
keyProperty:与useGeneratedKeys配套使用,用于绑定主键接收的pojo属性
-->
<insert id="insertUserKey" parameterType="com.lpp.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
<!-- selectKey:用于配置主键返回
keyProperty:要绑定的pojo属性
resultType:属性数据类型
order:指定什么时候执行,AFTER之后
-->
<!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey> -->
insert into user(username,birthday,sex,address)values ( #{username},#{birthday},#{sex},#{address});
</insert>
4.3.6 修改用户
user.xml里添加
<!--更新用户-->
<update id="updateUser" parameterType="pojo.User">
update user set username =#{username} where id=#{id};
</update>
测试
@Test
public void testUpdate(){
SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
User user=new User();
user.setId(31);
user.setUsername("张婉清");
//user.setSex("2");
// user.setAddress("上海");
sqlSession.update("User.updateUser",user);
sqlSession.commit();
sqlSession.close();
}
4.3.7 删除用户
user.xml里添加
<!-- 删除用户-->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
测试
@Test
public void testDeleteUser(){
SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
User user=new User();
user.setId(30);
sqlSession.delete("User.deleteUser",user);
sqlSession.commit();
sqlSession.close();
}
注:user.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">
<!--namespace命名空间-->
<mapper namespace="User">
<select id="getUserById" parameterType="int" resultType="com.lpp.mybatis.pojo.User">
SELECT id,username,birthday,sex,address FROM user where id=#{id};
</select>
<!--如果返回结果为集合:只需设置为每一个的数据类型-->
<select id="getUserByUserName" parameterType="String" resultType="com.lpp.mybatis.pojo.User">
SELECT id,username,birthday,sex,address FROM user WHERE username LIKE #{name};
</select>
<!-- 插入用户-->
<!-- useGeneratedKeys:使用自增,keyProperty与之配套使用,这里是user的主键-->
<insert id="insertUser" parameterType="com.lpp.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
insert into user(username,birthday,sex,address)values ( #{username},#{birthday},#{sex},#{address});
</insert>
<!--更新用户-->
<update id="updateUser" parameterType="com.lpp.mybatis.pojo.User">
update user set username =#{username} where id=#{id};
</update>
<!-- 删除用户-->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
</mapper>
我使用的工具是IDEA,把jar包放到lib下lib文件夹下,并导入到项目中