目录
二,为实体类注册别名(优化SqlMapConfig.xml)
使用 typeAliases 标签,进行对pojo实体类的注册别名
4,添加jdbc.properties数据库配置文件到resources目录文件
7,添加mapper.xml的文件夹,新建与mapper.xml的namespace对应的接口,放在同一文件夹下
一,MyBatis框架常见类和接口
1,Resources类
解析SqlMapConfig.xml核心文件,将解析的文件保存在IO输入流中;
//1,使用文件流,读取核心配置文件SqlMapConfig.xml
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
2,SqlSessionFactory接口:创建工厂
//2,创建sqlSessionFactory,bean工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
3,SqlSession接口:获取sqlSession
//3,获取sqlSession
SqlSession sqlSession = factory.openSession();
二,为实体类注册别名(优化SqlMapConfig.xml)
使用 typeAliases 标签,进行对pojo实体类的注册别名
1,单个注册
<typeAliases>
<!-- 单个注册 -->
<typeAlias type="com.pojo.Stu" alias="stu"></typeAlias>
</typeAliases>
2,批量注册
<typeAliases>
<!-- 批量注册别名:起的别名是类名的驼峰命名法 -->
<package name="com.pojo"/>
</typeAliases>
三,设置日志输出
<!-- 设置日志输出底层执行代码 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
设置完底层代码输出的后的打印的日志
四,动态代理存在意义:
在三层架构中,业务逻辑层要通过接口来实现数据库的访问,动态代理可以实现
MyBatis动态代理的7个行为规范
1,UsersMapper.xml与UsersMapper.java的接口必须同一个目录下。
2,UsersMapper.xml与UsersMapper.java的文件名一致,后缀不管。
3,UsersMapper.xml文件中的标签的id值 与 UsersMapper.java的接口中的方法名称保持一致。(接口中的方法与id一致,就可以通过接口的名称找到对应的id)
4,UsersMapper.xml文件中的parameterType()标签中的参数类型 与 UserMapper.java接口中的参数类型完全一致
5,UsersMapper.xml文件中的resultType()标签中的值类型 与 UserMapper.java接口中的返回值的类型完全一致
6,UsersMapper.xml文件中的 nameSpace 标签中的值类型 与 UserMapper.java接口的完全限定名(即从当前java.main路劲触发的全路径名)。如:com.yyk.UserMapper.java
7,在SqlMapConfig.xml文件中注册mapper文件时,使用class= UserMapper.java接口的完全限定名。
五,动态代理的实现
1,创建数据库
use ssm;
create table if not EXISTS USER(
id int(11) not null auto_increment,
username VARCHAR(32) COMMENT '用户名',
birthday date DEFAULT null COMMENT '生日',
sex char(2) DEFAULT null COMMENT '性别',
address VARCHAR(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (id)
);
INSERT into USER(username,birthday,sex,address) VALUES('张三','2000-01-08','1','陕西');
INSERT into USER(username,birthday,sex,address) VALUES('李飒','2001-02-02','2','北京');
INSERT into USER(username,birthday,sex,address) VALUES('王五','2000-4-06','1','南京');
INSERT into USER(username,birthday,sex,address) VALUES('老六','2000-08-09','1','上海');
INSERT into USER(username,birthday,sex,address) VALUES('钱七','1999-03-01','2','广州');
INSERT into USER(username,birthday,sex,address) VALUES('王三','1990-12-12','1','深圳');
INSERT into USER(username,birthday,sex,address) VALUES('李八','1999-12-02','1','深圳');
INSERT into USER(username,birthday,sex,address) VALUES('王七','1999-02-12','1','深圳');
SELECT * FROM User;
2,完善maven工程目录,刷新可视化
3,修改pom.xml文件,添加依赖
<!--添加mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--添加mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
4,添加jdbc.properties数据库配置文件到resources目录文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=123456
5,新建并配置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>
<!--读取jdbc.properties文件-->
<properties resource="jdbc.properties"></properties>
<!--设置日志输出-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--注册实体类的别名-->
<typeAliases>
<package name="com.mybatis.pojo"/>
</typeAliases>
<!--配置环境变量-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<!--
private String driver;
private String url;
private String username;
private String password;
-->
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--注册mapper.xml文件-->
<mappers>
<mapper class="com.mybatis.mapper.UserMapper"></mapper>
</mappers>
</configuration>
6,添加实体类pojo
public class User {
private Integer id;
private String userName;
private Date birthday;
private String sex;
private String address;
7,添加mapper.xml的文件夹,新建与mapper.xml的namespace对应的接口,放在同一文件夹下
<mapper namespace="com.mybatis.mapper.UserMapper">
遵循动态代理的规范
8,新建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="com.mybatis.mapper.UserMapper">
<!--
//查询全部功能
List<User> getAll();
id与接口中的方法名一致
-->
<select id="getAll" resultType="user">
select id,username,birthday,sex,address
from user;
</select>
<!--
//按ID查询
User getID(int id);
-->
<select id="getID" parameterType="int" resultType="user">
select id,username,birthday,sex,address
from user
where id = #{id};
</select>
<!--
//按name模糊查询
List<User> getByName(String name);
-->
<select id="getByName" parameterType="string" resultType="user">
select id,username,birthday,sex,address
from user
where username like '%${name}%';
</select>
<!--
//更新
void update(User user);
-->
<update id="update" parameterType="user">
update user set username = #{userName},birthday = #{birthday},
sex = #{sex},address = #{address} where id = #{id};
</update>
<!--
//添加
void insert(User user);
-->
<insert id="insert" parameterType="user" >
insert into user (username,birthday,sex,address) values (#{userName},#{birthday},#{sex},#{address});
</insert>
<!--
//删除
void delete(int id);
-->
<delete id="delete" parameterType="int">
delete from user where id = #{id};
</delete>
</mapper>
9,添加测试功能。
package com.mybatis;
import com.mybatis.mapper.UserMapper;
import com.mybatis.pojo.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class MyTest {
//数据连接对象
SqlSession sqlSession;
//接口代理对象
UserMapper userMapper;
//设置日期转换
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
@Before
public void before() throws IOException {
//1,加载SQlMapConfig核心配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2,创建SQlSessionFactory()
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3,获取sqlSession
sqlSession = factory.openSession();
//4,取出动态代理的对象,
// 完成接口中方法的调用,实则是调用xml文件中向对应的标签的功能
//标签的id对应的是接口中的方法名,这是mybatis的动态代理规范。
userMapper = sqlSession.getMapper(UserMapper.class);
System.out.println("代理对象的类型"+userMapper.getClass());
}
@After
public void close(){
//5,释放资源
sqlSession.close();
}
@Test
public void testGetAll(){
//5,执行sql
List<User> users = userMapper.getAll();
users.forEach(user -> System.out.println(user));
}
@Test
public void testGetID(){
User user = userMapper.getID(2);
System.out.println(user);
}
//有问题
@Test
public void testGetByName(){
List<User> users = userMapper.getByName("j");
users.forEach(user -> System.out.println(user));
}
@Test
public void testInsert() throws ParseException {
int insert = userMapper.insert(new User("jj", format.parse("2000-01-03"), "1", "安徽"));
sqlSession.commit();
System.out.println("************" + insert + "***********");
}
@Test
public void testUpdate() throws ParseException {
User user = new User(1,"一二",format.parse("2012-03-08"),"1","BJ");
userMapper.update(user);
sqlSession.commit();
}
@Test
public void testDelete(){
userMapper.delete(1);
sqlSession.commit();
}
}
六,mapper注册优化
单个注册
<!--注册mapper.xml文件-->
<mappers>
<!--单个注册-->
<mapper class="com.mybatis.mapper.UserMapper"></mapper>
</mappers>
批量注册:
<!--注册mapper.xml文件-->
<mappers>
<!--单个注册-->
<!-- <mapper class="com.mybatis.mapper.UserMapper"></mapper>-->
<package name="com.mybatis.mapper"/>
</mappers>
七,#{} 和 ${}的区别
一),#{}:
是对非字符串拼接的占位符,{}中可以任意写,但是如果占位符是对象类型,则{}内必须是对象的属性名称,使用#{}是安全的,可以防止sql注入
#{}底层使用的PrepareStatement,防止安全注入
1,#{}内的内容主要是看parameterType(...)的类型,如果是基本数据类型或String类,则#{}内随便写。
因为:
2,#{}如果传入的是对象类型,则需要传入成员变量的名称,而且区分大小写
二), ${}:
90%进行的字符串拼接或字符串替换。如果传入的基本数据类型,${}里面必须是value,如果是对象类型,则传入对象名称。${}可以替换列名或列表,存在sql注入问题。
${}类型看 parameterType() 的内容
1,${}内的内容主要是看parameterType(...)的类型,如果是基本数据类型或String类,则${}内随便写。
2,${}如果传入的是对象类型,则需要传入成员变量的名称,而且区分大小写
优化模糊查询,以后都采用这种方式,解决sql注入
<select id="getByName" parameterType="string" resultType="user">
select id,username,birthday,sex,address
from user
-- where username like '%${name}%';
where username like concat('%',#{name},'%');
</select>
3,字串替换
使用${}来替换查询的列名
//按指定参数模糊查询
List<User> getByPara(@Param("columnName") String columnName, @Param("columnValue") String columnValue);
如果方法在参数个数 大于1个 mapper.xml文件中的parameterType参数类型不写
<select id="getByPara" resultType="user">
select id,username,birthday,sex,address
from user
where ${columnName} like concat('%',#{columnValue},'%');
</select>
public void testGetByPara(){
List<User> users = userMapper.getByPara("id", "2");
users.forEach((user -> System.out.println(user)));
}