properties属性
需求:将数据库连接参数单独配置在db.properties中,只需要在db.properties中加载db.properties的属性值
在sqlMapConfig.XML中就不需要对数据库连接参数硬编码
将数据库连接参数支配置在db.properties中,原因,方便对参数进行统一管理,其他XML可以引用该db.properties
在src根目录下创建db.properties文件
db.properties代码如下:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sql_mybatis?serverTimezone=UTC
jdbc.username=root
jdbc.password=root
在sqlMapConfig.XML加载属性文件
接下来自行测试
附加
<properties resource="db.properties">
<!-- properties中还可以配置一些属性名和属性值-->
<!-- <property name="jdbc.driver" value=""/>-->
</properties>
注意:MyBatis将按照下面的顺序来加载属性
- 在
properties
元素体内定义的属性首先被读取 - 然后会读取
properties
元素中resource
或url
加载的属性,他会覆盖以读取的同名属性 - 最后读取
parameterType
传递的属性,他会覆盖以读取的同名属性
因此,通过parameterType
传递的属性具有最高优先级,resource
或url
加载的属性次之,最低优先级是parperties
元素体内定义的属性
typeAliases(别名)
需求
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型,需要resultType指定输入结果的映射类型
好处
如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发
之前写parameterType类型的时候,写int和java.long.Integer都可以,是因为int是java.long.Integer的别名
单个定义别名:
<typeAliases>
<!--针对单个别名定义
type:类型的路径
alias:别名
-->
<typeAlias type="com.mb.domain.User" alias="user" />
</typeAliases>
引用别名:
之前画红线的地方是:com.mb.domain.User
多个定义别名:
<typeAliases>
<!-- 批量定义别名-->
<!-- 指定报名,mybatis主动把扫描包中的类,自动定义别名,别名就是类型(首字母不分大小写)-->
<package name="com.mb.domain" />
</typeAliases>
将userMapper.xml中的resultType返回com.mb.domain.User的,都可以直接写成user或User
自行测试这里不再演示
最后附上全部代码
MyBatis配置文件sqlMapConfig.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>
<!-- 加载属性文件-->
<properties resource="db.properties">
<!-- properties中还可以配置一些属性名和属性值-->
<!-- <property name="jdbc.driver" value=""/>-->
</properties>
<!-- 别名定义-->
<typeAliases>
<!--针对单个别名定义
type:类型的路径
alias:别名
-->
<!-- <typeAlias type="com.mb.domain.User" alias="user" />-->
<!-- 批量定义别名-->
<!-- 指定报名,mybatis主动把扫描包中的类,自动定义别名,别名就是类型(首字母不分大小写)-->
<package name="com.mb.domain" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置数据库连接信息 -->
<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="com/mb/mapping/userMapper.xml" />
<!-- 注册UserMapper映射接口 -->
<mapper class="com.mb.mapping.UserMapperI" />
</mappers>
</configuration>
配置SQL语句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:命名空间 随便写,随便起名,保证命名空间唯一,建议写地址,包+文件名 -->
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用
-->
<mapper namespace="com.mb.mapping.userMapper">
<!-- 在映射文件中配置很多sql语句-->
<!-- 需求:通过id查询用户表的记录 -->
<!--通过select执行数据库查询
id:标识映射文件中的sql,
将sql语句封装到mappedStatement对象中,所以将id称为statement的id
parameterType:制定输入参数的类型,这里制定ing型
#{}表示一个占位符号
#{id}:其中的id表示接受输入的参数,参数名称就是id,如果输入参数就是简单类型,#{}中的参数名可以任意,可以value或其他名称
resultType:指定sql输入结果的所映射的Java对象,select指定resultType表示将单条记录映射成Java对象。
-->
<select id="getUser" parameterType="int" resultType="user">
select * from s_user where id=#{id}
</select>
<!-- 根据用户名称模糊查询用户信息,可能返回多条 -->
<!-- resultType:指定就是单条记录所映射的java对象类型 -->
<select id="findUserName" parameterType="String" resultType="User">
select * from s_user where name like '%${value}%'
</select>
<!-- 添加用户
parameterType:指定输入参数类型是pojo(包括用户信息) insert没有返回值-->
<insert id="insertUser" parameterType="User">
<!--
将插入数据的主键返回,返回到user对象中
SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用于自增主键
keyProperty:将查询到主键设置到parameterType指定对象的哪个属性
order:select LAST_INSERT_ID()执行顺序,相对于insert来说他的执行顺序(之后)
resultType:指定SELECT LAST_INSERT_ID()的结果类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into s_user(name,age,sex,birthday) values(#{name},#{age},#{sex},#{birthday})
</insert>
<!-- 更新用户 -->
<!-- 分析:
需要传入用户的id
需要传入用户的更新信息
parameterType指定user对象,包括id和更新信息,注意:id必须存在
#{id}:从输入user对象中获取id属性值
-->
<update id="updateUser" parameterType="User">
update s_user set name=#{name},age=#{age},sex=#{sex},birthday=#{birthday} where id=#{id}
</update>
<!-- 删除用户 -->
<!-- 根据id删除用户,需要输入id的值 -->
<delete id="deleteUser" parameterType="int">
delete from s_user where id=#{id}
</delete>
</mapper>
测试文件MyBatisFirst.java:
package com.mb.domain;
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;
import java.util.Date;
import java.util.List;
public class MybatisFirst {
//根据id查询用户信息,得到一条记录结果
public void findUserByIdTest() throws IOException {
//mybatis配置文件
String resource ="sqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
//创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
String statement="com.mb.mapping.userMapper.getUser";
//通过SqlSession操作数据库
//第一个参数:映射文件中statement的id,等于namespace+"."+statement的id
//第二个参数:指定和映射文件中所匹配的parameterType类型的参数
User user=sqlSession.selectOne(statement,1);
System.out.println(user);
//释放资源
sqlSession.close();
}
//根据用户名称模糊查询数据
public void findUserByNameTest() throws IOException{
//mybatis配置文件
String resource ="sqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
//创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
String statement="com.mb.mapping.userMapper.findUserName";
//list中的user和映射文件中resultType所指定的类型一致
List<User> list=sqlSession.selectList(statement,"三");
System.out.println(list);
//关闭会话
sqlSession.close();
}
//添加用户信息
public void insertUserTest() throws IOException{
//mybatis配置文件
String resource ="sqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
//创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
String statement="com.mb.mapping.userMapper.insertUser";
User user =new User();
user.setName("李红");
user.setAge(41);
user.setSex("女");
//在使用当前时间如果用new Date(),应当引用java.util.Date 如果用java.sql.Date会有问题
user.setBirthday(new Date());
//没有返回值,不用变量接收
sqlSession.insert(statement,user);
//提交事务
sqlSession.commit();
//显示返回id
System.out.println(user.getId());
//关闭会话
sqlSession.close();
}
//删除用户信息
public void deleteUserTest() throws IOException{
//mybatis配置文件
String resource ="sqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
//创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
String statement="com.mb.mapping.userMapper.deleteUser";
//将id传过去,删除用户。
sqlSession.delete(statement,6);
//提交事务
sqlSession.commit();
//关闭会话
sqlSession.close();
}
//更新用户
public void updateUserTest() throws IOException{
//mybatis配置文件
String resource ="sqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
//创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
String statement="com.mb.mapping.userMapper.updateUser";
User user =new User();
user.setId(8);
user.setName("wangwang");
user.setAge(14);
user.setSex("女");
//在使用当前时间如果用new Date(),应当引用java.util.Date 如果用java.sql.Date会有问题
user.setBirthday(new Date());
//没有返回值,不用变量接收
sqlSession.update(statement,user);
//提交事务
sqlSession.commit();
//关闭会话
sqlSession.close();
}
public static void main(String[] args) throws IOException {
/* 实例化MybatisFirst类 */
MybatisFirst mf=new MybatisFirst();
/* 通过id查询用户信息*/
mf.findUserByIdTest();
/* 通过name模糊查询用户信息*/
mf.findUserByNameTest();
/* 插入用户信息*/
//mf.insertUserTest();
/* 更新用户信息*/
//mf.updateUserTest();
/* 删除用户信息*/
//mf.deleteUserTest();
}
}