MyBatis - 01简介入门
(1)原始jdbc 操作
(1.1)查询操作
@Test public void testSelect() throws SQLException, ClassNotFoundException { // 注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 获得连接 Connection connection = DriverManager.getConnection("jdbc:mysql:///dev", "root", "Mysql2020"); // 获得statement PreparedStatement statement = connection.prepareStatement("select id, username, password from user"); // 执行查询 ResultSet resultSet = statement.executeQuery(); // 遍历结果集 while(resultSet.next()){ // 封装实体 User user = new User(); user.setId(resultSet.getInt("id")); user.setUsername(resultSet.getString("username")); user.setPassword(resultSet.getString("password")); System.out.println(user); } // 释放资源 resultSet.close(); statement.close(); connection.close(); }
(1.2)插入操作
@Test public void testInsert() throws SQLException, ClassNotFoundException { User user = new User(); user.setUsername("jerry"); user.setPassword("2020"); Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql:///dev", "root", "Mysql2020"); PreparedStatement statement = connection.prepareStatement("insert into user(username,password)values (?,?)"); // 设置占位符参数 statement.setString(1, user.getUsername()); statement.setString(2, user.getPassword()); statement.executeUpdate(); statement.close(); connection.close(); }
(1.3)原始jdbc开发存在的问题
① 数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。
② sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能性较大,sql变动需要改变java代码。
③ 查询操作时,需要手动将结果集中的数据手动封装到实体中。插入操作时,需手动将实体的数据设置到sql语句的占位符位置。
(1.4)上述问题的解决方案
① 使用数据库连接池初始化连接资源
② 将sql语句抽取到xml配置文件中
③ 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射
(2)MyBatis简介
> mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,
而不需要花费精力去处理 加载驱动、创建连接、创建statement等繁杂的过程。
> mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。
> mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,
屏蔽了jdbc api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。
(3)MyBatis开发入门
(3.1)引入mybatis坐标
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.43</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
(3.2)创建数据库表
CREATE TABLE `user` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(20) NULL DEFAULT NULL, `password` VARCHAR(20) NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB AUTO_INCREMENT=1 ;
(3.3)创建实体类
public class User { private int id; private String username; private String password; // 省略其他代码 }
(3.4)创建Mapper.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.bearpx.spring.mybatis.domain.User"> select * from user </select> </mapper>
(3.5)编写核心文件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"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/dev"/> <property name="username" value="root"/> <property name="password" value="Mysql2020"/> </dataSource> </environment> </environments> <!--加载映射文件--> <mappers> <mapper resource="mapper/UserMapper.xml"></mapper> </mappers> </configuration>
(3.6)测试
@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(); }
[User{id=1, username='zhangsan', password='123'}, User{id=2, username='lisi', password='456'}]