原生JDBC的设计缺陷
原生JDBC开发存在许多问题:
1)频繁创建/释放数据库连接,造成资源浪费
2)sql语句和java代码是耦合死的,这种硬编码不利于后期维护
3)查询操作时,需要手动将结果集的数据封装到实体中;插入操作时,需要手动将实体的数据一个个传给sql语句的占位符
上述问题都有对应的解决方案:
1)使用数据库连接池
2)sql语句抽取到配置文件中,从而解耦
3)使用反射、内省等底层技术,将实体属性与表字段进行自动映射
什么是MyBatis
mybatis是一个优秀的基于java的持久层框架。它内部封装了jdbc,使得开发者只需关注sql语句本身,而不必花费精力去加载驱动、创建连接、创建statement等。
mybatis通过xml配置或注解配置,一方面,实现statement中占位符与java实体的动态映射,并形成一个完整的sql语句;另一方面,sql语句执行返回的结果集也同样通过动态映射,最终生成一个java实体。
MyBatis快速入门
开发步骤:
① 引入MyBatis相关坐标
② 编写User实体类
③ 编写映射文件(userMapper.xml)
④ 编写核心文件(sqlMapConfig.xml)
⑤ 测试
代码实现:
① 引入MyBatis相关坐标
<!-- 仅供参考 -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
② 编写User实体类
java">java.com.samarua.domain.User
-------------------------------------------------------------------------------------------
public class User {
private int id;
private String username;
private String password;
//...
}
③ 编写映射文件(userMapper.xml)
path: resources.com.samarua.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 namespace="userMapper">
<select id="findAll" resultType="com.samarua.domain.User">
select * from user
</select>
</mapper>
④ 编写核心文件(sqlMapConfig.xml)
path: 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>
<!-- 数据源环境 -->
<environments default="test">
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/loliDB"/>
<property name="username" value="root"/>
<property name="password" value="20006212000d"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="com/samarua/mapper/userMapper.xml"/>
</mappers>
</configuration>
⑤ 测试
java">public class MyBatisTest {
@Test
public void test1() throws IOException {
// 加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
// 获得会话工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获得会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行sql语句(参数:namespace+id)
List<User> userList = sqlSession.selectList("userMapper.findAll");
// 打印结果
System.out.println(userList);
// 释放资源
sqlSession.close();
}
}
MyBatis增删改查
1)parameterType=传入实体/参数的类型,resultType=返回查询结果的类型
2)占位符为#{传入实体的属性名}
;如果传入的是不是实体类型而是普通参数类型Interger,String…则{}内写什么都行
3)除了查询操作,增/删/改操作均需要手动提交事务————sqlSession.commit()
<!-- userMapper.xml -->
<!-- 约束头略 -->
<mapper namespace="userMapper">
<!-- 增 -->
<insert id="save" parameterType="com.samarua.domain.User">
insert into user values(#{id}, #{username}, #{password})
</insert>
<!-- 删 -->
<delete id="delete" parameterType="java.lang.Integer">
delete from user where id = #{id}
</delete>
<!-- 改 -->
<update id="update" parameterType="com.samarua.domain.User">
update user set username = #{username}, password = #{password} where id = #{id}
</update>
<!-- 查 -->
<select id="findAll" resultType="com.samarua.domain.User">
select * from user
</select>
</mapper>
java">// 不难看出,传入的参数对应parameterType,返回的结果对应resultType
sqlSession.insert("userMapper.save", user);
sqlSession.delete("userMapper.delete", 3);
sqlSession.update("userMapper.update", user);
List<User> userList = sqlSession.selectList("userMapper.findAll");
More >_<