基本思路
1、导入依赖
2、编写数据库源配置
3、编写工厂工具类
4、编写实体类
5、编写mapper接口
6、设置例外路径,读取mapper.xml配置文件
7、编写sql代码调用sqlsession对象,实现增删改查
参考官网:https://mybatis.org/mybatis-3/index.html
一、mybatis
**1、建项目
一、使用细节,注意事项
1、mapper文件的映射
1).resource - 给全路径的*Mapper.xml。
例如:
<mappers>
<mapper resource="com/tan/dao/UserMapper.xml"/>
</mappers>
2).class - 接口实现完全限定名
例如:
<mappers>
<mapper class="com/tan/dao/UserMapper"/>
</mappers>
注意:
1、接口和mapper配置文件必须同名。
2、接口和mapper配置文件必须在同一个包下面
3).package - 扫描包注册
<mappers>
<mapper name="com.tan.dao"/>
</mappers>
注意:
1、接口和mapper配置文件必须同名。
2、接口和mapper配置文件必须在同一个包下面
2、@Param(“name”)注解
1).传递参数可以设置对应的值去适配数据库字段。
2).基本数据类型的参数或者String类型,需要加上。
3).引用类型不需要加
4).如果只有一个基本类型的话,可以忽略。
5).#{}与${}的区别。(#{}防止sql注入,pm,psm)
二、mybatis的实现
1、搭建流程
1)、导入依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
2)、编写mybatis.xml配置文件
(官网:https://mybatis.org/mybatis-3/zh/configuration.html#mappers)
<?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>
<!-- 引入外部配置文件-->
<properties resource="db.properties">
<property name="username" value="root"/>
</properties>
<!-- 给类型起别名-->
<typeAliases>
<typeAlias type="com.tan.pojo.User" alias="User"/>
</typeAliases>
<!-- 配置数据源-->
<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 class="com.tan.dao.UserMapper"/>
<!-- 通配注册-->
<!-- <mapper resource="com/tan/dao/*Mapper.xml"/>-->
</mappers>
</configuration>
3)、编写接口 - UserMapper
package com.tan.dao;
import com.tan.pojo.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
import java.util.Map;
public interface UserMapper {
/**
* 注解查询
* */
@Select("select * from user")
List<User> getUsers();
/**
* 多个参数用@Param注解标签
* */
//查询
@Select("select * from user where id=#{id}")
User getUserById(@Param("id") int id);
//新增
@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);
}
4)、UserMapper.xml映射文件
<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 绑定一个对应的Dao/Mapper接口-->
<!--id="getUserList" - 方法名
resultType="com.tan.pojo.User" - 返回类型全类名
异常:java.lang.ExceptionInInitializerErrorCause: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效。
1 - encoding="GBK" 解决:1 字节的 UTF-8 序列的字节 1 无效异常。
2 - encoding="utf-8" 解决:删除注释。
-->
<mapper namespace="com.tan.dao.UserMapper">
<select id="getUserList" resultType="com.tan.pojo.User">
select * from mybatis.user
</select>
<select id="getUserById" parameterType="int" resultType="com.tan.pojo.User">
select * from mybatis.user where id=#{id}
</select>
<insert id="addUser" parameterType="com.tan.pojo.User">
insert into mybatis.user(id,name,pwd)values(#{id},#{name},#{pwd})
</insert>
<update id="updateUser" parameterType="com.tan.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>
</mapper>
5)、工具类MybatisUtils.java
package com.tan.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;
//工具类sqlSessionFactory -->sqlSession
public class MybatisUtils {
//提升作用域
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//创建mybatis的工厂,初始化mybatis的配置。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//SqlSessionFactory创建的SqlSession实例,这个实例有更新SQL数据库的所有方法。
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
/*SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;*/
}
}
6)、实体类User.java
package com.tan.pojo;
//实体类
public class User {
//字段跟数据库一一对应
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd=" + pwd +
'}';
}
}
7)、测试类UserDaoTest.java
package com.tan.dao;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import com.tan.pojo.User;
import com.tan.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void test(){
//1、获取sqlSession对象
SqlSession sqlSession= MybatisUtils.getSqlSession();;
try {
//2、执行sql
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
List<User> userList =userMapper.getUserList();
/*
* //2.1 执行sql
* List<User> userList=sqlSession.selectList("com.tan.dao.UserDao.getUserList");
* */
//3、遍历集合
for (User user:userList
) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//4、关闭sqlSession,释放内存资源
sqlSession.close();
}
}
@Test
public void getUserById(){
SqlSession sqlSession=MybatisUtils.getSqlSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=userMapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
@Test
public void addUser(){
//获取对象初始化
SqlSession sqlSession=MybatisUtils.getSqlSession();
//获取接口类
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User num=userMapper.addUser(new User(5,"张张","1234"));
if (num!=null){
System.out.println("插入不为空!");
}
//提交事务
sqlSession.commit();
//关闭释放资源
sqlSession.close();
}
@Test
public void updateUser(){
//获取工具类
SqlSession sqlSession =MybatisUtils.getSqlSession();
//获取接口类
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//调用方法
userMapper.updateUser(new User(2,"钢铁侠","010101"));
//提交事务
sqlSession.commit();
//关闭
sqlSession.close();
}
@Test
public void deleteUser(){
//通过工具类获取连接和配置源的信息,并注册对象
SqlSession sqlSession=MybatisUtils.getSqlSession();
//通过反射获取类接口对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//传递参数给接口方法
userMapper.deleteUser(4);
//提交事务
sqlSession.commit();
//关闭连接
sqlSession.close();
}
}
三、mybatis的日志系统
1、实现步骤
1)、导入依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2)、mybatis-config.xml文件
需要在mybatis-config.xml核心配置文件里面配置相关属性
<!-- 日志工厂-->
<settings>
<setting name="logImpl" value="LOG4J"/>
<!-- <setting name="logImpl" value="STDOUT_LOGGING"/>-->
</settings>
3)、编写配置文件log4j.properties。
# priority :debug<info<warn<error
#you cannot specify every priority with different file for log4j
log4j.rootLogger=debug,stdout,info,debug,warn,error
#console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= [%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n
#info log
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.info.File=./src/com/hp/log/info.log
log4j.appender.info.Append=true
log4j.appender.info.Threshold=INFO
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#debug log
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.debug.File=./src/com/hp/log/debug.log
log4j.appender.debug.Append=true
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#warn log
log4j.logger.warn=warn
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.warn.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.warn.File=./src/com/hp/log/warn.log
log4j.appender.warn.Append=true
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#error
log4j.logger.error=error
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.error.File = ./src/com/hp/log/error.log
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
4)、创建实例对象
插入日志信息
public class UserDaoTest {
Logger logger = Logger.getLogger(UserDaoTest.class);
@Test
public void testLog4j(){
logger.info("info:进入了testLog4j");
logger.debug("info:进入了testLog4j");
logger.error("info:进入了testLog4j");
}
}