发表于: 2018-03-19 21:17:48
1 622
今日完成
1.把系统装了,软件装了。
2.梳理mybatis。
·mybatis的工作过程(简单版,用了一个小接口查看);
·session为什么要关闭;
·mybatis为什么不需要daoImpl(最后);
1.重装系统,装了相关程序,并配置好环境:
JDK "1.8.0_161" /
Mysql 5.5 /
Maven apache-maven-3.5.3 /
本地有比较全的依赖包可以是用本地的,快
IntellijIDEA 2017 2.3 /
idea配置maven Settings——Plugins——搜索Maven,搜出来的全选确定——再添加Maven配置文件和本地库。
idea基本字体、编码和设置:http://blog.csdn.net/frankcheng5143/article/details/50779149
数据库,cmd的问题:
创建数据库(utf8编码) CREATE DATABASE `jnshu` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
创建表(utf8编码)create table jnshu_user(id int not null auto_increment,name varchar(60),create_at bigint,update_at bigint,age int,sex int,pro varchar(1000),brother varchar(60),PRIMARY key(id))CHARACTER SET utf8 COLLATE utf8_general_ci
使用cmd的时候插入数据读取都乱码。
看了半天,数据库表内容栏都是utf8,最后发现是cmd的是gbk,cmd储存和读取显示都是gbk。把cmd改成utf8以后虽然编码改了,但是不知道为什么没办法切换输入法,只能写英文。
复制进去字符直接显示一个字占用两个字母位置,仍然不能写:
而且开启mysql插入语句执行的话后面不显示,而且就直接接一个bye退出mysql了…
但是这不影响java和navicat操作数据。于是就没管它。
2.1 newMavenProject:
建好以后目录:
配置xml,如果你有并且设置好maven的本地库,配置的时候可以看到提示。
就像这样:
它是实时加载的,也可以写好以后复制到pom里。pom配置同前文没什么改动。、
2.2 Mybatis:
)目录
说一些细节的东西:可能新建项目没有分配文件夹的属性,所以有时候项目不能新建Class类和运行之类的。
1.Sources源代码文件夹(编译文件夹):在这里写你的java程序;
2.Tests测试文件夹,在这里写测试类才能运行;
3.Resources资源目录,资源的根目录。xml文件和其它配置资源文件都在这里,在调用的时候地址也就能直接写里面的文件目录;
这几个文件夹如果idea没有自动创建,或者导入项目的时候没有,就需要手动添加才能被识别。
跟之前一样,创建完成Maven项目开始。先配置pom,然后写实体类,写Mapper:User.xml,配置完以后就写测试类,然后运行,等待报错,调试,运行成功。
之前写过,这里就贴一下代码说明一下:
mybatis-config:
<?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>
<!--定义外部资源!这里定义的要在下面的数据源(dataSource type="POOLED")中使用到!位置为资源根目录resources,区分大小写!-->
<properties resource="mysql.properties" />
<typeAliases>
<!--给名字不好用的com.java.pojo.User类定义个别名User,这样可以在任何地方用User调用,注意是任何地方!-->
<!--一定要对应user Mapper里的resoultType,不然会报:java.lang.ClassNotFoundException: Cannot find class: User(找不到User类)-->
<typeAlias alias="User" type="com.java.pojo.User"></typeAlias>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="Mapper/User.xml"/>
</mappers>
</configuration>
mapper:mapper映射文件的地址,上下级路径以/连接
这里面使用了外部资源<properties resource="mysql.properties" /> 注意标签的顺序不能错,比如mapper写在typeAliases前面运行就会报错。标签顺序(由左至右,由上至下,不需要就不写):
properties, settings,typeAliases, typeHandlers,objectFactory,objectWrapperFactory,plugins,environments, databaseIdProvider, mappers
上面的数据源里的属性就是通过properties定义的资源来读取的。mysql.properties文件:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jnshu
jdbc.username=root
jdbc.password=root
jdbc.driver等属性和上面${jdbc.driver}等值对应
为什么要使用外部的数据源:
1.方便动态修改
2.懒加载(延迟加载)的时候必须配置。懒加载可以减轻负荷。比如网页内容多的时候不能一次性加载完成,所以这时候就需要延迟加载数据,让它在需要的时候加载。起码这样手机访问的时候不会浪费你的流量…
3.其它想起来再说
User.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.java.pojo.User">
<select id="selectById" parameterType="int" resultType="User">
SELECT * FROM jnshu_user WHERE id = #{id}
</select>
</mapper>
parameterType属性:接受的属性/传递的值,比如int,user,map。参数映射。
resultType属性:返回值。而且这里的resultType="User"是用的就是前面typeAlias里命名的com.java.pojo.User的别名。
namespace:指向实体类PATH,上下级目录以.连接。如果你使用接口,这里就指向接口文件。而下面的id值就要对应接口里的方法。
如果"http://mybatis.org/dtd/mybatis-3-mapper.dtd"报红就在setting里注册一下:
user实体类,属性和表列名一一对应就行了。
然后是测试类:
package mybatistest;
import com.java.pojo.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 java.io.IOException;
import java.io.Reader;
public class Test {
public static void main(String[] args)throws IOException{
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
User user = session.selectOne("selectById",1);
session.commit();
System.out.print(user.getName());
session.close();
}
}
session.selectOne("selectById",1) "selectById"对应Mapper里的id。
思路:
1.Reader = Resources.getResourceAsReader(""):读取配置文件转化为流;
2.SqlSessionFactory:Session工厂获取配置,并根据其来初始化,造出Session,所以配置文件很重要;
3.SqlSessionFactory.openSession():创建Session实例;
4.session.selectOne("selectById",1):mybatis映射sql语句的方法,映射mapper里的select sql语句;
5.session.commit():提交;也算是属于事务范围,Mybatis单独使用的时候增删改的时候需要执行commit(),事务提交后关闭会话,事务结束。如果不使用会回滚。配合Spring的时候可以不使用,交给Spring来做。
6.ssession.close():关闭会话:
session为什么需要关闭:session是一种会话的抽象对象,用来记录数据服务器/客户端的访问状态。数据的传输是用各种协议(http、internet之类),就是说客户端向服务器发送一个请求,服务器接收后返回一个回应,然后这个连接就会被关闭,也就是说再次连接就要再次发送而不是刚才这次连接。服务器不会保留之前的会话信息,这样回应就中断了。而session就是保存记录这些信息,有了session的记录服务器就知道这还是上一次的对象,是同一个客户端在发送请求,这样客户端在不断的发送接收信息、刷新就不会断开访问了。session的生命周期会保持很长时间,所以session就需要关闭(销毁)。Session长期保存的时候session记录就会储存在客户端本地,这就是浏览器的缓存的一种,就是session的缓存。调用close()就是清空这些缓存。如果不关闭session就会导致数据库连接次数不断增加,最后导致数据库宕机停止(应该是)(就是内存溢出)。
为什么Mybatis不需要DaoImpl:
之前的没有使用接口。于是问了下度娘,简单的写了个接口测试
接口:
package com.java.dao;
import com.java.pojo.User;
public interface Suser {
public User selectById(int id);
}
改动:
User.xml
<mapper namespace="com.java.dao.Suser">
<select id="selectById" parameterType="int" resultType="User">
SELECT * FROM jnshu_user WHERE id = #{id}
</select>
</mapper>
这里的namespace指向接口文件。而id的值“selectById”指向接口里的方法selectById(int id);
测试类:
public static void main(String[] args)throws IOException{
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
// User user = session.selectOne("selectById",1);
// session.commit();
// System.out.print(user.getName());
// Suser.class获取SuserClass对象
// class的classforName(String name)也可以获取,但是需要强制转换,因为使用的是字符串,而且必须获取ClassNotFoundException异常
// 也可以通过类里面的getClass()获取
Suser su = session.getMapper(Suser.class);
User user = su.selectById(1);
System.out.print("查出的名字为:" + user.getName());
session.close();
}
}
session通过接口去实例化并且调用方法,然后获取值去执行sql搜索。
这里可以看出,mybatis直接实例化了接口Suser,重写其selectById()方法查询。
这就是Mybatis不需要daoImpl的原因,因为Mybatis继承了接口,实例化它的方法并且用它去使用sql语句映射做查询(可能理解的不准确,有点绕,总是说映射,映射在学术上是‘指两个元素的集之间元素相互“对应”的关系’)。
至于Mybatis是如何知道怎样去实例化它的方法的,应该是使用了代理类,这里查到一个参考(先保存有时间再看):
Java 动态代理机制分析及扩展 :https://www.ibm.com/developerworks/cn/java/j-lo-proxy1/
明日计划:
继续做下一步任务,整合代码,加上查询插入修改删除等。
遇到的问题和收获:
1.cmd操作乱码/是cmd的原因
2.mybatis是如何使用接口的
3.关于事务与session的关系,和具体的抽象概念
4.真是一步一百度,不会问师兄,加油吧小伙子!
评论