MyBatis框架之快速入门

1.JDBC编程分析
	public static void main(String[] args) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		try {
			//加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			//通过驱动管理类获取数据库链接
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "ro ot", "root");
			//定义 sql 语句 ?表示占位符
			String sql = "select * from user where usern
			//获取预处理 statement
			preparedStatement = connection.prepareStatement(sql);
			//设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的
			preparedStatement.setString(1, "王五");
			//向数据库发出 sql 执行查询,查询出结果集
			resultSet = preparedStatement.executeQuery();
			//遍历查询结果集
			while(resultSet.next()) {
				System.out.println(resultSet.getString("id") + ""+resultSet.getString("username "));
				}
			} catch(Exception e) {
				e.printStackTrace();
			} finally {
				//释放资源
				if(resultSet != null) {
					try {
						resultSet.close();
					} catch(SQLException e) {
						e.printStackTrace();
					}
				}
				if(preparedStatement != null) {
					try {
						preparedStatement.close();
					} catch(SQLException e) {
						e.printStackTrace();
					}
				}
				if(connection != null) {
					try {
						connection.close();
					} catch(SQLException e) {
						// TODO Auto-generated catch block e.printStackTrace();
					}
				}
			}
		}
	}
  • jdbc问题分析:
  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

  2. Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。

  3. 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。

  4. 对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。

  5. 持久层技术解决方案

    1. JDBC技术:
      Connection
      PreparedStatement
      ResultSet
    2. Spring的JdbcTemplate:
      Spring中对jdbc的简单封装
    3. Apache的DBUtils:
      它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装

    以上这些都不是框架
    JDBC是规范
    Spring的JdbcTemplate和Apache的DBUtils都只是工具类

2.MyBatis框架快速入门
  1. MyBatis 框架概述
    • mybatis是一个持久层框架,用java编写的。
    • 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程
    • 它使用了ORM思想实现了结果集的封装。
      ORM:
      Object Relational Mappging 对象关系映射
      简单的说:
      就是把数据库表和实体类及实体类的属性对应起来
      让我们可以操作实体类就实现操作数据库表。
    • mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。
  2. 搭建 Mybatis 开发环境
    1. 创建 maven 工程
    <dependencies>
    	<dependency>
    		<groupId>org.mybatis</groupId>
    		<artifactId>mybatis</artifactId>
    		<version>3.4.5</version>
    	</dependency>
    	<dependency>
    		<groupId>junit</groupId>
    		<artifactId>junit</artifactId>
    		<version>4.10</version>
    		<scope>test</scope>
    	</dependency>
    	<dependency>
    		<groupId>mysql</groupId>
    		<artifactId>mysql-connector-java</artifactId>
    		<version>5.1.6</version>
    		<scope>runtime</scope>
    	</dependency>
    	<dependency>
    		<groupId>log4j</groupId>
    		<artifactId>log4j</artifactId>
    		<version>1.2.12</version>
    	</dependency>
    </dependencies>
    
    1. 编写 User 实体类
    public class User implements Serializable {
    	private Integer id;
    	private String username;
    	private Date birthday;
    	private String sex;
    	private String address;
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getUsername() {
    		return username;
    	}
    	public void setUsername(String username) {
    		this.username = username;
    	}
    	public Date getBirthday() {
    		return birthday;
    	}
    	public void setBirthday(Date birthday) {
    		this.birthday = birthday;
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    	public String getAddress() {
    		return address;
    	}
    	public void setAddress(String address) {
    		this.address = address;
    	}
    	@Override
    	public String toString() {
    		return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", address=" + address + "]";
    	}
    }
    
    1. 编写持久层接口 IUserDao
    //IUserDao 接口就是我们的持久层接口(也可以写成 UserDao 或者 UserMapper),
    //用户的持久层接口
    public interface IUserDao {
    	/**
    	 * 查询所有用户
    	 * @return
    	 */
    	List < User > findAll();
    }
    
    1. 编写持久层接口的映射文件 IUserDao.xml
      要求:
      创建位置:必须和持久层接口在相同的包中。
      名称:必须以持久层接口名称命名文件名,扩展名是.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="com.itheima.dao.IUserDao">
    	<!-- 配置查询所有操作 -->
    	<select id="findAll" resultType="com.itheima.domain.User"> select * from user </select>
    </mapper>
    
    1. 编写 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>
    	<!-- 配置 mybatis 的环境 -->
    	<environments default="mysql">
    		<!-- 配置 mysql 的环境 -->
    		<environment id="mysql">
    			<!-- 配置事务的类型 -->
    			<transactionManager type="JDBC"></transactionManager>
    			<!-- 配置连接数据库的信息:用的是数据源(连接池) -->
    			<dataSource type="POOLED">
    				<property name="driver" value="com.mysql.jdbc.Driver" />
    				<property name="url" value="jdbc:mysql://localhost:3306/ee50" />
    				<property name="username" value="root" />
    				<property name="password" value="1234" /> </dataSource>
    		</environment>
    	</environments>
    	<!-- 告知 mybatis 映射配置的位置 -->
    	<mappers>
    		<mapper resource="com/itheima/dao/IUserDao.xml" /> </mappers>
    </configuration>
    
    1. 编写测试类
    public class MybatisTest {
    	public static void main(String[] args) throws Exception {
    		//1.读取配置文件
    		InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
    		//2.创建 SqlSessionFactory 的构建者对象
    		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    		//3.使用构建者创建工厂对象 SqlSessionFactory
    		SqlSessionFactory factory = builder.build( in );
    		//4.使用 SqlSessionFactory 生产 SqlSession 对象
    		SqlSession session = factory.openSession();
    		//5.使用 SqlSession 创建 dao 接口的代理对象
    		IUserDao userDao = session.getMapper(IUserDao.class);
    		//6.使用代理对象执行查询所有方法
    		List < User > users = userDao.findAll();
    		for(User user: users) {
    			System.out.println(user);
    		}
    		//7.释放资源
    		session.close(); in .close();
    	}
    }
    
    分析
3.基于注解的 MyBatis 使用
  1. 在持久层接口中添加注解

    public interface IUserDao {
    	/**
    	 * 查询所有用户
    	 * @return
    	 */
    	@
    	Select("select * from user")
    	List < User > findAll();
    }
    
  2. 修改 SqlMapConfig.xml

    <!-- 告知 mybatis 映射配置的位置 -->
    <mappers>
    <mapper class="com.itheima.dao.IUserDao"/>
    </mappers>
    
  3. 移除 xml 的映射配置(IUserDao.xml)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值