目录
基本用法
环境配置
导入jar包
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- 数据库依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
<scope>runtime</scope>
</dependency>
<!-- log4j⽇志依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
SqlMapConfig.xml文件
该文件放在类路径下,即resources文件夹下
<?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>
<!-- 配置 mybatis 的环境 -->
<environments default="mysql">
<!-- 配置 mysql 的环境 -->
<environment id="mysql">
<!-- 配置事务的类型 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置连接数据库的信息:⽤的是数据源(连接池) -->
<dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///<!--这里填数据库名-->?serverTimezone=GMT"/>
<property name="username" value="<!--账号-->"/>
<property name="password" value="<!--密码-->"/>
</dataSource>
</environment>
</environments>
<!-- 告知 mybatis 映射配置的位置 -->
<mappers>
<mapper resource="com/zzxx/dao/IUserDao.xml"/>
</mappers>
</configuration>
dao接口
package com.zzxx.dao;
import com.zzxx.domain.User;
import java.util.List;
public interface IUserDao {
/**
* 查询所有⽤户
* @return
*/
List<User> findAll();
//根据id查询
User findByID(int id);
//根据姓名查询
List<User> findByName(String name);
//查询全部的数量
int countAll();
//根据id删除
void deleteByID(int id);
//修改
void update(User user);
//新增
void insertUser(User user);
}
Mapper映射文件
位置根据SqlMapConfig.xml文件中映射配置的位置来,文件名需要和dao接口名一致
<?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.zzxx.dao.IUserDao">
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="com.zzxx.domain.User">
select * from user
</select>
<select id="findByID" parameterType="int" resultType="com.zzxx.domain.User">
select * from user where id = #{id}
</select>
<select id="countAll" resultType="int">
select count(*) from user
</select>
<delete id="deleteByID" parameterType="int">
delete from user where id = #{id};
</delete>
<insert id="insertUser" parameterType="com.zzxx.domain.User">
insert user (id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address})
</insert>
<update id="update" parameterType="com.zzxx.domain.User">
update user set username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} where id = #{id}
</update>
<select id="findByName" parameterType="String" resultType="com.zzxx.domain.User">
select * from user where username like "%"#{username}"%"
</select>
</mapper>
log4j.properties文件(不重要)
位置在类路径下
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
连接数据库
// 1.读取配置⽂件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 3.使⽤构建者创建⼯⼚对象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
// 4.使⽤ SqlSessionFactory ⽣产 SqlSession 对象
SqlSession session = factory.openSession();
// 5.使⽤ SqlSession 创建 dao 接⼝的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
// 6.使⽤代理对象执⾏查询所有⽅法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
// 7.释放资源
session.commit();
session.close();
in.close();
Mapper映射文件中sql语句的写法
属性分析
- id:方法名
- parameterType:输入类型
- resultType:返回值类型
增
<insert id="insertUser" parameterType="com.zzxx.domain.User">
insert user (id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address})
</insert>
删
<delete id="deleteByID" parameterType="Integer">
delete from user where id = #{aaa};
</delete>
改
<update id="update" parameterType="com.zzxx.domain.User">
update user set username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} where id = #{id}
</update>
查
<select id="findByName" parameterType="String" resultType="com.zzxx.domain.User">
select * from user where username like "%${username}%"
</select>
占位符
- #{}或${}中加参数名做占位符,#{}mybatis会预编译将其换成?,${}则是直接采用拼接
- #{}中的参数类型如果是String,会自动加上引号,而${}因为是拼接,所以需要在sql语句定义时在外面套上引号,因此,${}可能会有sql注入问题
- 如果参数是基本数据类型或者包装类,占位符中的内容可以随便填(老版本${}中只能填value),但如果是自定义类型,占位符里的名字必须和字段名一致(包括大小写)
总结
- 使用mybatis时注意两个xml文件存放的位置以及其中参数要和对应的dao接口还有方法绑定(使用全限定类名)
- update,delete,insert标签本质上都是使用update所以可以使用同一个标签
- 没有设置自动提交的话DML语句会自动回滚,所以得使用session.commit()方法提交
- 两种占位符使用要注意,有些时候不能sql注入的,一定不要使用${}