Mybatis
Necesita base:
- JDBC
- Mysql
- Conceptos básicos de Java
- Maven
- Junit
1. Introducción
1.1 Qué es Mybatis
- MyBatis es un excelente marco de trabajo de capa de persistencia que admite SQL personalizado, procedimientos almacenados y mapeo avanzado.
- MyBatis elimina casi todo el código JDBC y el trabajo de establecer parámetros y obtener conjuntos de resultados.
- MyBatis puede configurar y mapear tipos primitivos, interfaces y POJOs Java (Plain Old Java Objects) como registros en la base de datos a través de XML simple o anotaciones.
- MyBatis era originalmente un proyecto de código abierto iBatis de Apache . En 2010, este proyecto se migró de la base del software apache a [código de google] (https://baike.baidu.com/item/google code / 2346604), y pasó a llamarse MyBatis .
- Migrado a Github en noviembre de 2013 .
1.2, como obtener Mybatis
- Github:
1.3, resistencia
Persistencia de datos
- La persistencia es el proceso de transformar los datos del programa en un estado persistente y un estado transitorio.
- Memoria: se pierde cuando se apaga
- Base de datos (jdbc), persistencia de archivos io.
- En la vida: almacenamiento en frío, enlatado, fotos.
¿Por qué necesitamos perseverancia?
-
Hay algunos objetos que no se le pueden soltar.
-
La memoria es demasiado cara
1.4, la capa de persistencia
Capa de Dao, capa de servicio, capa de controlador
- El bloque de código para completar el trabajo de persistencia
- Los límites eran muy claros
1.5 ¿Por qué necesitas Mybatis?
-
Conveniencia
-
El código jdbc tradicional es demasiado complicado. Para simplificar, existe un marco, automatización
-
Ayude al programa a guardar los datos en la base de datos
-
No necesita mybatis. Es más fácil empezar.
-
ventaja:
- Simple y fácil de aprender: en sí mismo es pequeño y simple. Sin dependencias de terceros, la instalación más simple es solo dos archivos jar + configuración de varios archivos de mapeo sql. Es fácil de aprender y fácil de usar. A través de la documentación y el código fuente, puede comprender completamente sus ideas de diseño e implementación.
- Flexible: Mybatis no impone ninguna influencia sobre el diseño existente de la aplicación o base de datos. sql está escrito en xml, lo que es conveniente para una gestión y optimización unificadas. Todos los requisitos para operar la base de datos se pueden cumplir a través de la declaración sql.
- Desacoplamiento de SQL y código de programa: al proporcionar una capa DAO, la lógica empresarial y la lógica de acceso a datos se separan, lo que hace que el diseño del sistema sea más claro, más fácil de mantener y más fácil de probar unitariamente. La separación de sql y código mejora la mantenibilidad.
- Proporciona etiquetas de mapeo, admite mapeo entre objetos y campos de formato de base de datos.
- Proporcionar etiquetas de mapeo relacional de objetos y apoyar el establecimiento y mantenimiento de relaciones de objeto.
- Proporcione etiquetas xml, soporte para escribir SQL dinámico.
2. El primer programa Mybatis
Idea: construir un entorno -> importar Mybatis -> escribir código -> probar
3 、 CRUDO
1 、 espacio de nombres
El nombre del paquete en el espacio de nombres debe ser coherente con el nombre del paquete de la interfaz Dao / mapeador.
2 、 seleccionar
Selección, declaración de consulta:
- id: el nombre del método del espacio de nombres correspondiente
- resultType: el valor de retorno de la ejecución de la declaración sql
- parameterType: el tipo de parámetro de entrada del método abstracto
Proceso de implementación: los siguientes pasos son los mismos para insertar, modificar y eliminar
- Escribir métodos abstractos de interfaz
List<User> getUserInfo();
- Escriba la declaración SQL correspondiente en mapper.xml
<mapper namespace="com.kuber.dao.UserMapper">
<select id="getUserInfo" resultType="com.kuber.pojo.User">
select * from users
</select>
</mapper>
- prueba
@Test
public void getUserInfo(){
/*获取SqlSession*/
SqlSession sqlSession;
try {
/*获取SqlSession*/
sqlSession = MybatisUtils.getSqlSession();
/*执行sql*/
/*相当于 UserMapper mapper = new UserMapperImpl();*/
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUserInfo();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}finally {
MybatisUtils.closeSqlSession();
}
}
[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo de enlace anti-sanguijuela. Se recomienda guardar la imagen y subirla directamente (img-rfdhL4xD-1604566530913) (img \ execution result1.png)]
3 、 insertar
- Escribir métodos de interfaz
int addUser(User user);
- Escriba la declaración SQL correspondiente en mapper.xml
<insert id="addUser" parameterType="com.kuber.pojo.User">
insert into users values(#{uid},#{username},#{password})
</insert>
- prueba
@Test
public void addUser(){
/*增删改必须要提交事务*/
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(null,"tonyma","111");
int num = mapper.addUser(user);
if(num > 0){
System.out.println("插入成功");
}else {
System.out.println("插入失败");
}
/*提交事务*/
sqlSession.commit();
}finally {
MybatisUtils.closeSqlSession();
}
}
4 、 actualización
- Escribir métodos de interfaz
int updateUser(User user);
- Escriba la declaración SQL correspondiente en mapper.xml
<update id="updateUser" parameterType="com.kuber.pojo.User">
update users set username = #{username},password = #{password} where uid = #{uid}
</update>
- prueba
@Test
public void updateUser(){
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int num = mapper.updateUser(new User(7,"jackma","123456"));
if (num > 0){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
sqlSession.commit();
}finally {
MybatisUtils.closeSqlSession();
}
}
5 、 eliminar
- Escribir métodos de interfaz
int deleteUser(int id);
- Escriba la declaración SQL correspondiente en mapper.xml
<delete id="deleteUser" parameterType="int">
delete from users where uid = #{id}
</delete>
- prueba
@Test
public void deleteUser(){
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int num = mapper.deleteUser(9);
if (num > 0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
sqlSession.commit();
}finally {
MybatisUtils.closeSqlSession();
}
}
- ¡Las adiciones, eliminaciones y modificaciones deben confirmar la transacción!
6. Puntos propensos a errores
-
No coincida con las etiquetas incorrectas
-
mapeador de enlace de recursos, necesita usar la ruta
-
Los archivos de configuración del programa deben cumplir con las especificaciones
-
los recursos de maven no se exportan
Agregue el siguiente bloque de código en el archivo pom.xml
<!--在build中配置resours,来防止我们资源导出失败的问题--> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
7. Mapa universal
Suponiendo que nuestras clases de entidad, o tablas, campos o parámetros en la base de datos son demasiados, podemos usar Map
<insert id="addUser2" parameterType="map">
insert into users(uid,username,password) values(#{uid},#{uname},#{upwd})
</insert>
@Test
public void addUser2(){
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("uid",8);
map.put("uname","jacktony");
map.put("upwd","22333");
int counter = mapper.addUser2(map);
if (counter > 0){
System.out.println("插入成功!");
}else {
System.out.println("插入失败!");
}
sqlSession.commit();
}finally {
MybatisUtils.closeSqlSession();
}
}
8. Pensando
¿Cómo escribir una consulta difusa?
- Cuando se ejecuta el código Java, pase el comodín %%
- Utilice comodines en el empalme de SQL (tenga en cuenta para evitar la inyección de SQL)
<select id="getLikeUserInfo" parameterType="string" resultType="com.kuber.pojo.User">
select * from users where username like #{value}
</select>
@Test
public void getLikeUserInfo(){
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getLikeUserInfo("%han%");
for (User user : users) {
System.out.println(user);
}
}finally {
MybatisUtils.closeSqlSession();
}
}