mybatis
1.mybatis的引言
定义:mybatis使用来完成数据库操作的半ORM框架【纯ORM Hibernate ORM框架】
ORM:Object Relationship Mapping 对象关系映射
作用:用来操作数据库mysql,oracle,sqlServer等,解决了原始jdbc的中代码冗余的,方便访问数据
1.入门环境与数据的添加
(1).引入依赖
<!-- mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- 数据库依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
(2)mybatis的主配置文件【用来创建SqlSessionFactory】
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<!-- 操作数据库 -->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/zt"/>
<property name="username" value="root"/>
<property name="password" value="12138"/>
</dataSource>
</environment>
</environments>
</configuration>
```
(3)获取sqlsession
```java
// 读取主配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
// 创建核心对象sqlSessionFactory
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获取sqlSession sql会话
SqlSession sqlSession = build.openSession();
(4)创建数据库表user【省略】
(5)实体对象entity.User【省略】
public class User {
private Integer id;
private String name;
private String message;
}
(6)创建DAO的接口
public interface UserDao {int save(User user);}
*注意事项:不能定义方法的重载
*
(7)创建映射文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--每个接口dao文件都对应着一个mapper文件
所以这里必须制指定与那个到接口练习namespace
-->
<mapper namespace="com.example.demo.dao.UserDao">
<!-- id 表示方法的名字
parameterType 参数
-->
<insert id="save" parameterType="com.example.demo.entity.User" >
<!--
useGenerateKeys="true" 使用数据库自动生成的id策略 ,这属性只对mysql有效【可以不写】
keyProperty ="id" 主键属性,当使用数据库自动生成策略的时候,将自动生成的主键值付给参数对象的那个属性
-->
insert into user values (#{id},#{name},#{message})
</insert>
</mapper>
(8)注册mapper
<?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>
<environments default="development">
<!-- 操作数据库 -->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/zt"/>
<property name="username" value="root"/>
<property name="password" value="12138"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper.xml"/>
<!--因为我这个是在resource路径下面直接写这个的 如果在目录下面创建的话则com/example/demo/mapper/mapper.xml-->
</mappers>
</configuration>
(9)结果测试
// 读取主配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
// 创建核心对象sqlSessionFactory
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获取sqlSession sql会话
SqlSession sqlSession = build.openSession();
// 获取dao
UserDao mapper = sqlSession.getMapper(UserDao.class);
try {
User user = new User();
// user.setId();
// 可以不写这个如果在数据库中自动生成了id,则可以不用写着一句
//
user.setName("球儿");
user.setMessage("七大临时工之一,跟丁嶋安有点相似,也是一个学百家艺的人,最常用的技能是神格面具,年龄虽然是七个人中最小的,但是思路清晰,武艺高超之人");
int save = mapper.save(user);
// 提交事务
sqlSession.commit();
}catch (Exception e){
e.printStackTrace();
// 事务回滚
sqlSession.rollback();
}finally {
// 关闭事务
sqlSession.close();
}
===mybatis删除修改方法=
注意事项:在增删改的时候的必须要提交事务才行 ,不然则无法添加到数据库
修改
1.创建DAO接口
void uodate(User user);
2.设置xml配置文件
<update id="update" parameterType="com.example.demo.entity.User">
update user set
name = #{name},
message = #{message} where id = #{id}
</update>
3.测试代码
// 读取主配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
try {
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setId(16);
user.setName("马村长");
user.setMessage("八奇技之一神机百炼的继承人,为人友善,喜欢意气用事,曾一人之力抵挡八个临时工");
mapper.update(user);
sqlSession.commit();
}catch (Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally {
sqlSession.close();
}
注意事项
如果修改的时候想 有值则更新 无值则保留原来的值
解决方案:
1 先查再改
2. 动态sql
<update id="update" parameterType="com.example.demo.entity.User">
update user
<set>
<!--
set 是用来去掉多余的逗号
test里面的name和message 是 对象user的属性值
-->
<if test="name!=null and name!=''">
name = #{name},
</if>
<if test = "mesage!=null and message != ''">
message = #{message}
</if>
</set>
where id = #{id}
</update>
删除操作
查询操作
基本跟上面的相似
但是有几个要注意的点
1.sql的复用问题
<sql id="all">
select id,name,message from user
</sql>
<select id="byId" parameterType="Integer" resultType="com.example.demo.entity.User">
<include refid="all"></include>
where id = #{id}
</select>
2.模糊查询的问题
<sql id="all">
select id,name,message from user
</sql>
<select id="" parameterType="String" resultType="com.example.demo.entity.User">
<include refid="all"></include>
<!--concat为连接符号-->
where name like concat('%',#{name},'%');
</select>
3.分页查询的多参数的问题
a.写接口的时候List ByPage(@Param("start) Integer start,@Param(“rows”) Integer rows )
b.
<sql id="all">
select id,name,message from user
</sql>
<select id="" resultType="com.example.demo.entity.User">
<include refid="all"></include>
limit #{start},#{rows};
</select>
4.ResultType 和 ResultMap的区别
ResultType 只能封装简单类型的对象 【也就是说对象中没有对象类型的属性】
ResultMap 封装复杂类型的对象======》处理关联关系的【简单类型和复杂类型都能解决】
处理关联关系
处理一对一的关系
1.创建数据库的表
create table user{
id int primary key auto_increment;
name varchar(255);
num int;
message_id varchar(10) references message(mess_no);
}
create table message{
id int primary key auto_increment;
mess_no int;
text varchar(255);
}
2.创建的对应的对象
entity.User
entity.Message
3.创建DAO文件
dao.UserDao
dao.MessageDao
4.书写mapper文件
<mapper namespace="com.example.demo.dao.UserDao">
<resultMap id="userMap" type="com.example.demo.entity.User">
<id column="id" property="id"></id>
<result column="username" property="name"></result>
<result column="message" property="message"></result>
<association property="clan" javaType="com.example.demo.entity.Clan">
<result column="name" property="name"></result>
</association>
</resultMap>
<select id="all" resultMap="userMap">
select u.id,u.name username,u.message,cl.name
from user u left join clan cl
on u.clan_no = cl.num;
</select>
一对多的关联关系处理