1.简介:
框架: 是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。它是一个半成品,一个框架是在一个给定的问题领域内,一个应用程序的一部分设计与实现。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
整体项目框架图:
2.导包
3.在src下新建全局配置文件( 编写JDBC四个变量)
在全局配置文件中引入DTD或schema
Window->preferences->XML->XMLcatlog
新建xml文件为mybatis.xml,配置jdbc变量
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- default引用当前环境的id -->
<environments default="default">
<environment id="default">
<!-- 使用事物进行配置jdbc四个变量 -->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/likui"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
4.新建以mapper结尾的包:在里面新建mapper.xml配置数据库sql语句
编写需要执行的SQL命令,相当于实现类
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.likui.mapper">
<!-- id:方法名
parameterType:定义参数类型
如果方法返回时list,在resultType中写list的类型,因为mybatis
对jdbc封装,一行一行读取数据-->
<select id="selAll" resultType="com.likui.pojo.Flower">
select * from flower
</select>
</mapper>
对应的Flower类:
package com.likui.pojo;
public class Flower {
private int id;
private String name;
private double price;
private String production;
public Flower(int id, String name, double price, String production) {
super();
this.id = id;
this.name = name;
this.price = price;
this.production = production;
}
public Flower() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getProduction() {
return production;
}
public void setProduction(String production) {
this.production = production;
}
}
数据库表结构:
5.测试结果(只有在单独使用mybatis时使用,最后在ssm中不需要)
mybatis可以自动映射,将数据库表中字段值名称和类中实体名写成一致形式
package com.likui.pojo;
public class Mybatis {
public static void main(String[] args) throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis.xml");
//使用工厂设计模式
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//生产SqlSession
SqlSession session=factory.openSession();
List<Flower> list = session.selectList("a.b.selAll");
System.out.println("id\t\tname\t\tprice\t\tproduction");
for (Flower flower : list) {
System.out.println(flower.getId()+"\t\t"+flower.getName()+"\t\t"+
flower.getPrice()+"\t\t"+flower.getProduction());
}
session.close();
}
}
6.实现JDBC tomcat Pool步骤
UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢,但对于在数据库连接可用性方面没有太高要求的简单应用程序来说,是一个很好的选择。 不同的数据库在性能方面的表现也是不一样的,对于某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。UNPOOLED 类型的数据源仅仅需要配置以下 5 种属性:
- driver – 这是 JDBC 驱动的 Java 类的完全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
- url – 这是数据库的 JDBC URL 地址。
- username – 登录数据库的用户名。
- password – 登录数据库的密码。
- defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
- 作为可选项,你也可以传递属性给数据库驱动。要这样做,属性的前缀为“driver.”,例如:
- driver.encoding=UTF8
- 这将通过 DriverManager.getConnection(url,driverProperties) 方法传递值为 UTF8 的 encoding 属性给数据库驱动。
POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
JNDI – 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这种数据源配置只需要两个属性:
- initial_context – 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))。这是个可选属性,如果忽略,那么 data_source 属性将会直接从 InitialContext 中寻找。
- data_source – 这是引用数据源实例位置的上下文的路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。
7.全局配置文件
<transactionManager/>
type属性可选值 :
- JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
- MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。
数据源(dataSource)
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
许多 MyBatis 的应用程序会按示例中的例子来配置数据源。虽然这是可选的,但为了使用延迟加载,数据源是必须配置的。
有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
*8.使用数据库连接池:在内存中开辟一块空间,存放多个数据库连接对象。JDBC Tomcat Pool,直接由tomacat产生数据库连接池,有active、idle状态,使用数据库连接池的目的,在高频率访问数据库时,使用数据库连接池可以降低服务器系统压力,提升程序运行效率,适用于大型项目。
条件:lib下有数据库驱动文件、META-INF下context.xml文件、src下有serverlet文件
(1)在context.xml中设置数据连接的相关信息
<Context>
<Resource driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/likui"
username="root" password="123456" maxActive="50" maxIdle="20" name="test"
auth="Container" maxWait="10000" type="javax.sql.DataSource"/>
</Context>
(2)在src下新建serverlet文件,用于获取数据库连接信息并执行
@WebServlet("/pool")
public class Demoserverlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
try {
Context cxt = new InitialContext();
DataSource ds = (DataSource) cxt.lookup("java:comp/env/test"); //test是连接的名称
Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement("select * from flower");
ResultSet rs = ps.executeQuery();
res.setContentType("text/html;charset=utf-8");
PrintWriter out = res.getWriter();
while(rs.next()){
out.print(rs.getInt(1)+" "+rs.getString(2)+"<br/>");
}
out.flush();
out.close();
rs.close();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
效果图如下所示:
*9.三种查询方式
(1)selectList():返回值为一个list类型,适用于遍历查询所有结果的需求
xmll配置文件 中:
<select id="selAll" resultType="com.likui.pojo.Flower">
select * from flower
</select>
java文件中:
List<Flower> list = session.selectList("a.b.selAll");
System.out.println("id\t\tname\t\tprice\t\tproduction");
for (Flower flower : list) {
System.out.println(flower.getId()+"\t\t"+flower.getName()+"\t\t"+
flower.getPrice()+"\t\t"+flower.getProduction());
}
(2)selectOne(),:返回值为一个object对象,适用于返回结果只是一个变量或一行数据时
xml配置文件中:
<select id="selById" resultType="int">
select count(*) from flower where id=1
</select>
java文件中:
int count=session.selectOne("a.b.selById");
System.out.println(count);
(3)selectMap():返回值时Map,适用于需求在查询结果中通过某列值取得相应值
xml配置文件 中:
<select id="c" resultType="com.likui.pojo.Flower">
select * from flower
</select>
Java文件中:
Map<Object,Object> map=session.selectMap("a.b.c", "name");
System.out.println(map);
注:带*号为可选操作