文章目录
前言
有很多数据库连接操作例如JDBC,但是更为简便的、更为主流的还是mybatis。关于mybatis的初体验,可以从他的配置、思想以及一些简单的数据库操作案例入手。
一、mybatis的配置
1、首先创建一个maven项目、创建一些包以便方便后续操作。

2、引入依赖:在pom文件中添加所需要的坐标依赖:
mysql8的驱动、mybatis的驱动、做单元测试的junit、记录日志
3、配置mybatis:配置属性文件和映射文件
注:XML 文档的序言(Prolog)部分( XML 声明标签与 DOCTYPE 声明标签)一定不能写错,大家可以复制我给出的。
<?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="dao.HouseMapper">
<!--这里写 SQL 映射语句标签 -->
</mapper>
<?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">
MyBatis 全局配置文件( mybatis-config.xml )用于对 MyBatis 进行全局性的设置和配置,其核心功能在于环境配置:
数据库连接: 配置数据库连接的必要信息,像数据库驱动类、URL、用户名和密码等,以建立与数据库的连接。
事务管理: 指定事务管理的类型,如 JDBC 或 MANAGED,从而对事务的处理方式加以控制。
映射器配置
注册映射器: 将 Mapper 接口或者 XML 映射文件注册到 MyBatis 中,这样 MyBatis 才能识别并使用这些映射器。
。
记录日志的格式,要写在一个属性文件( log4j.properties )中,如下:
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=5
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
二、简单的查询与更新操作
1、封装执行日志的方法:
public static void logs(){
try {
Properties properties = new Properties();
FileInputStream fileInputStream = new FileInputStream("src/main/resources/config/log4j.properties");
properties.load(fileInputStream);
PropertyConfigurator.configure(properties);
} catch (IOException e) {
e.printStackTrace();
}
}
注:在使用FileInputStream获取配置文件时,需要它的相对路径(src下的)。
2、封装获取对象的方法:
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
try {
// 1.读取mybatis配置文件()
InputStream resourceAsStream = Resources.getResourceAsStream("config/mybatis-config0.xml");
// 2.获取sqlSession工厂对象
SqlSessionFactory buildFac = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 3.通过工厂获取对象
sqlSession = buildFac.openSession();
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
SqlSession 属于 MyBatis 里的核心接口,借助它能够执行 SQL 语句、管理事务等操作。
注:在使用getResourceAsStream获取配置文件时,需要它的绝对路径。
3、添加查询和更新的sql映射语句标签:
<select id="findAllDate" resultType="javabean.House">
select *
from house
</select>
<update id="insert">
insert into house
values (null, "可欣", "386", "广州", "3000", "0")
</update>
MyBatis 通过这些标签来定义具体的 SQL 操作,将 SQL 语句与 Java 代码进行解耦。它们都放置在 mapper 标签内部,mapper 就像是一个容器,集中管理这些 SQL 映射语句。
4、查询与插入代码展示:
api:
selectOne: 查询一条记录变更返回一个JavaBean
selectList: 查询整张表,返回一个list集合
update: 增删改都是用这个api(其实insert、delete也能用)
public void findAll () {
logs();
SqlSession sqlSession = getSqlSession();
// 执行映射文件中的sql语句
List<Object> objects = sqlSession.selectList("HouseMapper.findAllDate");
for(Object obj:objects){
System.out.println(obj);
}
}
注:查询操作本身不会对数据库数据进行修改,所以不需要通过提交事务来持久化数据变更。
public void insertData(){
logs();
SqlSession sqlSession = getSqlSession();
int update = sqlSession.update("HouseMapper.insert");
// 提交事务
sqlSession.commit();
System.out.println("update = " + update);
}
注:更新一定要提交事务,否则即使返回的update的值大于零,也没有真正对数据库进行插入操作。
三、多个属性的增删改查(动态)
1、查询某几个字段
<select id="select1" resultType="javabean.House">
select ${cols}
from house
</select>
public void select1(){
logs();
SqlSession sqlSession = getSqlSession();
HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("cols","name,tel,address");
List<Object> objects = sqlSession.selectList("HouseMapper.select1", objectObjectHashMap);
for(Object obj:objects){
System.out.println(obj);
}
}
这里使用的是Map键值对的方式存储数据,“cols”是键,后面的“name,tel,address,所以在映射文件文件中写的是cols,通过键取值。
2、动态插入一条数据
<update id="insert1">
insert into house
values (null, #{name}, #{tel}, #{address}, #{rent}, #{state})
</update>
public void insert1(){
logs();
SqlSession sqlSession = getSqlSession();
// 准备数据
HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("name","笑笑");
objectObjectHashMap.put("tel","789");
objectObjectHashMap.put("address","上海");
objectObjectHashMap.put("rent","5000");
objectObjectHashMap.put("state","1");
int update = sqlSession.update("HouseMapper.insert1", objectObjectHashMap);
sqlSession.commit();
System.out.println("update = " + update);
}
3、删除一条数据
<insert id="delete1">
delete
from house
where id = #{id}
</insert>
public void delete1(){
logs();
SqlSession sqlSession = getSqlSession();
int delete = sqlSession.delete("HouseMapper.delete1",5);
sqlSession.commit();
System.out.println("delete = " + delete);
}
4、更新一条数据中的某几个字段
<update id="update1">
update house
set tel=#{tel},
rent=#{rent},
state=#{state}
where id = #{id}
</update>
public void update1(){
logs();
SqlSession sqlSession = getSqlSession();
House house = new House();
house.setId(4);
house.setTel("655");
house.setRent("5000");
house.setState("1");
int update = sqlSession.update("HouseMapper.update1", house);
sqlSession.commit();
System.out.println("update = " + update);
}
注意这里的占位符#{ }、${ }
四、模糊查询、条件查询、批量删除sql构建的特殊语法
1、模糊查询
<!-- 模糊查询-->
<select id="selectName" resultType="javabean.House">
select *
from house
where name like #{name}
</select>
public void selectName(){
logs();
SqlSession sqlSession = getSqlSession();
HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("name","%小%");
List<Object> objects = sqlSession.selectList("HouseMapper.selectName", objectObjectHashMap);
for(Object obj : objects){
System.out.println(obj);
}
}
2、条件查询
<!-- 条件查询-->
<select id="selectRent" resultType="javabean.House">
select * from house where 1=1
<if test="minRent!=null">
and rent>#{minRent}
</if>
<if test="maxRent!=null">
and rent <![CDATA[<]]>#{maxRent}
</if>
</select>
这里要加一个1=1的原因是如果不加后面minRent不为空时,会在where后直接拼接一个and rent<?
public void selectRent(){
logs();
SqlSession sqlSession = getSqlSession();
HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("minRent",200);
objectObjectHashMap.put("maxRent",5000);
List<Object> objects = sqlSession.selectList("HouseMapper.selectRent", objectObjectHashMap);
for(Object obj : objects){
System.out.println(obj);
}
}
我的表中rent是varchar的,一开始写的添加键值对语句是objectObjectHashMap.put(“minRent”,“200”); objectObjectHashMap.put(“maxRent”,“5000”);
后来发现无法查询到我期望的数据,原因可能是将 String 类型按照字符编码规则进行比较,而不是按照数值大小比较。后来我填的是int类型,在传入整型虽然会自动转换,但也可能因为类型不匹配而引发错误。
3、批量删除
<!-- 批量删除-->
<delete id="deleteByIds">
delete from house where id in
<foreach collection="array" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</delete>
public void deleteByIds(){
logs();
SqlSession sqlSession = getSqlSession();
// 删除id为2、11的数据信息
int []arr={2,11};
int delete = sqlSession.delete("HouseMapper.deleteByIds", arr);
sqlSession.commit();
System.out.println("delete = " + delete);
}
222



被折叠的 条评论
为什么被折叠?



