一、MyBatis和Hibernate区别
MyBatis以sql语句得到对象
Hibernate以对象得到sql语句
二、使用MyBatis
1、添加依赖
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" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://ip:3306/test" />
<property name="username" value="username" />
<property name="password" value="password" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/UserMapper.xml"/>
</mappers>
</configuration>
3、创建映射实体类,mapper接口
4、添加mapper映射文件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="mybatis_test.mapper.UserMapper"> <!-- 对应mapper接口 -->
<select id="getUser" parameterType="int" resultType="mybatis_test.entity.User"> <!-- 对应mapper接口中方法 -->
SELECT *
FROM users where id =#{id}
</select>
</mapper>
5、测试
public class MyBatisTest {
public static void main(String[] args) throws IOException {
String resource = "mybatis.xml";
//读取配置文件
Reader reader = Resources.getResourceAsReader(resource);
//获取会话工厂
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(reader);
SqlSession openSession = build.openSession();
//查询语句
String sql = "mybatis_test.mapper.UserMapper.getUser";
//调用API查询
User user = openSession.selectOne(sql, 2);
System.out.println(user);
openSession.close();
}
}
三、sql注入问题
1、解决方法:预编译
2、#和$的区别:
#可以防止sql注入
$使用sql拼接方式
四、自动生成
使用Generator自动生成Dao接口,mapper映射文件,Entity类
mybatis-plus
1、依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
2、入门
定义mapper:
public interface UserMapper extends BaseMapper<User>
定义service:
public interface UserService extends IService<User>
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService
解释:BaseMapper,IService, ServiceImpl中定义了常用的接口
3、自定义Mapper
配置文件:UserMapper.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.example.mybatisplusdemo1.mapper.UserMapper">
<sql id="Base_Column_List">
id, name, age, email
</sql>
<select id="selectAllByName" resultType="com.example.mybatisplusdemo1.entity.User">
select <include refid="Base_Column_List" />
from user
where name = #{name}
</select>
</mapper>
默认配置文件路径:
resources/mapper
自定义配置文件路径:
mybatis-plus.mapper-locations=classpath:mapper/*.xml
4、常用注解
@TableName
@TableId
指定主键
@TableField
自动填充:
@Data public class User { private Long id; private String name; private String email; private Integer age; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; }
实现接口:
@Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } }
5、分页插件:详见官网文档
@Configuration @MapperScan("com.example.mybatisplusdemo1.mapper") public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }