定义(是什么)
- mabatis是一个关系型数据库映射框架。作用是简化jdbc连接数据库和进行CRUD(增删改查)操作,具体实现是将这部分的内容封装起来,交给框架容器来完成(具体是spring框架还是什么框架另外说)。
- 特点:sql语句的自由书写,比起springdata jpa或者hibernate之类的,可以实现更灵活的功能。
优点(为什么)
- 查询的sql语句是要自己写的,虽然多了一些工作量,但是这样可以灵活运用sql语句实现自己想要实现的功能。
mabatis的定义或者涉及的新概念
- 行级锁:在开发过程中,当几个用户同时访问修改一条数据库数据的时候,根据执行的时间,会有一个行级锁的概念,在行级锁的情况下,其他语句无法访问修改该数据。
用法(怎么用)
- web页面开发过程的思路:首先是些数据库表,然后是书写DAO层,之后是service层,最后是前后端的交互任务。
- 所以,首先是介绍建立数据库的表,用sql语句(当然,也可以直接可视化实现),注意,为了处理事务,在创建表格的时候,别忘了书写一个innoDB属性。那么在后面的单元我会附带一个链接,介绍基本的sql语句的书写。
那么写个例子吧。
例如:
CREATE TABLE seckill(
`seckill_id` bigint NOT NULL AUTO_INCREMENT COMMENT '商品库存id',
`name` varchar(120) NOT NULL COMMENT '商品名称',
`number` int NOT NULL COMMENT '库存数量',
`start_time` TIMESTAMP NOT NULL COMMENT '秒杀开始时间',
`end_time` TIMESTAMP NOT NULL COMMENT '秒杀结束时间',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (seckill_id),
KEY idx_start_time (start_time),
KEY idx_end_time (end_time),
KEY idx_create_time (create_time)
)ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT '秒杀库存表';
这是简单的建立了一个表格,并且,创建了索引(key)和主键(primary key),驱动式innoDB,自增的初始值设置为1000,utf-8的编码格式,支持中文防止乱码。创建索引的目的是为了查询的时候,可以直接从索引中读取查询属性,不用每一个属性都遍历一遍。
3. 在src下创建mybatis核心配置文件SqlMapConfig.xml。在这个文件中修改账号,密码和连接的数据库。
<?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>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/huiyushixun?characterEncoding=UTF-8"/>
<property name="username" value="root" />
<property name="password" value="abc123." />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="User.xml"/>
</mappers>
</configuration>
- 建立实体类entity,实体类中有两个属性,一是属性和列名对应;二是属性和一整个大表对应(一对多),要调用大表里面的东西,只要用”.“就好了,像是数组一样使用。
- 建立dao层,将crud的接口写好
- 有两种方式可以实现dao层接口,一个是api方式,还有xml方式。最好用xml,这样子将每一个dao的实现类封装了,以后方便修改。xml实现dao接口方式:1.在resources文件夹下建立mapper文件夹,2,在resources文件夹下建立mybatis-config.xml文件,在其中配置三个东东,如下:
这个文件,也可以不配置,但是,会出现什么后果,我无法保证了。(我后面会去试一试,不过有个没有用mybatis-config.xml配置文件的demo)
3,对于每一个dao建立同名xml文件。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">
<mapper namespace="com.hpe.ssm01.dao.UserDao">
<!-- 增加用户 -->
<insert id="addUser" parameterType="com.hpe.ssm01.po.User">
insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
<!-- 修改用户 -->
<update id="updateUser" parameterType="com.hpe.ssm01.po.User">
update user set username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} where id = #{id}
</update>
<!-- 获取所有用户信息 -->
<select id="findUser" resultType="com.hpe.ssm01.po.User">
select * from user
</select>
<!-- 根据id获取用户信息 -->
<select id="findUserById" parameterType="int" resultType="com.hpe.ssm01.po.User">
select * from user where id = #{id}
</select>
<!-- 根据username模糊查询获取用户信息 -->
<select id="findUserByName" parameterType="String" resultType="com.hpe.ssm01.po.User">
select * from user where username like #{key}
</select>
</mapper>
其中:
- 由mapper标签开始,由/mapper结束,可以把它想成一个空间,是映射文件 。
- 属性namespace:空间名,主要在代理中使用。这个namespace是唯一的。
- 这里把mapper标签和接口联系在一起了,namespace=写接口路径。
- 具体的xml语句书写规范参考:
- xml书写的时候的sql语句,参考:
- 注意:在项目创建的时候,有一个sql文件的目的是为了可以让你在这个文件中看出的数据库表格的更新情况。
代理解知识点
- sql语句
- 多对一产生的级联。级联:即多表查询。在一句sql语句中,可以查询多个表,并且获得其中的部分值,放入到我们的entity类中。好用,关键是,级联的产生,要有查询依据,比如:A表中有一列,放了b表的某一列,该列可以作为查询依据。
例如:
select a.*,b.* from A a inner join B b on a.aid=b.aid where ......
inner join 如果表中有至少一个匹配,则返回行
- 具体的xml中的每句话的标签的用法,现在知道的是:,,,,标签,他们的用法是:
<select(或者其他,insert之类的也可以) id="findUserByName" (此处要是dao中定义的方法名,反射原理实现接口中的方法) parameterType="String" (传入参数) resultType="com.hpe.ssm01.po.User" (返回参数) >
select * from user where username like #{key} //#{形参名},用这种格式可以调用方法中传入的实参
</select>