三层架构: 界面层:和用户打交道,接收用户的请求参数,显示处理结果。 jsp,html,servlet。-------Controller包-----------------springmvc(servlet)
业务逻辑层:接收了界面层传递的数据,计算逻辑,调用数据库,获取数据。---------------Service包 --------------------spring
数据访问层:访问数据库,执行对数据的增删改查。 ------------------Dao包------------------------mybatis
1.mybatis项目创建。1.创建maven工程,选择quickstart。
2.<select>查询标签,<insert>插入标签。<delete>删除标签
<insert>插入数据使用占位符#{}。eg:insert into students value (#{id},#{name},#{email},#{age}),可以得到方法传递的值。
3.创建JavaBean以及接口。
3.配置sqlmapper.xml: 在接口的包下创建一个与接口名相同的xmlsql配置文件,namespace为接口全类名,标签对应id为接口的对应方法名,resultType为sql语句值返回类型。在标签下写sql语句。
查询语句的都需要设置resultType否则不能匹配对象。
namespace与id组成唯一的sql语句标识。想要用sql语句需要根据此查找。
4.配置resource下的mybatis主配置文件: 在main下创建一个resource文件,然后右键将该文件添加为resource room。
在该文件下创建一个xml文件,里面配置日志的输出。<settings> <setting name="logImpl" value="STDOUT_LOGGING"/></settings>
配置数据库环境。<environments default="mybatis">。default值为使用的配置的数据库环境environment id
<environment default="mybatis">,environment标签配置数据库信息,id设置为数据库名,
配置target资源映射 <mappers><mapper resource="Dao/StudentDao.xml"/></mappers> ,resource值为sql映射文件在target下的目录,以/分割,默认从target/classes下开始。
5.封装sqlsession。
public class MyBatisUtils {
private static SqlSessionFactory factory=null;
static {
String config="mybatismapper.xml";
try {
InputStream in = Resources.getResourceAsStream(config);
factory=new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取sqlsession
public static SqlSession getsqlsession(){
SqlSession sqlSession=null;
if(factory!=null){
sqlSession=factory.openSession();//非自动提交事务
}
return sqlSession;
}
}
6.测试。1.通过工具类得到sqlsession对象。SqlSession sqlSession= MyBatisUtils.getsqlsession()
2.通过 implements imp =sqlsession.getmapper(implements.class) 的接口反射得到对应的接口实现类对象。 mybatis暗箱操作。
3.通过该imp实现类对象调用接口对应的方法对数据库进行操作。
【重要】mybatis的动态代理。 1.dao接口与sqlmapper文件在同一个包下,且文件名相同。
2.sqlmapper文件的namespace为dao接口的全类名。
3.sqlmapper文件的id值是dao接口中的方法名
4.dao接口不要使用重载方法,不要使用同名的不同参数的方法。
5.创建sqlsession工具类。得到sqlsession对象。
7.sql传参。【重要】 一个简单类型的传参,java基本数据类型叫做简单类型,在sql映射文件中sql语句用占位符#{任意字符}表示传参
8.多个参数的sql传参。【重要】命名参数: 在dao接口方法中形参位置添加@parm("自定义名") -传入的参数类型和名字。在sqlmapper中用占位符#{自定义名}使用。
eg: public List<student> list(@param("myname") string name, @param("myage") int age)
select id,name,age from student where name=#{myname} and age=#{myage} 相当于把传入的参数复制给注解的参数,然后sql语句调用该参数。
【重要】使用对象传参。dao接口方法是一个对象。 在sql语句中占位符写上对象中的属性,在调用该接口方法时,为对象传入属性值,该属性值就会被占位符所使用。
对象可以就以对应的javabean对象传入,也可以在创建一个类,里面设置对应类型属性,new对象传值给方法。
建议使用对应bean对象传值查询。
9.resultType属性。 sql语句执行后返回java对象类型,一般用于查询语句。 resultType的属性是全类名,将sql的列赋值给java对象对应的属性,属性值可以是任意类, 一般使用数据库对应的javabean类。
count(*)的查询,返回值是int类型。
【一般用于查询语句】 。
10.别名<typeAliases>:第一种方式:<typeAlias>标签。 给resultType属性定义别名。 在主配置文件中,在日志文件配置下面<typeAliases><typeAliastype="全类名" alias="别名"></></>
第二种方式【常用】:<packge>标签。<packge name="包名"> 包里面的类名就是别名。 也是在日志文件下配置。eg:<typeAliases><package="全包名" ></></>
建议不要用别名。
11.resultMap属性。 自定义一个类,将表的列用自定义类的属性替代。 使用格式。 1.定义resultMap:
<resultMap id="自定义" type=”自定义类的全类名“>
<id column="主键列名" property=”s属性名“/>
<result column="非主键列名" property="属性名"/>
</reultMap>
在查询语句中 resultmap=”自定义名“
【推荐】resultMap用于解决列名与属性名不一致的问题。
【推荐】 当类属性与列名相同时,用resultType。
【重要】 resultmap和resultType二选其一。 resultType是直接确定了类的属性名与列名一一对应。 resultMap不能确定对应关系,所以需要自己配置,往往是二者不对应时设置resultMap来调整。
11.sql模糊查询 like : select *from student where name like %?% 。 方法中需要传入%?%参数。 用String 接收参数,然后将string 传入方法。
12.动态sql:sql内容是变化的,可以根据不同条件获取不同sql,主要是where部分发生变化。
1.<if test>用法。 eg:select *from students where <if test="name!=null and name !=' ' ">name =#{name}</if> <if test="age>0">or age >#{age} </if>.
test后面是判断语句,如果满足就会执行后面的赋值。 即如果name不为空且不为空字符,就会赋值, 如果age>0就会 执行 or age>#{age}。
if 动态查询会将关键字也编译到sql语句中 (此句中的or)如果前面条件不成立,后面成立,就会是,select *from students where or age >#{age}. 导致报错。 所以需要在
where后加一个恒成立条件,1=1。
2.<where> 用法。select *from students <where><if test="name!=null and name !=' ' ">name =#{name}</if> <if test="age>0">or age >#{age} </if></where>
解决了<if test>sql条件报错问题。
3.<foreach collection="" item="" open="" close="" separator="">.......</foreach>:collection表示接口中方法参数的类型,如果是arry使用array,如果是list使用list。
item:自定义的,表示数组和集合的成员的遍历。
open:循环开始的字符。
close:循环结束的字符。
separator:集合成员之间的分隔符。
<foreach>用于条件的遍历。 方法一: 接口方法是list集合存放id ,eg public List<integer> list(List<Integer> int);
eg select * from sudent wehre id in <foreach collection="list" item="myid" open="(" close=")" separator=","> #{myid}--占位符传入item遍历。
表示 select * from students where id in(1001,1002,1003)等。
collection=传进来的list student的集合对象。 item=自定义名。 open=( 。 close=), separator=","
方法二:接口方法是关于对象的泛型。eg: public List<Student> list(List<Student> stu);
用 #{item值.属性来传入占位符的值}
13.代码片段。定义 : <sql id="定义的片段名">sql语句</sql>. 使用时在 <select>中的sql语句中用<include refid="片段名"/> 将代替sql语句。
14.数据库配置文件与主配置文件分离。 在主配置文件目录下创建一个properties文件,eg:jdbc.properties,在该文件里写上数据库的driver,url,username,password 。以key=value形式写,调用用key调用
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
使用时在主配置文件中连接数据库的 value值=“${对应的key值}” eg:value="${jdbc.driver}".
15.指定多个mapper映射的方式。 1. 在<mappers>标签中,使用多个<mapper resource="sql映射文件路径"/>来导入映射文件。
2.在<mappers>标签中使用<package name="包路径"/>来导入该包下的所有映射文件。 条件:1.sql映射文件名需要和接口一致。2. 两个文件需要在同一目录。
16.分页(pagehelper):查询的类容进行分页。eg:网购评论分页,1,2,3.........。
1.导入pagehelper依赖。
2.在主配置文件的<enviroments>上配置分页插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
3.在测试中使用pageHelper.startpage(pagenum="",pagesize="")。 pagenum:第几页。 pagesize:一页中有多少行数据。