maven中导入依赖(父工程中写,子工程不需要再写)
<!--导入依赖-->
<dependencies>
<!-- mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--mybatis驱动-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--junit驱动-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<!-- 在 build 中配置 resources,来防止我们资源导出失败的问题 -->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
配置mybati核心配置文件(每个项目都需要)
<?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>
<!-- 引用db.properties配置文件 -->
<!-- <properties resource="db.properties"/>-->
<!--
development : 开发模式
work : 工作模式
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<!-- value属性值引用db.properties配置文件中配置的值 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&userUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="admin" />
</dataSource>
</environment>
</environments>
<!--每一个mapper.xml都需要mybatis核心配置文件中注册!-->
<mappers>
<mapper resource="com/web/dao/UserMapper.xml"/>
</mappers>
</configuration>
创建utils(每个项目都需要)
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用mybatis获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//有了sqlsessionfactory 就可以从中获取sqlsession
//sqlsession完全包含了面向数据库执行sql命令所需的所有方法
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
//创建UserMapper
//实现简单的增删改查,分页模糊查询
//模糊查询
List<User>getUserLike(String value);
//分页
List<User>getUserByLimit(Map<String,Integer> map);
//分页2(老方法)
List<User>getUserByRowBounds();
//查询全部用户
List<User>getUserList();
//根据ID查询用户
User getUserById(int id);
User getUserById2(Map<String,Object> map);
//insert一个用户
int addUser(User user);
//万能的map
int addUser2(Map<String,Object> map);
//修改用户
int updateUser(User user);
//删除用户
int deleteUser(int id);
配置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">
<!--namespace绑定一个对应的dao/mapper接口-->
<mapper namespace="com.web.dao.UserMapper">
<!--select 查询语句 -->
<!-- id=getUserList为UserMapper的方法|| sql语句返回值-->
<select id="getUserList" resultType="com.web.pojo.User">
select * from mybatis.user;
/*mybatis.user 需要IDEA连接数据库 不连接 可以直接写 表名user*/
</select>
<!--根据Id查询--> <!--传递参数类型-->
<select id="getUserById" parameterType="int" resultType="com.web.pojo.User">
<!--接收参数-->
select * from mybatis.user where id =#{id}
</select>
<select id="getUserById2" parameterType="map" resultType="com.web.pojo.User">
select * from mybatis.user where id=#{id} and name=#{name};
</select>
<!--添加--> <!-- User对象中的属性可以直接取出来 -->
<insert id="addUser" parameterType="com.web.pojo.User" >
insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd});
</insert>
<!--传递Map中的key-->
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id,name,pwd) values (#{userid},#{username},#{userpwd});
</insert>
<!--修改-->
<update id="updateUser" parameterType="com.web.pojo.User">
update mybatis.user set name=#{name },pwd=#{pwd} where id=#{id};
</update>
<!--删除-->
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id};
</delete>
<!--模糊查询-->
<select id="getUserLike" resultType="com.web.pojo.User">
select * from mybatis.user where name like #{value}
</select>
<!--分页查询-->
<select id="getUserByLimit" parameterType="map" resultType="com.web.pojo.User">
select * from mybatis.user limit #{startIndex},#{pageSize}
</select>
<!--分页查询2-->
<select id="getUserByRowBounds" resultType="com.web.pojo.User">
select * from mybatis.user
</select>
</mapper>
Test测试
@Test
//分页查询
public void getUserByLimit(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("startIndex",0);
map.put("pageSize",2);
List<User> userByLimit = mapper.getUserByLimit(map);
for (User us:userByLimit
) {
System.out.println(us);
}
sqlSession.close();
}
@Test
//分页查询2
public void getUserByRowBounds(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
//RowBounds实现
RowBounds rowBounds = new RowBounds(1, 2);
//通过java代码实现分页
List<User> userList = sqlSession.selectList(
"com.web.dao.UserMapper.getUserByRowBounds",null,rowBounds);
for (User us: userList
) {
System.out.println(us);
}
sqlSession.close();
}
@Test
//模糊查询
public void getUserLike(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList =mapper.getUserLike("%李%");
for (User us:userList
) {
System.out.println(us);
}
sqlSession.close();
}
@Test
public void test(){
//获取sqlsession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
//执行sql
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user:userList) {
System.out.println(user);
} } catch (Exception e) {
e.printStackTrace();
}finally {
//关闭sqlsession
sqlSession.close();
}
}
@Test
public void getUserByTd(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
@Test
public void getUserById2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id",2);
map.put("name","李四");
User us= mapper.getUserById2(map);
System.out.println(us);
sqlSession.close();
}
@Test
//增删改需要提交事务
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUser(new User(6,"思思","123123"));
/* User user=new User();
user.setId(6);
user.setName("四四");
user.setPwd("123456");
mapper.addUser(user);*/
//提交事务才能成功
sqlSession.commit();
sqlSession.close();
}
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("userid",5);
map.put("username","飒飒");
map.put("userpwd","2223");
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new User(4,"嘶嘶","123456"));
sqlSession.commit();
sqlSession.close();
}
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(6);
sqlSession.commit();
sqlSession.close();
}
注:没写完一个mapper都要到mabatis.xml中注册
<!--每一个mapper.xml都需要mybatis核心配置文件中注册!-->
<mappers>
<mapper resource="com/web/mapper/UserMapper.xml"/>
<!--通过class注册-->
<!--接口和xml必须同名 都在同一目录下-->
<!--<mapper class="com.web.mapper.UserMapper"></mapper>-->
<!--使用包扫描注册-->
<!--接口和xml必须同名 都在同一目录下-->
<!-- <package name="com.web.mapper"/>-->
</mappers>
<mapper namespace="com.web.dao.UserMapper"> namespace:绑定一个对应的mapper接口 <select id="getUserById" parameterType="int" resultType="com.web.pojo.User"> id:绑定的方法名跟接口中的一致 parameterType:传入参数类型 resultType:返回类型为pojo的user(可以起别名直接写别名)
<!--可以给实体类起别名-->
<typeAliases>
<package name="com.web.pojo"/>
</typeAliases>
resultMap:解决属性名和字段名不一致的问题
//根据ID查询用户
User getUserById(int id);
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">
<!--namespace绑定一个对应的dao/mapper接口-->
<mapper namespace="com.web.mapper.UserMapper">
<!--结果集映射-->
<resultMap id="UserMap" type="User">
<!--column数据库中的字段, property实体类中的属性-->
<!-- <result column="id" property="id"/>
<result column="name" property="name"/>-->
<result column="pwd" property="password"/>
</resultMap>
<!--解决属性名和字段名不一致的问题 resultMap-->
<select id="getUserById" resultMap="UserMap">
select * from mybatis.user where id =#{id}
</select>
</mapper>
开启DeBug(默认)
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
开启log4j
#将等级为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/web.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
在mabatis中开启注:在MyBatis中存在配置顺序
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
使用注解开发(简单多了😄)
//注解开发
@Select("select * from user")
List<User> getUsers();
@Select("select * from user where id=#{id}")
/*方法存在多个参数,所有参数前面必须加上 @Param("id")*/
User getUserByID(@Param("id") int id,@Param("name") String name);
@Insert("insert into user(id,name,pwd) values(#{id},#{name},#{password})")
int addUser(User user);
@Update("update user set name=#{name},pwd=#{password} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id=#{id}")
int deleteUser(@Param("id") int id);
就不需要xml了(但是只能实现简单的sql语句)
多对一(需要两个实体类Student/Teacher)
@Date(lombok)依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>
</dependencies>
student
@Data
public class Student {
private int id;
private String name;
//学生需要关联一个老师
private Teacher teacher;
}
teacher
@Data
public class Teacher {
private int id;
private String name;
}
接口StudengMapper
//多对一
//查询所有学生信息以及对应老师信息
// 按照查询嵌套处理
List<Student> getStudent();
//按照结果嵌套处理
List<Student> getStudent2();
TeacherMapper
@Select("select * from teacher where id =#{id}")
Teacher getTeacher(@Param("id") int id);
有两种处理方式(按照查询嵌套处理和按照结果嵌套处理)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.web.mapper.StudentMapper">
<!--查询所有学生信息
根据查询出来的学生tid 寻找对应的老师
按照查询嵌套处理-->
<resultMap id="StudentTeacher" type="Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!--复杂属性需要单独处理 对象:association 集合:collection -->
<association property="teacher" column="tid" javaType="Teacher"
select="getTeacher" />
</resultMap>
<select id="getStudent" resultMap="StudentTeacher">
select * from student;
</select>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id=#{id}
</select>
<!--=======================================================================-->
<!--按照结果嵌套处理-->
<select id="getStudent2" resultMap="StudentTeacher2">
select s.id sid,s.name sname,t.name tname
from student s,teacher t
where s.tid=t.id
</select>
<resultMap id="StudentTeacher2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
</mapper>
一对多(TeacherMapper)
//一对多
//获取所有老师
List<Teacher> getTeacher();
//获取指定老师下所有学生及老师信息
Teacher getTeacher(@Param("tid") int id);
//获取指定老师下所有学生及老师信息
Teacher getTeacher2(@Param("tid") int id);
同样也有两种方式
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.web.mapper.TeacherMapper">
<!--按结果嵌套查询-->
<select id="getTeacher" resultMap="TeacherStudent">
select s.id sid,s.name sname,t.name tname,t.id tid
from student s, teacher t
where s.tid=t.id and t.id=#{tid};
</select>
<resultMap id="TeacherStudent" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<!--集合用collection
javaType="" 指定属性的类型
集合中的泛型信息,我们使用ofType获取
-->
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
<!--==========================================================================-->
<!--按照查询嵌套处理-->
<select id="getTeacher2" resultMap="TeacherStudent2">
select * from teacher where id=#{tid}
</select>
<resultMap id="TeacherStudent2" type="Teacher">
<result property="id" column="id"/>
<result property="name" column="name"/>
<collection property="students" javaType="ArrayList" ofType="Student"
select="getStudentByTeacherId" column="id"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
select * from student where tid=#{tid}
</select>
</mapper>
动态sql
/*
动态sql
*/
//插入数据
int addBlog(Blog blog);
//查询博客
List<Blog>queryBlogIF(Map map);
List<Blog>queryBlogIFChoose(Map map);
//更新博客
int updateBlog(Map map);
//查询第1-2-3号记录
List<Blog> queryBlogForeach(Map map);
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.web.mapper.BlogMapper">
<insert id="addBlog" parameterType="blog">
insert into mybatis.blog (id,title,author,create_time,views)
values (#{id},#{title},#{author},#{createTime},#{views})
</insert>
<!--sql片段 可以引用-->
<sql id="select">
select * from mybatis.blog
</sql>
<!--if-->
<select id="queryBlogIF" parameterType="map" resultType="blog">
<include refid="select">
</include>
<where>
<if test="title !=null">
title=#{title}
</if>
<if test="author !=null">
and author =#{author}
</if>
</where>
</select>
<!--(choose)如果when这两项都不成立走下面otherwise条件*/-->
<select id="queryBlogIFChoose" parameterType="map" resultType="blog">
select * from mybatis.blog
<where>
<choose>
<when test="title !=null">
title=#{title}
</when>
<when test="author !=null">
and author=#{author}
</when>
<otherwise>
and views=#{views}
</otherwise>
</choose>
</where>
</select>
<!--set -->
<update id="updateBlog" parameterType="map" >
update mybatis.blog
<set>
<if test="title !=null">
title=#{title},
</if>
<if test="author !=null">
author=#{author}
</if>
</set>
<where>
id=#{id}
</where>
</update>
<!--foreach-->
<!--select * from blog where 1=1 and (id=1 or id=2 or id=3)-->
<!-- 在collection中传一个map集合
-->
<select id="queryBlogForeach" parameterType="map" resultType="blog">
select * from mybatis.blog
<where>
<foreach collection="ids" item="id" open="and (" close=")" separator="or">
id=#{id}
</foreach>
</where>
</select>
</mapper>
主要部分:if choose set foreach where(MyBatis可以自己判断是否要加and等)
开启二级缓存(Mabatis自带一级缓存)
<?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>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- <setting name="logImpl" value="LOG4J"/>-->
<!--使用全局缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
还需要在xml中开启
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.web.mapper.UserMapper">
<!--在当前mapper.xml中开启二级缓存-->
<cache eviction="FIFO"
flushInterval="60000"
size="521"
readOnly="true"/>
</mapper>