Mybatis框架入门学习的简单总结
框架的使用简化了我们开发的难度,让我们能专注于功能的实现而不必被一些琐碎的事打扰。初次学习Mybatis,记录一下心得体会
不使用Mapper代理所需配置
- DTD约束就不做多说,jar包的添加
-properties 文件 db.properties 用于记录对数据库的连接的信息
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/你的数据库名?useSSL=false
jdbc.username = root
jdbc.password = 密码
- mybatis-cfg.xml全局配置文件,放置于src目录下即可,主要用于引入数据库配置文件,设置别名,配置环境,引入映射配置文件`
<?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-->
<properties resource="db.properties"/>
<!--设置别名-->
<typeAliases>
<typeAlias type="pojo.Users" alias="users"/>
</typeAliases>
<!--配置环境-->
<environments default="development">
<environment id="development">
<!--配置事务-->
<transactionManager type="jdbc"></transactionManager>
<!--配置数据源-->
<dataSource type="pooled">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射配置文件-->
<mappers>
<mapper resource="mapper/UsersMapper.xml"/>
</mappers>
</configuration>
- 映射配置文件,UsersMapper.xml,配置文件的名称要于mybatis-cfg.xml文件中设置的一样 UserMapper.xml 中主要用于编写对数据库操作的语句
UsersMapper.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="mapper.UsersMapper">
<!--这里写你要进行的数据库操作语句-->
</mapper>
SqlSession工具类
SqlSession相当于Connection对象,SqlSessionFactory相当于数据库连接池,多个连接池会导致数据库资源被快速消耗完 所以一般使用单例模式,即一个SqlSessionFactory 对应多个SqlSession
注意:sqlSessionFactory.openSession();默认设置的是手动提交事务,意味着你需要手动提交插入删除更新操作
//创建一个工具类用于封装SqlSession
public class MybatisUtils {
//确保进程每次都获取当前SqlSession
private static ThreadLocal<SqlSession> thread = new ThreadLocal<>();
private static SqlSessionFactory sqlSessionFactory = null;
static{
InputStream inputStream = null;
try{
//获取数据库连接信息以及配置映射信息
inputStream = Resources.getResourceAsStream("mybatis-cfg.xml");
}catch(Exception e){
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
//获取当前sqlSession
public static SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionThreadLocal.get();
if(sqlSession == null){
sqlSession = sqlSessionFactory.openSession();
sqlSessionThreadLocal.set(sqlSession);
}
return sqlSession;
}
//关闭当前sqlSession
public static void closeSqlSession(){
SqlSession sqlSession = sqlSessionThreadLocal.get();
if(sqlSession != null){
sqlSession.close();
sqlSessionThreadLocal.set(null);
}
}
}
数据库操作实现
- 如果使用pojo 或者map来传递参数,那么语句中的#{}要与pojo中对应字段名称或者map的key相同,如果只是单纯的一个参数可以不与之相同
<!--查询用户-->
<select id="selectAll" resultType="users">
select * from users
</select>
<!--查询用户通过id-->
<!--此处建议使用#{}而不是 ${},原因是#{}在预处理时会用占位符?代替,
${}不会,所以${}会有sql注入的风险-->
<select id="selectByUserID" resultType="users">
select * from users where userid=#{suiyi}
</select>
<update id="update">
update users set username = #{username}
,usersex = #{usersex} where userid = #{userid}
</update>
<!--使用map传递参并返回map对象-->
<select id="selectByUserNameAndUserSex" resultType="users">
select * from users where username = #{keyname} and usersex = #{keysex}
</select>
Dao层实现接口部分代码
/*
更新用户
*/
@Override
public void update(Users users) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
sqlSession.insert("mapper.UsersMapper.update",users);
}
@Override
public Map<Integer, Users> selectByNameAndSex(String username, String usersex) {
Map<String, String> map = new HashMap<>();
//与Mapper中的#{}一致
map.put("keyname",username);
map.put("keysex",usersex);
SqlSession sqlsession = MybatisUtils.getSqlSession();
//采用namespace+id的方式来获取Mapper中的语句
Map<Integer,Users> usersMap = sqlsession.selectMap("mapper.UsersMapper.selectByUserNameAndUserSex",map,"userid");
return usersMap;
}
值得注意的是selectMap方法第一个参数对应的是mapper里面的select语句的namespace+id,第二参数是传入的对象,第三个参数是返回的map对象的key,对应的是查询返回的表的一个字段。
Service层实现接口部分代码
@Override
public Map<Integer, Users> selectByUserNameAndUserSex(String username, String usersex) {
Map<Integer, Users> map = null;
try{
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao userDao = new UserDaoImpl();
map = userDao.selectByNameAndSex(username,usersex);
}catch (Exception e){
e.printStackTrace();
}finally {
MybatisUtils.closeSqlSession();
}
return map;
}
测试类
import Service.UserService;
import Service.UserServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pojo.Users;
import java.util.Map;
import java.util.Set;
public class Test {
private static final Logger logger = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
Map<Integer, Users> map = userService.selectByUserNameAndUserSex("liming","male");
Set<Integer> set = map.keySet();//获取所有的key
for(Integer key:set){
Users users = map.get(key);
logger.debug(users.getUserid()+" "+users.getUsername()+" "+users.getUsersex());
}
}
}
使用Mapper动态代理
使用Mapper动态代理就简单一点不用创建Dao层,使用和映射配置文件放在一起的同名接口作为Dao层
如果要使用Mapper动态代理则需要接口中的方法名和映射配置文件中的id相同才能调用
对于数据库的操作和不适用Mapper动态代理相同
只是Mapper动态代理通过获取SqlSession对象的getMapper方法来调用对应的接口方法
public class SelectAll {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
List<Users> list = usersMapper.selectAll();
list.forEach(users -> {
System.out.println(users);
});
}
}
日志的选择
由于在开发中,性能是比较重要的,所以我们一般不用IO操作,因为IO读取会降低程序的性能,同时用户也开不见,所以一般选择输出到日志,这里我用的是slf4j,当然,你也可以用log4j等等,根据个人喜好
日志等级分为4级
Debug:程序调试信息都可以debug输出
info:对用户有用的信息
warn:可能会导致错误的信息
error:发生错误的地方
配置
log4j.rootLogger=debug,console,logfile
### appender.console输出到控制台 ###
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=<%d> %5p (%F:%L) [%t] (%c) - %m%n
log4j.appender.console.Target=System.out
### appender.logfile输出到日志文件 ###
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=SysLog.log
log4j.appender.logfile.MaxFileSize=500KB
log4j.appender.logfile.MaxBackupIndex=7
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=<%d> %p (%F:%L) [%t] %c - %m%n
使用例子
private static final Logger logger = LoggerFactory.getLogger(你要使用日志的类);
//你的代码...
logger.debug("你要输出的内容");
以上就是Mybatis的简单入门使用,如有错误感谢指正