内容:
对原生态jdbc程序(单独使用jdbc开发)进行问题总结
mybatis框架原理(掌握)
mybatis入门程序:用户的增,删,改,查
mybatis开发dao的两种方法:
原始dao开发方法(程序需要编写dao接口和dao实现类)
mybatis特有的mapper接口(相当于dao接口)代理开发方法(掌握)
mybatis配置文件SqlMapConfig.xml
mybatis核心:
mybatis输入映射(掌握)
mybatis输入映射(掌握)
mybatis的动态sql(掌握)
1.对原生态jdbc程序中问题总结
需求:使用jdbc查询mysql数据库中用户表的记录
架包:
代码:
存在的问题:package com.neusoft; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class JDBCTest { public static void main(String[] args) { // 数据库连接 Connection connection = null; // 预编译的statement,好处是提高数据库的性能 PreparedStatement preparedStatement = null; //创建结果集 ResultSet resultset = null; try { // 记载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 通过驱动管理类来获取数据库连接 connection = DriverManager .getConnection( "jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8", "root", "123"); // 定义sql语句,?表示占位符 String sql = "select * from users where username=?"; // 获取预处理statement preparedStatement = connection.prepareStatement(sql); // 为占位符赋值 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) { e.printStackTrace(); } } } } }
1.数据库连接使用时创建,不使用立即释放,对数据库访问频繁访问,导致数据库资源浪费,影响了数据库的性能。
解决方案:使用数据库的连接池来管理数据库连接。
2.将sql语句硬编译到java代码中,如果sql语句修改,需要重新编译到Java代码中,不利于系统维护。
解决方案:将sql语句配置到xml配置文件中,即使sql变化,也不需要对Java代码重新编译。
3.向preparedStatement中设置参数,对占位符位置的硬编码。
解决方案:将参数,占位符等信息也配置到xml文件中去。
4.从resultset中遍历对象时,将获取的数据硬编码,不利于系统维护。
解决方案:将查询的结果集自动映射成Java对象。
2.mybatis框架原理
mybatis是持久层的框架,是apache下的顶级项目。
mybatis让程序员将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足需求的sql语句(半自动化)。
mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活的映射出Java对象(输出映射)。
框架图:
流程:
先定义mybatis的 全局配置文件,再根据配置文件创建我们的工厂,之后再创建相应的会话,接着要做的就是执行数据库,主要是通过底层封装对象来操作MySQL。
3.入门程序
需求:
根据用户id(主键)查询用户信息
根据用户名称模糊查询用户信息
添加用户
删除用户
更新用户
mybatis的架包:
整个目录结构:
log4j.properties:
#在开发环境下debug模式,在生产环境下info模式 log4j.rootLogger=DEBUG,Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.org.apache=INFO
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> <!-- 和spring整合后environments的配置将移除 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理,事务控制由mybatis --> <transactionManager type="JDBC" /> <!-- 数据库连接池,由mybatis管理 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> <property name="username" value="root" /> <property name="password" value="123" /> </dataSource> </environment> </environments> </configuration>
<!-- 和spring整合后environments的配置将移除 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理,事务控制由mybatis --> <transactionManager type="JDBC" /> <!-- 数据库连接池,由mybatis管理 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> <property name="username" value="root" /> <property name="password" value="123" /> </dataSource> </environment> </environments> </configuration>
第一个功能(根据id查询用户信息):
映射文件:Users.xml(原始的ibatis的命名方式)
<?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命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理开发,namespace就有特殊的作用 --> <mapper namespace="test"> <!-- 在映射文件中配置很多的SQL语句 通过select来执行数据库的查询 id:就是用来标识配置文件的SQL,可以称为statement的id,将来会将SQL语句封装在mapperStatment对象中 parameterType:输入参数的类型 resultType:输出参数的类型 #{}:一个占位符 #{id}:其中的id为输入的参数 --> <select id="findUserById" parameterType="int" resultType="com.neusoft.vo.Users"> select * from users where id=#{id} </select> </mapper>
注意要在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> <!-- 和spring整合后environments的配置将移除 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理,事务控制由mybatis --> <transactionManager type="JDBC" /> <!-- 数据库连接池,由mybatis管理 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> <property name="username" value="root" /> <property name="password" value="123" /> </dataSource> </environment> </environments> <!-- 加载映射文件 --> <mappers> <mapper resource="map/Users.xml"></mapper> </mappers> </configuration>
<!-- 加载映射文件 --> <mappers> <mapper resource="map/Users.xml"></mapper> </mappers> </configuration>
加入一个junit4.9.jar,进行单元测试:
测试代码如下:
package com.neusoft.test; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import com.neusoft.vo.Users; public class MybatisTest { @Test public void findUserByIdTest() throws IOException{ //mybatis配置文件 String resource="SqlMapConfig.xml"; //得到配置文件流 InputStream inputStream=Resources.getResourceAsStream(resource); //创建会话工厂 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //通过工厂得到SqlSession SqlSession sqlSession=sqlSessionFactory.openSession(); //通过SqlSession操作数据库 //第一个参数是映射文件中的sql的id,第二个输入参数 Users users=sqlSession.selectOne("test.findUserById", 1); System.out.println(users); //释放资源 sqlSession.close(); } }