快速入门 Mybatis的官网:https://mybatis.org/mybatis-3/
MyBatis的开发步骤 添加MyBatis的坐标 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <properties > <project.build.sourceEncoding > UTF-8</project.build.sourceEncoding > <maven.compiler.encoding > UTF-8</maven.compiler.encoding > <java.version > 1.8</java.version > <maven.compiler.source > 1.8</maven.compiler.source > <maven.compiler.target > 1.8</maven.compiler.target > </properties > <dependencies > <dependency > <groupId > org.mybatis</groupId > <artifactId > mybatis</artifactId > <version > 3.4.5</version > </dependency > <dependency > <groupId > mysql</groupId > <artifactId > mysql-connector-java</artifactId > <version > 5.1.6</version > <scope > runtime</scope > </dependency > <dependency > <groupId > junit</groupId > <artifactId > junit</artifactId > <version > 4.12</version > <scope > test</scope > </dependency > <dependency > <groupId > log4j</groupId > <artifactId > log4j</artifactId > <version > 1.2.12</version > </dependency > </dependencies >
创建user数据表 1 2 3 4 5 6 7 8 9 10 CREATE TABLE `user ` ( `id` int (11 ) NOT NULL AUTO_INCREMENT, `username` varchar (255 ) DEFAULT NULL , `password` varchar (255 ) DEFAULT NULL , PRIMARY KEY (`id`) ) ENGINE= InnoDB AUTO_INCREMENT= 4 DEFAULT CHARSET= utf8mb4; INSERT INTO `user ` VALUES ('1' , '小唐' , '123' );INSERT INTO `user ` VALUES ('2' , '小张' , '456' );INSERT INTO `user ` VALUES ('3' , '小雨' , '789' );
编写User实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class User { var id: Int ? = null var username: String? = null override fun toString () : String { return "User{" + "id=" + id + ", username='" + username + '\'' + '}' } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public class User { private Integer id; private String username; public Integer getId () { return id; } public void setId (Integer id) { this .id = id; } public String getUsername () { return username; } public void setUsername (String username) { this .username = username; } @Override public String toString () { return "User{" + "id=" + id + ", username='" + username + '\'' + '}' ; } }
编写映射⽂件UserMapper.xml 1 2 3 4 5 6 7 8 9 <?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 ="user" > <select id ="findAll" resultType ="com.test.pojo.User" > select * from user </select > </mapper >
编写核⼼⽂件SqlMapConfig.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" ><configuration > <environments default ="development" > <environment id ="development" > <transactionManager type ="JDBC" > </transactionManager > <dataSource type ="POOLED" > <property name ="driver" value ="com.mysql.jdbc.Driver" /> <property name ="url" value ="jdbc:mysql://localhost:3306/zdy_mybatis" /> <property name ="username" value ="root" /> <property name ="password" value ="123456" /> </dataSource > </environment > </environments > <mappers > <mapper resource ="UserMapper.xml" /> </mappers > </configuration >
编写测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test @Throws(IOException::class) fun test1 () { val resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml" ) val sqlSessionFactory = SqlSessionFactoryBuilder().build(resourceAsStream) val sqlSession = sqlSessionFactory.openSession() val userList = sqlSession.selectList<User>("user.findAll" ) for (user in userList) { println(user) } sqlSession.close() }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test public void test1 () throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml" ); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> userList = sqlSession.selectList("user.findAll" ); for (User user : userList) { System.out.println(user); } sqlSession.close(); }
运行结果
!乱码解决
修改url为
1 jdbc:mysql://localhost:3306/zdy_mybatis?characterEncoding=utf8
效果
完善,添加新增方法
1 2 3 4 5 6 <insert id ="saveUser" parameterType ="com.terwergreen.pojo.User" > insert into user(id, username) values(#{id}, #{username}) </insert >
没有添加成功原因
未提交事务
解决
1 2 sqlSession.insert("user.saveUser" , user); sqlSession.commit();
更新
1 2 3 4 <update id ="updateUser" parameterType ="com.terwergreen.pojo.User" > update user set username=#{username} where id=#{id} </update >
删除
1 2 3 4 <update id ="deleteUser" parameterType ="java.lang.Integer" > delete from user where id=#{id} </update >
备注:只有一个参数的时候,参数名的占位符可以是任意字符,例如下面的语句也是正常的
1 2 3 4 <update id ="deleteUser" parameterType ="java.lang.Integer" > delete from user where id=#{abc} </update >
MyBatis的Dao层实现 传统开发方式
定义Dao层接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 interface IUserDao { @Throws(IOException::class) fun findAll () : List<User?>? }
1 2 3 4 5 6 7 8 9 10 11 12 13 public interface IUserDao { public List<User> findAll () throws IOException; }
DaoImpl实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class UserDaoImpl : IUserDao { @Throws(IOException::class) override fun findAll () : List<User> { val resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml" ) val sqlSessionFactory = SqlSessionFactoryBuilder().build(resourceAsStream) val sqlSession = sqlSessionFactory.openSession() val userList = sqlSession.selectList<User>("user.findAll" ) sqlSession.close() return userList } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class UserDaoImpl implements IUserDao { @Override public List<User> findAll () throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml" ); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> userList = sqlSession.selectList("user.findAll" ); sqlSession.close(); return userList; } }
测试
1 2 3 4 5 6 7 8 9 10 11 @Test @Throws(IOException::class) fun test5 () { val userDao: IUserDao = UserDaoImpl() val userList = userDao.findAll() for (user in userList) { println(user) } }
1 2 3 4 5 6 7 8 9 @Test public void test5 () throws Exception{ IUserDao userDao = new UserDaoImpl (); List<User> all = userDao.findAll(); for (User user : all) { System.out.println(user); } }
代理开发方式 Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接
口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper 接口开发需要遵循以下规范:
1) Mapper.xml 文件中的namespace 与mapper 接口的全限定名相同
2) Mapper 接口方法名和Mapper.xml 中定义的每个statement 的id 相同
3) Mapper 接口方法的输入参数类型和mapper.xml 中定义的每个sql 的parameterType 的类型相同
4) Mapper 接口方法的输出参数类型和mapper.xml 中定义的每个sql 的resultType 的类型相同
编写UserMapper接口
测试代理方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test @Throws(IOException::class) fun test5 () { val resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml" ) val sqlSessionFactory = SqlSessionFactoryBuilder().build(resourceAsStream) val sqlSession = sqlSessionFactory.openSession() val userDao = sqlSession.getMapper(IUserDao::class .java) val userList = userDao.findAll() for (user in userList) { println(user) } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @Test public void test5 () throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml" ); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); List<User> userList = userDao.findAll(); for (User user : userList) { System.out.println(user); } }
文章更新历史 2022/05/08 feat:新增Kotlin支持