目录
1.什么是mybatis
MyBatis 是一款优秀的持久层Dao框架,它支持定制化 SQL、存储过程以
及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及
获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信
息,将接口和 Java 的 POJOs(Java实体类)映射成数据库中的记录.
2.为什么使用mybatis
可以简化jdbc的操作以及占位符赋值以及查询结果集的封装。
3.如何使用mybatis
(1)引入mybatis和mysql的jar包
<!--https://mvnrepository.com/artifact/org.mybatis/mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
(2)创建mybatis的配置文件
<?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" />
<!--数据源的配置:name的值固定 value的值要根据客
户自己修改-->
<dataSource type="POOLED">
<property name="driver"
value="com.mysql.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?
serverTimezone=Asia/Shanghai" />
<property name="username" value="root"
/>
<property name="password" value="root"
/>
</dataSource>
</environment>
</environments>
</configuration>
(3)创建mybatis和数据库的映射文件
?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">
<!--namespace:命名空间 可以随便起名,但是后期我们要求命名空间的值必须和所对应的dao相同-->
<mapper namespace="qy151.user">
<!--查询 根据id查询用户信息 select标签用于查询的标签 id:标签的唯一标识 resultType: 定义返回的类型 把sql查询的结果封装到哪个实体类钟 #{id}===表示占位符等价于? 这是mybatis框语 -->
<select id="findById"resultType="com.ykq.entity.User">
select * from tb_user where userid=#{id}
</select>
</mapper>
注意:把映射文件注册到配置文件上
<!--注册映射文件-->
<mappers>
<!--resource:引用资源文中的映射文件 url:网络上的映射文件-->
<mapper resource="mapper/UserMapper.xml" />
</mappers>
4.lombok插件
(1)idea安装lombok插件
(2)工程中引入lombok依赖
<!--lombok的依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
(3)在实体类上添加lombok注解
@Data //set和get方法以及toString方法
@NoArgsConstructor //无参构造方法
@AllArgsConstructor //所有参数的构造方法
public class User {
private int userid;
private String username;
private String realname;
}
5.添加sql日志
(1)添加日志的jar
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
(2)添加日志的配置文件log4j.properties
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=D:/qy151/log/qy151.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
6.通过dao和映射文件的关联完成操作
(1)创建一个dao接口并定义
public interface UserDao {
public List<User> findAll();
}
(2)创建映射文件
<?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">
<!--namespace:命名空间
必须和dao相同
-->
<mapper namespace="com.ykq.dao.UserDao">
<select id="findAll" resultType="com.ykq.entity.User">
select * from tb_user
</select>
</mapper>
7.添加时如何返回递增的主键值
<insert id="addUser" parameterType="com.ykq.entity.User"
useGeneratedKeys="true" keyProperty="userId">
insert into tb_user values(null,#{username},#{realname},#(address))
</insert>
//增
@Test
public void testAdd()throws Exception {
Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory =new SqlSessionFactoryBuilder().build(resourceAsReader );
SqlSession session = factory.openSession();
UserDao userDao =session.getMapper(UserDao.class );
User user= new User(20,"twl","唐舞麟","学院");
System.out.println(user);
userDao.add(user);
System.out.println(user);
session.commit();
session.close();
}
8.列明和属性名不一致
<resultMap id="StuMapper" type="com.ykq.entity.Student">
<!--主键的映射关系 column:列名 property:属性名-->
<id column="stu_id" property="id"/>
<!--普通列的映射关系-->
<result column="stu_name" property="name"/>
<result column="stu_age" property="age"/>
</resultMap>
<!--resultType和ResultMap二者只能用一个-->
<select id="findOne" resultMap="StuMapper">
select * from tb_stu where stu_id=#{id}
</select>
9.动态spl
(1)动态sql的标签
if, choose, foreach, where, set, trim
(2)choose
<select id="findOne" resultType="com.ykq.entity.Emp">
select * from account where 1=1
<choose>
<when test="name!=null and name!=''">
and name=#{name}
</when>
<when test="money!=null">
and money=#{money}
</when>
<otherwise>
and isdeleted=0
</otherwise>
</choose>
</select>
```
(3)where
<select id="findOne" resultType="com.ykq.entity.Emp">
select * from account
<where>
<if test="name!=null and name!=''">
and name=#{name}
</if>
<if test="money!=null">
and money=#{money}
</if>
</where>
</select>
(4)if
<select id="findOne" resultType="com.ykq.entity.Emp">
select * from account where 1=1
<if test="name!=null and name!=''">
and name=#{name}
</if>
<if test="money!=null">
and money=#{money}
</if>
</select>
(5)set
<update id="update">
update account
<set>
<if test="name!=null and name!=''">
name=#{name},
</if>
<if test="money!=null">
money=#{money},
</if>
<if test="isdeleted!=null">
isdeleted=#{isdeleted},
</if>
<if test="created!=null">
created=#{created},
</if>
<if test="updated!=null">
updated=#{updated},
</if>
</set>
where id=#{id}
</update>
(6)foreach
<1>查询
<select id="findByIds" resultType="com.ykq.entity.Emp">
select * from account where id in
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
<2>删除
<delete id="batchDelete">
<foreach collection="array" item="id" open="delete from account where id in(" close=")" separator=",">
#{id}
</foreach>
</delete>
<3>添加
<insert id="saveBatch">
insert into account(name,isdeleted) values
<foreach collection="list" item="acc" separator=",">
(#{acc.name},#{acc.isdeleted})
</foreach>
</insert>
10.mybatis映射文件处理特殊文字
<select id="findOne" resultType="com.ykq.entity.Emp">
<![CDATA[select * from account where id >#{min} and id <#{max}]]>
</select>
11.mybatis模糊查询
<select id="findByLike" resultType="com.ykq.entity.Account">
select * from account where name like '%${name}%'
</select>
public class Student {
private int id;
private String name;
private int age;
private String sex;
private Integer classId;
private Clazz clazz;
}
public class Clazz {
private Integer cid;
private String cname;
}
<resultMap id="baseMap" type="com.ykq.entity.Student">
<id column="stu_id" property="id"/>
<result column="stu_name" property="name"/>
<result column="stu_age" property="age"/>
<result column="sex" property="sex"/>
<result column="class_id" property="classId"/>
<association property="clazz" javaType="com.ykq.entity.Clazz">
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
</association>
</resultMap>
<select id="findStudentById" resultMap="baseMap">
select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=#{id}
</select>