版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一、数据库SQL 命令
1、创建数据库,并指定编码
Create database ssm default character set utf8
2.创建表
Create table 表名(
列名类型约束auto_increment comment ‘备注’,
);
3、添加数据
INSERT INTO `ssm`.`flower` (`id`, `name`, `price`, `production`) VALUES ('2', '栀子花', '5.1', '山东');
二、Eclipse 使用
- 创建项目
选择target runtime,否则出现新建jsp 报错,如果忘记选择,右键项目–> build path中添加library - Eclipse 默认会自己下载所需tomcat 最简单结构。
三、框架是什么
- 框架:软件的半成品.未解决问题制定的一套约束,在提供功能基础上进行扩充。
- 框架中一些不能被封装的代码(变量),需要使用框架者新建一个 xml 文件,在文件中添加变量内容。
比如:需要建立特定位置和特定名称的配置文件;需要使用xml 解析技术和反射技术。 - 常用概念
类库:提供的类没有封装一定逻辑。(类库就是名言警句,写作文时引入名言警句)
框架:区别与类库,里面有一些约束。(框架是填空题)
四、MyBatis 简介
- Mybatis 开源免费框架。原名叫iBatis,2010 在google code,2013 年迁移到github。
- 作用: 数据访问层框架。
底层是对JDBC 的封装。 - mybatis 优点之一:
使用mybatis 时不需要编写实现类,只需要写需要执行的 sql 命令。
五、环境搭建
目录结构:
- 导入jar
- 在src 下新建全局配置文件(编写JDBC 四个变量)
2.1 没有名称和地址要求例如,路径/mybatis0(项目名)/src/myabtis.xml即可
2.2 在全局配置文件中引入DTD 或schema
2.2.1 如果导入dtd 后没有提示:
点击Window--> preference --> XML --> XMl catalog --> add
按钮(课件资料中,包含所有需要用到的dtd文件)
2.3 全局配置文件内容
<?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>
<!-- default引用environment的id,当前所使用的环境 -->
<environments default="default">
<!-- 声明可以使用的环境 -->
<environment id="default">
<!-- 使用原生JDBC事务 -->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/bjsxt/mapper/FlowerMapper.xml"/>
</mappers>
</configuration>
- 新建以mapper 结尾的包,在包下新建:
实体类名+Mapper.xml
。例如FlowerMapper.xml
3.1 文件作用:编写需要执行的SQL 命令
3.2 把xml 文件理解成实现类.
3.3 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">
<!-- namesapce:理解成实现类的全路径(包名+类名) -->
<mapper namespace="a.b" >
<!-- id:方法名
parameterType:定义参数类型
resultType:返回值类型.
如果方法返回值是list,在resultType中写List的泛型,因为mybatis
对jdbc封装,一行一行读取数据
-->
<select id="selAll" resultType="com.bjsxt.pojo.Flower">
select id,name name123,price,production from flower
</select>
<select id="selById" resultType="int">
select count(*) from flower
</select>
<select id="c" resultType="com.bjsxt.pojo.Flower">
select id,name name123,price,production from flower
</select>
</mapper>
- 测试结果(只有在单独使用 mybatis 时使用,最后 ssm 整合时,下面代码不需要编写)
package com.bjsxt.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
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 com.bjsxt.pojo.Flower;
public class Test {
public static void main(String[] args) throws IOException {
InputStream is = Resources.getResourceAsStream("myabtis.xml");
// 使用工厂设计模式
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// 生产SqlSession
SqlSession sqlSession = factory.openSession();
List<Flower> list = sqlSession.selectList("a.b.selAll");
for (Flower flower : list) {
System.out.println(flower.toString());
}
int count = sqlSession.selectOne("a.b.selById");
System.out.println(count);
// 把数据库中哪个列的值当作map的key
Map<Object, Object> map = sqlSession.selectMap("a.b.c", "name123");
System.out.println(map);
sqlSession.close();
}
}
输出
Flower [id=1, name=向日葵, price=2.05, production=江西]
Flower [id=2, name=栀子花, price=5.1, production=山东]
2
{栀子花=Flower [id=2, name=栀子花, price=5.1, production=山东], 向日葵=Flower [id=1, name=向日葵, price=2.05, production=江西]}
六、环境搭建详解
1.全局配置文件中内容
(1) <transactionManager/> type
属性的可取值包括:
JDBC,事务管理使用JDBC 原生事务管理方式
MANAGED 把事务管理转交给其他容器.原生JDBC 事务setAutoMapping(false)
(2) <dataSouce/>type
属性
POOLED 使用数据库连接池
UNPOOLED 不实用数据库连接池,和直接使用JDBC 一样
JNDI :java 命名目录接口技术.
七、数据库连接池
- 在内存中开辟一块空间,存放多个数据库连接对象.
- JDBC Tomcat Pool,直接由tomcat 产生数据库连接池.
- 图示
active 状态:当前连接对象被应用程序使用中
Idle 空闲状态:等待应用程序使用
- 使用数据库连接池的目的
在高频率访问数据库时,使用数据库连接池可以降低服务器系统压力,提升程序运行效率.
小型项目不适用数据库连接池。 - 实现JDBC tomcat Pool 的步骤.
在web 项目的META-INF 中存放context.xml,在context.xml 编写数据库连接池相关属性。把项目发布到tomcat 中,数据库连接池产生了。
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"
username="root"
password="123456"
maxActive="50"
maxIdle="20"
name="test"
auth="Container"
maxWait="10000"
type="javax.sql.DataSource"
/>
</Context>
- 可以在java 中使用jndi 获取数据库连接池中对象
Context:上下文接口.context.xml 文件对象类型
当关闭连接对象时,把连接对象归还给数据库连接池,把状态改变成Idle
代码示例:
package com.bjsxt.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
@WebServlet("/pool")
public class DemoServlet 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");
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();
}
}
}
八、三种查询方式
1.selectList() 返回值为List<resultType 属性控制>
适用于查询结果都需要遍历的需求
List<Flower> list = sqlSession.selectList("a.b.selAll");
for (Flower flower : list) {
System.out.println(flower.toString());
}
2.selectOne() 返回值Object
适用于返回结果只是变量或一行数据时
int count = sqlSession.selectOne("a.b.selById");
System.out.println(count);
3.selectMap() 返回值Map
适用于需要在查询结果中通过某列的值取到这行数据的需求.
Map<key,resultType 控制>
// 把数据库中哪个列的值当作map的key
Map<Object, Object> map = sqlSession.selectMap("a.b.c", "name123");
System.out.println(map);
4.三种查询方式的完整代码示例
package com.bjsxt.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
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 com.bjsxt.pojo.Flower;
public class Test {
public static void main(String[] args) throws IOException {
InputStream is = Resources.getResourceAsStream("myabtis.xml");
// 使用工厂设计模式
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// 生产SqlSession
SqlSession sqlSession = factory.openSession();
List<Flower> list = sqlSession.selectList("a.b.selAll");
for (Flower flower : list) {
System.out.println(flower.toString());
}
int count = sqlSession.selectOne("a.b.selById");
System.out.println(count);
// 把数据库中哪个列的值当作map的key
Map<Object, Object> map = sqlSession.selectMap("a.b.c", "name123");
System.out.println(map);
sqlSession.close();
}
}