MyBatis(简介):
MyBatis官网地址:http://www.mybatis.org/mybatis-3/
原始JDCB操作
1.原始JDBC操作(查询数据)
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获得链接
Connection connection=DriverManager.getConnection("jdbc:mysql:///test",user:"root",password:"123456");
//获得statement对象
PreparedStatement statement=connection.prepareStatement("select:*from user");
//执行查询
ResultSet resultSet=statement.executeQuery();
//遍历结果
while(resultSet.next){
//封装实体类
User user=new User();
}
//释放资源
resultSet.close();
statement.close();
connection.close();
2.原始JDBC操作(插入数据)
//默认实体类对象
User user=new User();
user.setId(2);
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获得连接
Connection connection=DriverManager.getConnection("jdbc:mysql:///test",username:"root",password:"123456");
//获得statement对象
PreparedStatement statement=connection.preparedStatement("insert into table values(?)");
//设置占位符值
statement.setInt(1,user.getId());
//执行更新操作
statement.executeUpdate();
//释放资源
staement.close();
connection.close();
3.原始jdbc操作的分析
原始jdbc开发存在的问题如下:
①.数据连接创建,释放频繁造成系统资源浪费从而影响系统性能
②.sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码
③.查询操作时.需要手动将结果集中的数据手动封装到实体中,插入操作时,需要手动将实体数据设置到sql的占位符位置
应对上述问题给出的解决方案:
①.使用数据库连接池初始化资源
②.将sql语句抽取到xml配置文件中
③.使用反射,内省等底层技术,自动将实体与表进行属性与字段的自动映射
什么是Mybatis?
①.mybatis是一个优秀的基于java的持久层框架,它内容封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动,创建连接,创建statement等复杂的过程
②.mybatis通过xml或注解的方式将要执行各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句
③.最好mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作
总结:
①.mybatis是一个实体层框架,持久层
②.mybatis可以隐藏繁杂的API
③.我们只需要专注于sql语句本身,不需要花精力去处理那些繁杂的加载驱动,创建连接,创建statement等复杂的过程
MyBatis开发步骤:
文件结构:
①.添加Mybatis的坐标
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</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>
</dependencies>
②.创建User数据表
③.编写User实体类
public class User {
private Integer id;
private String username;
private String password;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
④.编写映射文件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">
<!--查询
resultType:返回类型
-->
<select id="findAll" resultType="com.hr.entity.User">
select*from user
</select>
<!--添加
#{} 经过预编译,这种是取值以后再去编译SQL语句
${} 未经过预编译,直接提取变量编译sql语句
#{变量名}: 一般参数类型(string,int,double)变量名可以编写任意字符串.
#{属性名}: 对象参数类型如果需要取值,必须使用对象的属性名(map的key).
${变量名/属性名}: 拼接方式
-->
<insert id="save" parameterType="com.hr.entity.User">
insert into user values(null,#{username},${password})
</insert>
</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>
<!--数据源环境-->
<environments default="developement"><!--默认环境,就把下面这个environment的id值给他-->
<environment id="developement"><!--开发环境-->
<transactionManager type="JDBC"></transactionManager><!--事务管理器-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql:///mybatis_day01"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</dataSource><!--池化思想-->
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource=