一.知识回顾
SQL复习
--创建数据库并编码
create database 数据库名 default character set utf8
--创建表
create table 表名 (
列名 类型 约束 auto_increment comment'备注',
);
Eclipse的使用
Target runtime在建立Web项目时一定要选择,相当于在myeclipse中导入javaee6.0那个包。如果不选,新建jsp会报错,和servlet有关的全部报错,选择的话选择tomcat主目录即可。后期也可以通过项目右键-Build Path-Configure Build Path-Libraries-Add Library-Server Runtime添加。
Eclipse默认会自己 下载所需tomcat最简单结构Servers项目。server.xml可以配置端口,web.xml可以配置session时间等。一般新生成的文件夹在.metadata\.plugins\org.eclipse.wst.server.core\tmp0下。
调字体,Window-Preferences-General-Colors and Font-Text Font。调编码格式,Window-Preferences-General-Workspace。
命名规范
项目名没有要求,不起中文。包名是公司域名倒写,com.ld:持久层dao、persist、mapper;实体类entity、model、bean、javabean、pojo;业务逻辑service、biz;控制器controller、servlet、action、web;过滤器filter;异常exception;监听器listener;注释在 类和方法上使用文档注释/** */,在方法里面使用/* */ //。类命名使用大驼峰。方法和属性命名使用小驼峰。
MVC开发模式
M Model 模型 实体类、业务和dao。V view 视图 JSP。C controller 控制器 servlet 用于视图和逻辑分离。
MVC适用场景:大型项目开发。
开发顺序:先设计数据库、然后写实体类、持久层、业务逻辑、控制器、视图。
二.MyBatis环境搭建
框架介绍
软件的半成品,未解决问题制定的一套约束,在提供功能基础上进行扩充。框架中一些不能被封装的代码(变量),需要使用框架者细腻建一个xml文件,在文件中添加变量内容。①需要在特定位置和特定名称德配置文件。②需要使用xml解析技术上和反射技术。
类库,提供的类没有封装一定逻辑,就像名言警句,写作文的时候需要引入。框架,里面有一些约束,像填空题。
MyBatis简介
开源免费的框架,原名叫iBatis,2010在google code,2013移到github。作用是数据访问层框架,底层是对JDBC的封装。
MyBatis优点之一:使用MyBatis时不需要编写实现类,只需要写需要执行的sql命令。
MyBatis环境搭建
先导入jar包,建议建立一个web项目,直接将jar包放进lib文件夹即可。
在src下新建全局配置文件(编写JDBC四个变量),没有名称和地址要求,在全局配置文件中引入DTD或schema,XML语法检查器,限制XML文件所写的东西,如果导入DTD后没有提示,Window-preference-XML-XML catalog-add按钮,添加DTD文件位置和keyhttp://mybatis.org/dtd/mybatis-3-config.dtd。
环境搭配详解:<transactionManager/>中type属性可取值①JDBC,事务管理使用JDBC原生事务管理方式②MANAGED,把事务管理交给其它容器,原生JDBC事务setAutoMapping(false);<dataSource/>type属性可取值①POOLED,使用数据库连接池②UNPLOOED,不使用数据库连接池,和直接使用JDBC一样。③JNDI,java目录命名接口技术,用于调用其他语言写的东西。
<!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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/bjsxt/mapper/FlowerMapper.xml"/>
</mappers>
</configuration>
在mybatis.xml中还可以配置以下信息:
开启日志功能
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
系统内置别名是把类型全部小写,给实体类起别名
<typeAliases>
<typeAlias type="com.ld.pojo.Student" alias="stu"/>
</typeAliases>
给包下所有类起别名,别名为实体类类名
<typeAliases>
<package name="com.bjsxt.pojo" />
</typeAliases>
注意:导入的数据库连接包比较高的话可以使用这个,jdbc:mysql://localhost:3306/people?serverTimezone=GMT%2B8
新建以mapper结尾的包,在包下新建:实体类名+Mapper.xml。文件的作用是编写需要执行的SQL命令。把xml文件理解成实现类。
<!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 * from flower
</select>
</mapper>
测试结果
过程中 想查看DefaultSqlSessionFactory类的内容可以关联源码,选择External location。
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 session=factory.openSession();
List<Flower> list = session.selectList("a.b.selAll");
for (Flower flower : list) {
System.out.println(flower.toString());
}
session.close();
}
}
注意:查出来的字段名必须和实体类中的名字一样方便完成自动映射,如果不一样需要起别名,有别名优先走别名。
三.数据库连接池
在内存中开辟一块空间,存放多个数据库连接对象。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.jdbc.Driver"
url="jdbc:mysql://localhost:3306/ssm"
username="root"
password="smallming"
maxActive="50"
maxIdle="20"
name="test"
auth="Container"
maxWait="10000"
type="javax.sql.DataSource"
/>
</Context>
可以在java中使用jndi获取数据库连接池中对象:①Context上下文接口,context.xml文件对象类型。②当关闭连接对象时,把连接对象归还给数据库连接池,把状态改变成idle。
@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) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
四.三种查询方式
①selectList()返回值为List<resultType属性控制>,适用于查询结果都需要遍历的需求。②selectOne()返回值Object,适用于返回结果只是变量或一行数据时。③selectMap()返回值Map,适用于需求需要在 查询结果中通过某列的值取到这行数据的需求,Map<key,resultMap控制>。
<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>
List<Flower> list = session.selectList("a.b.selAll");
for (Flower flower : list) {
System.out.println(flower.toString());
}
int count = session.selectOne("a.b.selById");
System.out.println(count);
//把数据库中哪个列的值当作map的key
Map<Object, Object> map = session.selectMap("a.b.c", "name123");
System.out.println(map);