一、搭建流程
总体项目结构:
1、Maven依赖
<!--jdbc配置-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
2、配置文件 Mybatis-config.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/ExampleMapper.xml"/>
</mappers>
</configuration>
3、封装MybatisUtils工具类
package com.zhanc.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
/**
* @ClassName MybatisUtils
* @Author Zhanc
* @Version 1.0
* @Date 2021/10/10 22:00
* @Description sqlSessionFactory
**/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String res="mybatis-config.xml";
InputStream inp= Resources.getResourceAsStream(res);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inp);
}catch (IOException e){
e.printStackTrace();
}
}
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
4、其他
- 基础的pojo对象:User.class
- 个人理解,dao包中一个接口对应一个map配置文件(当然可以选择使用注解,这在后面会进行解释)
二、CURD
1、接口(UserMapper.class):
public interface UserMapper {
List<User> getUserList();
User getUserById(int id);
List<User> getUserListByLimit(Map<String,Integer> map);
List<User> getUserListByRowBounds();
List<User> getUserListLike(String str);
int addUser(User user);
int delUser(int id);
int updateUser(User user);
}
2、配置文件(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.zhanc.dao.UserMapper">
<select id="getUserList" resultType="com.zhanc.pojo.User">
select * from tbl_temp
</select>
<select id="getUserById" parameterType="int" resultType="com.zhanc.pojo.User">
select * from tbl_temp where id = #{id}
</select>
<select id="getUserListByLimit" parameterType="map" resultType="com.zhanc.pojo.User">
select * from tbl_temp limit #{startIndex},#{pageSize}
</select>
<select id="getUserListByRowBounds" resultType="com.zhanc.pojo.User">
select * from tbl_temp
</select>
<select id="getUserListLike" parameterType="String" resultType="com.zhanc.pojo.User">
select * from tbl_temp where username like #{str}
</select>
<insert id="addUser" useGeneratedKeys="true" keyProperty="id" parameterType="com.zhanc.pojo.User" >
insert into tbl_temp(username,password,dept_id) values(#{username},#{password},#{dept_id})
</insert>
<update id="updateUser" parameterType="com.zhanc.pojo.User" useGeneratedKeys="true" keyProperty="id">
update tbl_temp set username=#{username},password=#{password} where id=#{id}
</update>
<delete id="delUser" parameterType="int">
delete from tbl_temp where id = #{id}
</delete>
</mapper>
3、使用示例(这里使用Junit进行测试)
@Test
public void getUserListTest() {
SqlSession session = MybatisUtils.getSession();
//方式一(推荐)
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
//方式二
//List<User> users = session.selectList("com.zhanc.dao.UserDao.getUserList");
for (User user : userList) {
System.out.println(user);
}
session.close();
}
三、CURD 使用注解
1、写法
public interface UserMapper {
@Select("select * from tbl_temp")
List<User> getUserList();
@Select("select * from tbl_temp where id = #{id}")
User getUserById(int id);
//多个参数可在每个参数前加上@Param,以@Param中的value为准
@Select("select * from tbl_temp where username = #{username} and password = #{password}")
User loginCheck(@Param("username") String username,@Param("password") String pwd);
@Insert("insert into tbl_temp(username,password,dept_id) values(#{username},#{password},#{dept_id})")
int addUser(User user);
@Delete("delete from tbl_temp where id=#{id}")
int delUser(int id);
@Update("update tbl_temp set username=#{username},password=#{password},dept_id=#{dept_id} where id=#{id}")
int updateUser(User user);
}
2、配置(mybatis-config)
<mappers>
<!--注意此处属性是class-->
<mapper class="com.zhanc.dao.UserMapper"/>
</mappers>
3、注意点
-
使用注解可以不需要xml配置,当然,也可以注解和xml同时使用,这取决于你和你的项目选择
-
注解非常方便,但面对复杂的语句将会显得非常混乱
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。 换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。
——摘自Mybatis官网
四、Map的使用
1、接口写法(UserMapper.class)
public interface UserMapper {
List<User> getUserListByLimit(Map<String,Integer> map);
}
2、配置文件(UserMapper.xml)
<mapper namespace="com.zhanc.dao.UserMapper">
<select id="getUserListByLimit" parameterType="map" resultType="com.zhanc.pojo.User">
select * from tbl_temp limit #{startIndex},#{pageSize}
</select>
</mapper>
五、模糊查询
1、接口写法(UserMapper.class)
public interface UserMapper {
List<User> getUserListLike(String str);
}
2、配置文件(UserMapper.xml)
<mapper namespace="com.zhanc.dao.UserMapper">
<select id="getUserListLike" parameterType="String" resultType="com.zhanc.pojo.User">
select * from tbl_temp where username like #{str}
</select>
</mapper>
六、日志工厂
Mybatis支持的日志工厂有:SLF4J、Apache Commons Logging、Log4j 2、Log4j、JDK logging
配置文件(Mybatis-config.xml):
<configuration>
<settings>
...
<setting name="logImpl" value="LOG4J"/>
...
</settings>
</configuration>
此处value可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING
在此我只选择其中的两个来演示:STDOUT_LOGGING和LOG4J
1、STDOUT_LOGGING
是标准的日志工厂,可以不需要额外导jar包或配置Maven
在配置文件(Mybatis-config.xml)settings节点中添加<setting name="logImpl" value="STDOUT_LOGGING"/>
再次运行即可
2、LOG4J
Log4j是Apache的一个开源项目,需要额外导jar包或配置Maven
-
Maven依赖:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
log.properties文件编写(看不懂直接copy即可):
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 log4j.rootLogger=DEBUG,console,file #控制台输出的相关设置 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=./log/com.zhanc.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
七、分页
1、使用SQL语句limit分页
- 接口写法(UserMapper.class)
public interface UserMapper {
List<User> getUserListByLimit(Map<String,Integer> map);
}
- 配置文件(UserMapper.xml)
<mapper namespace="com.zhanc.dao.UserMapper">
<select id="getUserListByLimit" parameterType="map" resultType="com.zhanc.pojo.User">
select * from tbl_temp limit #{startIndex},#{pageSize}
</select>
</mapper>
- 使用示例:
@Test
public void getUserListByLimitTest() {
SqlSession session = MybatisUtils.getSession();
UserMapper userDao = session.getMapper(UserMapper.class);
HashMap<String, Integer> map = new HashMap<>();
map.put("startIndex", 1);
map.put("pageSize", 3);
List<User> userList = userDao.getUserListByLimit(map);
for (User user : userList) {
System.out.println(user);
}
session.close();
}
2、使用RowBounds翻页(官方不推荐)
- 接口写法(UserMapper.class)
public interface UserMapper {
List<User> getUserListByRowBounds();
}
- 配置文件(UserMapper.xml)
<mapper namespace="com.zhanc.dao.UserMapper">
<select id="getUserListByRowBounds" resultType="com.zhanc.pojo.User">
select * from tbl_temp
</select>
</mapper>
- 使用示例
@Test
public void getUserListByRowBoundsTest() {
SqlSession sqlSession = MybatisUtils.getSession();
RowBounds rowBounds = new RowBounds(1, 2);
List<User> userList = sqlSession.selectList("com.com.zhanc.dao.UserDao.getUserListByRowBounds", null, rowBounds);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}