框架(Framework)——半成品软件
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例之间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。
简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件框架一般处在低层应用平台(如 J2EE )和高层业务逻辑之间的中间层。
作者:method
链接:https://www.jianshu.com/p/4339ad509be1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Mybatis
mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。mybatis通过 xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中
sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
作者:method
链接:https://www.jianshu.com/p/4339ad509be1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
JDBC问题
1.数据库连接创建、释放频繁造成系统资源的浪费从而影响性能;
2.Sql语句在代码中硬编码 造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。
3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便
作者:method
链接:https://www.jianshu.com/p/4339ad509be1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Mybatis 框架快速入门
1.创建maven工程
maven 用于管理jar包,其存在于仓库中
2.添加依赖jar包
在pome.xml中添加所需的依赖坐标
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<!-- 定义classpath -->
<resources>
<!-- resources文件 -->
<resource>
<directory>src/main/resources</directory>
<!-- 是否被过滤,如果被过滤则无法使用 -->
<filtering>false</filtering>
</resource>
<!-- java文件夹 -->
<resource>
<directory>src/main/java</directory>
<!-- 引入映射文件等 -->
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
3.编写User实体类
-3.1 数据库脚本
导入数据库即可
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('41', '老李', '2018-02-27 17:47:08', '男', '北京');
INSERT INTO `user` VALUES ('42', '小二李', '2018-03-02 15:09:37', '女', '北京');
INSERT INTO `user` VALUES ('43', '小二李', '2018-03-04 11:34:34', '女', '北京');
INSERT INTO `user` VALUES ('45', '居八戒', '2018-03-04 12:04:06', '男', '北京');
INSERT INTO `user` VALUES ('46', '老李李', '2018-03-07 17:37:26', '男', '北京');
INSERT INTO `user` VALUES ('48', '小马宝莉', '2018-03-08 11:44:00', '女', '北京');
-3.2 编写实体类
-3.3 编写持久层接口IUserDao
import com.neusoft.domain.User;
import java.util.List;
public interface IUserDao {
// 查询所有
List<User> findAll();
}
-3.4 编写持久层接口的映射(target)文件IUserDao.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.IUserDao">
<!-- 配置查询所有用户的sql-->
<select id="findAll" resultType="com.User">
select * from user
</select>
</mapper>
4.编写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">
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置mysql的环境-->
<environment id="mysql">
<!-- 配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/java_ssm"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<mapper resource="com/neusoft/dao/IUserDao.xml"/>
</mappers>
</configuration>
5.测试类文件test
package com.neusoft.test;
import com.neusoft.dao.IUserDao;
import com.neusoft.domain.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest1 {
@Test
public void test1() throws IOException {
// 1. 读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2. 创建 SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3. 使用 工厂生产的 SqlSession对象
SqlSession session = factory.openSession();
// 4. 使用SqlSession 创建Dao 接口 的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
// 5. 使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user: users){
System.out.println(user);
}
// 6 释放资源
session.close();
in.close();
}
}
运行结果
基于注解的mybatis
1.在持久层接口中添加注解
package com.neusoft.dao;
import com.neusoft.domain.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface IUserDao {
// 查询所有
@Select("select * from user")
List<User> findAll();
}
2.修改SqlMapConfig.xml配置文件
<!-- 告知mybatis映射配置的位置-->
<mappers>
<mapper class="com.neusoft.dao.IUserDao"></mapper>
</mappers>